从未在libnids示例中调用tcp_callback

时间:2014-12-03 17:08:25

标签: c tcp network-programming pcap libnids

我正在从pcap文件中提取http数据。我必须重新组装片段,所以我找到了nids lib。我在Mac OS 10.9.5 64bits中安装带有自制程序的libnids 1.24。

我尝试运行printall sample 。我修改了一些代码以适应我的环境,例如更改" nids.h" to,添加nids_params.filename = filename;打开脱机文件进行分析。

样品能够启动。但问题是它什么都不打印。

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

要证明问题与我的上限文件无关

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

使用示例和调试逐步编译libnids真是太痛苦了。那么你能告诉我一些关于为何没有调用回调的信息吗?

1 个答案:

答案 0 :(得分:2)

因为没有人回答我:(我必须选择最痛苦的方式:编译libnids,然后逐步调试以查看wtf正在进行。

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

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

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

第一个由wireshark验证。而且我看到wireshark nofify tcp checksum offload。我从wireshark的wiki中得到了解释:

  

大多数现代操作系统都支持某种形式的网络卸载,   其中一些网络处理发生在NIC而不是CPU上。   通常这是一件好事。它可以释放剩下的资源   系统,让它处理更多的连接。如果你想要   捕获流量它可能导致错误的错误和奇怪甚至   缺少交通。         校验和卸载        在支持校验和卸载的系统上,在传输之前就在NIC上计算IP,TCP和UDP校验和   电线。在Wireshark中,这些显示为标记为黑色的传出数据包   用红色文字和笔记[不正确,应该是xxxx(可能是由   “TCP校验和卸载”?)]。

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

突然之间,我想到的是,结合这两个事实导致结果输出什么都没有。

由于大多数ACK数据包都有错误的校验和。因此重新组合函数可以看到数据包被跳过。

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