我正在用C编写内核模块,并尝试从TCP数据包的有效负载中获取Host字段,并携带http请求标头。 我已经设法用FTP做了类似的事情(扫描有效载荷并查找FTP命令),但我似乎无法做同样的事情并找到该字段。
我的模块已连接到POST_ROUTING挂钩。
进入该挂钩的每个数据包,如果它的dst端口为80,则被识别为HTTP数据包,因此我的模块开始解析它。
由于某种原因,我似乎无法获得HOST线(事实上,我只看到服务器HTTP 200确定)
这些标题总是在使用端口80的数据包上吗? 如果是这样,解析这些包装有效载荷的最佳方法是什么?看起来像char的char是很多工作。有没有更好的方法?
由于
编辑: 取得了一些进展。 我从服务器获得的每个数据包,我都可以毫无问题地读取有效负载。但我发送的每个数据包 - 就像有效载荷是空的一样。
我认为这是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 = skb_tail_pointer(skb);
指针在循环中根本没有前进。它就像从一开始就是空的或者什么,我无法弄清楚为什么。 求助。
答案 0 :(得分:0)
我设法解决了这个问题。
使用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,只是将有效负载完全复制到我创建的缓冲区中。现在解析它非常简单。