如何在Linux中通过inode结构查找套接字端口?

时间:2015-04-08 05:18:32

标签: c linux linux-kernel linux-device-driver

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




感谢您的回答。

1 个答案:

答案 0 :(得分:1)

您可以使用导出的函数socket从结构file获取sock_from_file结构指针。

然后将其转换为tcp_sock,其中包含inet_connection_sock,其中包含inet_sock,其中包含sock(不要与socket混淆)包含sock_common。这两个端口号最终存储在inet_socksock_common中(好吧,这就是它在最近的内核版本中的工作方式)。

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