7

我正在尝试使用 pynids 库解析多个 pcap 文件,但只能解析第一个文件。我看到nids_unregister_tcplibnids中有一个函数,有帮助吗?不过,我在 pynids 中找不到该功能。

import nids


def handle_tcp_stream(tcp):
    print "In handle_tcp_stream"


def extract(pcap_file):
    nids.param("tcp_workarounds", 1)
    nids.param("pcap_filter", "tcp")         # bpf restrict to TCP only, note
    nids.param("scan_num_hosts", 0)          # disable portscan detection
    nids.chksum_ctl([('0.0.0.0/0', False)])  # disable checksumming

    nids.param("filename", pcap_file)
    nids.init()
    nids.register_tcp(handle_tcp_stream)

    try:
        nids.run()
    except Exception, e:
        print "Exception ", pcap_file + " ", e


def main():
    extract("a.pcap")
    print "Done"
    extract("a.pcap")


if __name__ == "__main__":
    main()

这是输出:

In handle_tcp_stream
In handle_tcp_stream
In handle_tcp_stream
In handle_tcp_stream
Done
4

1 回答 1

4

绑定似乎写错了。

Perl 对应方过去也遇到过这个问题:https ://rt.cpan.org/Public/Bug/Display.html?id=51107

基本上可以总结为:

...libnids 在 run() 完成后清理并删除其回调。

这里的错误似乎相似https://github.com/MITRECND/pynids/blob/master/nidsmodule.c#L533

我可能弄错了,但是else当 anFP之前定义时,它会错过实际注册。那个else身体应该永远被处决。所以一个快速的解决方法是:

https://github.com/soulseekah/pynids/commit/8d420e88dbdc340f309db9db7c3b9c2508b1cb80

我对我的 Python API 有点生疏,但我认为PyObject_Del应该是这样Py_DECREF。虽然它也适用于删除。

观看https://github.com/MITRECND/pynids/pull/2了解更多进展,我相信他们会找到更正确的方法来解决这个问题。同时,我所做的暂时应该可以正常工作。

太糟糕了,没有任何单元测试来查看是否一切正常。

于 2013-11-30T14:34:29.797 回答