3

我正在从 pcap 文件中提取 http 数据。我必须重新组装片段,所以我找到了nids lib。我在 Mac os 10.9.5 64 位中安装了 libnids 1.24 和 homebrew。

我尝试运行printall 示例。我稍微修改了代码以适应我的环境,例如将 "nids.h" 更改为 ,添加 nids_params.filename = filename; 打开离线文件进行分析。

样本能够启动。但问题是它什么也没打印。

我将 print 添加到 tcp_callback 函数的第一行。再次,什么都没有。这表明永远不会调用回调。

证明问题与我的 cap 文件无关

  • 我将其设置为捕获实时数据包。打开网页后,我什么也得不到。
  • 我自己用 libpcap 解析 pcap 文件并得到很多 tcp 数据包。
  • 数据包的数量是 70k+。握手时不太可能没有完整的 tcp 连接。

用样例编译 libnids 并一步步调试是一件很痛苦的事。那么你能给我一些关于为什么不调用回调的信息吗?

4

1 回答 1

2

由于没有人回答我:(我不得不选择最痛苦的方式:编译libnids,然后一步一步调试,看看wtf是怎么回事。

我尝试关闭 -O2 编译选项。

并查看应该调用 tcp 回调的位置。我发现两个事实:

  • 一些数据包的校验和是错误的。
  • 它只是找到一个 tcp 流并添加一个新连接,因为没有看到 ACK。

第一个由wireshark验证。我看到wireshark通知我tcp checksum offload。我从wireshark的wiki得到解释:

大多数现代操作系统都支持某种形式的网络卸载,其中一些网络处理发生在 NIC 而不是 CPU 上。通常这是一件好事。它可以释放系统其余部分的资源并让它处理更多连接。如果您尝试捕获流量,则可能会导致错误错误和奇怪甚至丢失的流量。校验和卸载 在支持校验和卸载的系统上,IP、TCP 和 UDP 校验和在它们在线传输之前在 NIC 上计算。在 Wireshark 中,这些显示为用红色文本标记为黑色的传出数据包,并且注释 [不正确,应该是 xxxx(可能是由“TCP 校验和卸载”引起的?)]。

第二个是因为 libnids 能够通过握手消息重新组合流。

突然之间,我想到将这两个事实结合起来,结果什么也没有输出。

由于大多数 ACK 数据包都有错误的校验和。因此,在重新组装功能可以看到数据包之前,它会被跳过。

禁用校验和后,我终于得到了 tcp payload 的输出。两天,我明白了!

于 2014-12-05T08:05:27.627 回答