2014-12-19 42 views
0

实施netfiler挂钩时,我一直在试图读取数据包内容。Netfilter:阅读应用程序级别的内容?

我可以正确过滤IP字段或TCP字段,但出于好奇心,我一直在尝试去更进一步,也显示应用程序级别有效内容的内容,失败。

我知道“防火墙在3级运行”的原理,所以这是正常的。

我的问题是:在技术方面,为什么sock_buffer似乎停止在TCP/UDP头?

这得到了IP报头:

ip_header = (struct iphdr*)skb_network_header(sock_buff); 

这得到TCP报头:

tcp_header = (struct tcphdr*)((char*)ip_header + sizeof(struct iphdr)); 

但是,如果我再这样做:

(char*) (tcp_header + 4*(tcp_header->doff))  //4*(tcp_header->doff) is size of tcp header 

和显示器,我看到基本测试(例如netcats发送'AAAA'),它根本不显示这些字符。

然后我的第二个问题是:如何在Linux模块级别访问我的数据包的其余部分?

编辑:

试图约阿希姆的建议,但也不工作!

print_payload(tcp_header + 4*(tcp_header->doff)); 

与print_payload之中:

void print_payload(void *s){ 

     char *payload; 
     int i; 
     payload = s; 

     for(i=0;i<8;i++){ 

      printk(KERN_INFO "%.2x|", payload[i]); 

     } 

     printk(KERN_INFO "\n"); 
    } 

,它显示奇怪的事情,如:

77 | 70 | 21 | ffffffc1 | 00 | 00 | 00 | 00 |

一旦我开始通过netcat的发送“Z”字......

回答

1

这是因为你应该做(char*) tcp_header + 4*(tcp_header->doff)(即丢弃除了周围的括号)。

上述表达式类型 - 将tcp_header转换为char*,并添加4*(tcp_header->doff)字节的偏移量。

您的代码将4*(tcp_header->doff) * sizeof(*tcp_header)字节的偏移量添加到指针,然后键入结果指针char*