2017-12-26 4 views
0

私はマルウェア検出システムの研究を行っています。感染したシステムの動作をモデル化するには、Pcapファイルから大量のパケットを処理し、それらをフロー(同じIPを持つパケットでソースと運命のポート)にグループ化し、それらのフローからいくつかの機能を抽出する必要があります。大量のネットワークパケットをPythonで処理する最善の方法は何ですか?

DPKTを使用して、パケットから情報を解析して読み込みます。私の質問は、グループ化プロセスを行う最も効率的な方法です。 PostgreSQLデータベースを使用して、パッケージの情報を持つフローが存在するかどうかを問い合わせて、フローに追加したり、新しいものを作成したりしています。しかし、私はこの方法が非常に非効率的だと思うので、私はメモリ内の構造を使用したり、データベースやその他のものを改善するような他の選択肢を求めています。

+0

です:あなたの問題を解決するために

一つの方法は、辞書のサブクラスであるCounterクラスを使用するだろうか? (lines/filesize) – hansaplast

+0

Pcapファイルは10K行から数百万に及ぶ可能性があります。 – p0kero

答えて

1

データがメモリに格納されている場合、ピューターdictのデータ構造は非常に効率的です(特にスピードが賢明です)。それはどのくらいのデータ

from collections import Counter 
grouped = Counter() 

with open('packets.txt') as f: 
    for line in f: 
     src_ip, src_port, dst_ip, dst_port = ... # extract the ip address 
     key = "{}--{}--{}--{}".format(src_ip, src_port, dst_ip, dest_port) 
     grouped[key] += 1 

most_common_combinations = grouped.most_common() 
+0

お返事ありがとうございます。私は、フローが4つのフィールド(IP src、IP dest、ポートsrc、ポートdest)で定義されているため、問題はもう少し複雑だと思います。さらに、私はPcapファイルが何百万ものパケットを持つ可能性があるので、メモリ内のデータを使用するかどうかはわかりません – p0kero

+0

ああ、一度に多くのフィールドでグループ化しますか?あなたはどうしますか?または、何らかのクラスタリングアルゴリズムを探していますか? – hansaplast

+0

はい、私はこれらのフィールドに同じ値を持つパッケージをグループ化する必要があります。私が今やっていることがあるため、これを行うための選択肢を求めています。 "flow"というテーブルを作成した後、私はテーブルにチェックを入れていますが、IP src、IP dest、ポートsrc、およびポートdestがパッケージ内のそれらのフィールドと等しいフローが存在するかどうかを調べます。 'yes'の場合​​はこの列のnumPackagesをインクリメントします);答えが「いいえ」であれば、これらの値を持つ新しいレジスタ(新しいフロー)を作成し、nunPackagesは1 – p0kero

関連する問題