我正在从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函数的第一行。再一次,没有。这表明永远不会调用回调。
要证明问题与我的上限文件无关
使用示例和调试逐步编译libnids真是太痛苦了。那么你能告诉我一些关于为何没有调用回调的信息吗?
答案 0 :(得分:2)
因为没有人回答我:(我必须选择最痛苦的方式:编译libnids,然后逐步调试以查看wtf正在进行。
我尝试关闭-O2编译选项。
并查看应该调用tcp回调的位置。我发现了两个事实:
第一个由wireshark验证。而且我看到wireshark nofify tcp checksum offload
。我从wireshark的wiki中得到了解释:
大多数现代操作系统都支持某种形式的网络卸载, 其中一些网络处理发生在NIC而不是CPU上。 通常这是一件好事。它可以释放剩下的资源 系统,让它处理更多的连接。如果你想要 捕获流量它可能导致错误的错误和奇怪甚至 缺少交通。 校验和卸载 在支持校验和卸载的系统上,在传输之前就在NIC上计算IP,TCP和UDP校验和 电线。在Wireshark中,这些显示为标记为黑色的传出数据包 用红色文字和笔记[不正确,应该是xxxx(可能是由 “TCP校验和卸载”?)]。
第二个是因为libnids能够通过握手消息重新组合流。
突然之间,我想到的是,结合这两个事实导致结果输出什么都没有。
由于大多数ACK数据包都有错误的校验和。因此重新组合函数可以看到数据包被跳过。
禁用校验和后,我终于获得了tcp payload的输出。两天,我明白了!