c - 从 TCP 数据包负载中获取主机字段

标签 c linux sockets tcp http-headers

我正在用 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/

相关文章:

c - 总线错误 : 10 don't know why

c - 如何在 vector 范围内实现排序?

c++ - QNetworkAccessManager 在 libcrypto.so 的 lh_insert () 中崩溃

linux - 当另一端写入和关闭时,在 epoll 控制的非阻塞套接字上丢失字节

c - 有没有办法让我找到 C 标准库 malloc() 的源代码?

c - 为什么 c 中的 float 不能按应有的方式工作?

linux - 将标准输出中的数字插入标准输出中的字符串

c - NOP 字符 0x90 的 printf 在 x86_64 和 i686 上编译时不同

vb.net - catch SocketException

delphi - 在delphi中建立tcp ip连接时无法读取消息