2013-11-21 25 views
7

我想使用pynids庫解析多個pcap文件,但只能解析第一個文件。我看到在libnids中有一個函數nids_unregister_tcp,會有幫助嗎?儘管如此,我無法在pynids中找到該功能。在多個pcap上使用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

寫入綁定錯誤似乎。

Perl的對口還曾有過在過去的這個問題:https://rt.cpan.org/Public/Bug/Display.html?id=51107

基本上它可以來概括:

... libnids清理並刪除其回調運行一次()是 完成。

的錯誤似乎是在這裏https://github.com/MITRECND/pynids/blob/master/nidsmodule.c#L533

我可能是錯誤的相似,但else也使它錯過當FP早先定義的實際註冊。那else身體應該總是被執行。所以速戰速決是:

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

我對我的Python API有點生疏,但我認爲PyObject_Del應該是Py_DECREF代替。儘管它也適用於刪除。

觀看https://github.com/MITRECND/pynids/pull/2獲得更多進展,我相信他們會找出一個更正確的方法來解決這個問題。同時,我所做的工作應該暫時保持良好狀態。

太糟糕了,沒有任何單元測試,看看是否一切正常。

+0

謝謝你的工作。出於某種原因,快速修復似乎不適用於此處提供的0.6.1版本:https://oberheide.org/pynids/但是,您的github上的代碼工作正常。 – Phani

+0

@Phani,我測試了這兩個補丁,都工作正常。你是否修補過'ndismodule.c'文件,然後在其上運行'python setup.py install'?嘗試完全從lib路徑中刪除庫並重新安裝,應該可以工作。 – soulseekah