我正在编写一个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);
}
}

感谢您的回答。
答案 0 :(得分:1)
您可以使用导出的函数socket
从结构file
获取sock_from_file
结构指针。
然后将其转换为tcp_sock
,其中包含inet_connection_sock
,其中包含inet_sock
,其中包含sock
(不要与socket
混淆)包含sock_common
。这两个端口号最终存储在inet_sock
和sock_common
中(好吧,这就是它在最近的内核版本中的工作方式)。
以可靠的方式利用这些事实将是困难的。所有这些的布局和组织都与内核版本密切相关,当然文件描述符实际上代表了连接的TCP套接字。