如何在 Linux 中通过 inode 结构查找套接字端口?
How to find socket port by inode struct in Linux?
我正在编写一个 LKM 程序来挂钩 sys_read
函数以重用 80 TCP 端口。
但是我遇到一个问题是我不知道如何通过 inode
结构访问端口。
有一部分是我的程序。
Linux.2.6.3.38
asmlinkage ssize_t new_read(unsigned int fd, void *buf, size_t count){
//printk("PID %d called sys_read !\n",current->pid);
char kbuf[MAX_BUF];
ssize_t ret;
struct file *file;
ret=orig_read(fd, buf, count);
memset(kbuf, 0,MAX_BUF);
memcpy(kbuf, buf, ret);
printk("kbuf:%s\n",kbuf);
if( memcmp(kbuf, passwd, strlen(passwd)) == 0 )
{
file = fget(fd);
if(file->f_dentry->d_inode->???? == PORT)
printk("get http message\n");
fput(file);
}
}
感谢您的回答。
您可以使用导出函数sock_from_file
从结构体file
中获取socket
结构体指针。
然后被转换为 tcp_sock
,其中包含一个 inet_connection_sock
,其中包含一个 inet_sock
,其中包含一个 sock
(不要与 [=10 混淆) =]) 其中包含 sock_common
。这两个端口号最终存储在 inet_sock
和 sock_common
中(嗯,这就是它在最近的内核版本中的工作方式)。
以可靠的方式利用这些事实是很困难的。所有这些的布局和组织都与内核版本密切相关,当然文件描述符实际上代表一个连接的 TCP 套接字。
我正在编写一个 LKM 程序来挂钩 sys_read
函数以重用 80 TCP 端口。
但是我遇到一个问题是我不知道如何通过 inode
结构访问端口。
有一部分是我的程序。
Linux.2.6.3.38
asmlinkage ssize_t new_read(unsigned int fd, void *buf, size_t count){
//printk("PID %d called sys_read !\n",current->pid);
char kbuf[MAX_BUF];
ssize_t ret;
struct file *file;
ret=orig_read(fd, buf, count);
memset(kbuf, 0,MAX_BUF);
memcpy(kbuf, buf, ret);
printk("kbuf:%s\n",kbuf);
if( memcmp(kbuf, passwd, strlen(passwd)) == 0 )
{
file = fget(fd);
if(file->f_dentry->d_inode->???? == PORT)
printk("get http message\n");
fput(file);
}
}
感谢您的回答。
您可以使用导出函数sock_from_file
从结构体file
中获取socket
结构体指针。
然后被转换为 tcp_sock
,其中包含一个 inet_connection_sock
,其中包含一个 inet_sock
,其中包含一个 sock
(不要与 [=10 混淆) =]) 其中包含 sock_common
。这两个端口号最终存储在 inet_sock
和 sock_common
中(嗯,这就是它在最近的内核版本中的工作方式)。
以可靠的方式利用这些事实是很困难的。所有这些的布局和组织都与内核版本密切相关,当然文件描述符实际上代表一个连接的 TCP 套接字。