我正在用C语言编写一个内核模块,并尝试从TCP数据包的有效负载中获取Host字段,其中包含http请求头。我已经设法用FTP做了一些类似的事情(扫描有效负载并查找FTP命令),但我似乎不能做同样的事情并找到字段。
我的模块连接到POST_ROUTING钩子。到达该钩子的每个数据包(如果它的dst端口为80 )将被识别为HTTP数据包,因此我的模块开始解析它。
由于某些原因,我似乎无法获得主机线路(事实上,我只看到服务器HTTP 200 ok)
这些报头是否始终位于使用端口80的数据包上?如果是这样,那么解析这些packt的有效负载的最佳方法是什么?看起来一个字符接一个字符是一项很大的工作。有没有更好的办法?
谢谢
编辑:取得了一些进展。我从服务器收到的每个数据包,我都可以毫不费力地读取有效载荷。但我发送的每一个包--好像负载是空的。
我认为这是skb指针的问题,但我得到的TCP端口很好。就是看不懂这该死的有效载荷。这是我解析它的方式:
unsigned char* user_data = (unsigned char *)((int)tcphd + (int)(tcphd->doff * 4));
unsigned char *it;
for (it = user_data; it != tail; ++it) {
unsigned char c = *(unsigned char *)it;
http_command[http_command_index] = c;
http_command_index++;
}其中,tail:
tail = skb_tail_pointer(skb);指针在循环中根本不会前进。好像从一开始就是空的,我不知道为什么。请帮帮忙。
发布于 2016-06-06 17:56:00
我已经设法解决了这个问题。
使用this,我已经了解了如何解析所有数据包的有效负载。我希望这段代码能解释这个问题。
int http_command_offset = iphd->ihl*4 + tcphd->doff*4;
int http_command_length = skb->len - http_command_offset;
http_command = kmalloc(http_command_length + 1, GFP_ATOMIC);
skb_copy_bits(skb, http_command_offset , (void*)http_command, http_command_length);skb_cop_bits,只是将有效负载完全复制到我创建的缓冲区中。现在解析它非常简单。
https://stackoverflow.com/questions/37645390
复制相似问题