我正在用 C 编写一个内核模块,并试图从 TCP 数据包的有效负载中获取主机字段,其中包含 http 请求 header 。 我设法用 FTP 做了类似的事情(扫描负载并查找 FTP 命令),但我似乎无法做同样的事情并找到该字段。
我的模块连接到 POST_ROUTING Hook 。
每个到达该 Hook 的数据包,如果它的 dst 端口为 80,就会被识别为 HTTP 数据包,因此我的模块开始解析它。
出于某种原因,我似乎无法获取 HOST 行(事实上,我只看到服务器 HTTP 200 ok)
这些 header 是否总是出现在使用端口 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 = skb_tail_pointer(skb);
指针在循环中根本不前进。就好像它从一开始就是空的什么的,我不明白为什么。 请帮忙。
最佳答案
我已经设法解决了这个问题。
使用 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,只是将有效负载完全复制到我创建的缓冲区中。现在解析它非常简单。
关于c - 从 TCP 数据包负载中获取主机字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37645390/