【问题标题】:Getting Host field from TCP packet payload从 TCP 数据包负载中获取主机字段
【发布时间】:2016-10-05 08:24:57
【问题描述】:

我正在用 C 语言编写一个内核模块,并尝试从 TCP 数据包的有效负载中获取主机字段,并携带 http 请求标头。 我已经设法用 FTP 做一些类似的事情(扫描有效负载并查找 FTP 命令),但我似乎无法做同样的事情并找到该字段。

我的模块已连接到 POST_ROUTING 挂钩。 进入该钩子的每个数据包,如果它的 dst 端口为 80,则被识别为 HTTP 数据包,因此我的模块开始解析它。
由于某种原因,我似乎无法获取 HOST 行(事实上,我只看到服务器 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 = skb_tail_pointer(skb);

指针在循环中根本不前进。就像它从一开始就是空的一样,我不知道为什么。 请帮忙。

【问题讨论】:

  • 那么 Wireshark 告诉你什么?
  • HTTP 200 ok 去端口 80?真的吗?
  • 我已经设法看到了带有wireshark的packts。 HTTP 200 不在端口 80 上,而是我用来创建 TCP 连接的端口。现在我可以看到数据包,但仍然无法解析它。
  • pcap 有什么问题?
  • TCP 是一个字节流。与 UDP 不同,TCP 没有消息边界的概念。 TCP 不保证任何给定的多字节值,无论是整数还是字符串,都将包含在单个 TCP 数据包中,它可能跨越数据包边界。你必须考虑到这一点。 FTP、HTTP,这些是 TCP 之上的应用层协议。您需要根据正在使用的协议的规则解析 TCP 有效负载,而不是单个数据包。因此,您必须将有效负载数据缓存到单独的缓冲区中,并在将新数据添加到缓冲区时解析缓冲区...

标签: c linux sockets tcp http-headers


【解决方案1】:

我已经设法解决了这个问题。

使用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,只需将有效负载完全复制到我创建的缓冲区中。现在解析它非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2011-05-17
    • 2022-08-17
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多