2017-12-26 10 views
0

악성 코드 탐지 시스템에 대한 연구를하고 있습니다. 감염된 시스템의 행동 모델을 만들려면 Pcap 파일에서 많은 양의 패킷을 처리해야하며 플로우 (동일한 IP를 가진 패킷을 소스와 운명의 포트)에 그룹화 한 다음 해당 플로우에서 일부 기능을 추출해야합니다.파이썬에서 대량의 네트워크 패킷을 처리하는 가장 좋은 방법은 무엇입니까?

DPKT를 사용하여 패킷의 정보를 구문 분석하고 읽습니다. 제 질문은 그룹화 프로세스를 수행하는 가장 효율적인 방법에 관한 것입니다. PostgreSQL 데이터베이스를 사용하여 패키지의 정보가있는 플로우가 존재하는지 쿼리하고 플로우에 추가하거나 새 플로우를 작성합니다. 그러나이 방법은 매우 비효율적이라고 생각합니다. 그래서 메모리 내 구조를 사용하거나 데이터베이스 또는 다른 것을 개선하는 것과 같은 다른 대안을 요구합니다.

+0

이다 : 당신의 문제를 해결하기

한 가지 방법은 DICT의 하위 클래스 인 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, port src, port dest. 또한, Pcap 파일이 수백만 개의 패킷을 가질 수 있기 때문에 메모리에 데이터를 사용하는 것은 확실하지 않습니다. – p0kero

+0

아, 한 번에 여러 필드로 그룹화 할 수 있습니까? 어떻게 그럴 수 있니? 아니면 어떤 종류의 클러스터링 알고리즘을 찾고 있습니까? – hansaplast

+0

예, 필자는 해당 필드에 동일한 값을 가진 패키지를 그룹화해야하며 현재 수행중인 작업을 수행 할 수있는 대안을 요청하고 있습니다. "flow"라는 테이블을 만든 다음 모든 패키지에 대해 나는 그것이 이미 IP src, IP dest, 포트 src 및 패키지의 해당 필드와 동일한 포트 dest가있는 플로우가 존재하는지 테이블에서 확인합니다. 응답이 '예'이면이 레지스터의 열 numPackages를 증가시킵니다 (이 플로우); 만약 대답이 '아니오'라면, 나는 그 값들과 nunPackages가 1 – p0kero