>  기사  >  백엔드 개발  >  Python에서 패킷 캡처 및 데이터 처리를 위해 libpcap 라이브러리를 사용하는 방법

Python에서 패킷 캡처 및 데이터 처리를 위해 libpcap 라이브러리를 사용하는 방법

WBOY
WBOY앞으로
2022-11-01 14:10:135367검색

이 글은 Python에 대한 관련 지식을 제공합니다. libpcap 설치, libpcap 라이브러리 사용 등을 포함하여 패킷 캡처 및 데이터 처리에 libpcap 라이브러리를 사용하는 방법을 주로 소개합니다. 모두에게 도움이 되기를 바랍니다.

[관련 권장사항: Python3 비디오 튜토리얼 ]

python 버전: python 3.9

libpcap 버전: 1.11.0b7

python libpcap 라이브러리는 기본 C 언어용 개발 패키지입니다. 언어 libpcap 라이브러리 , 매우 우수한 성능의 기본 c 코드를 직접 사용하여 Python 애플리케이션에 액세스할 수 있는 unix c libpcap 라이브러리 API(win32 시스템에 제공되는 Npcap 및 WinPcap 포함)를 제공하는 것을 목표로 합니다.

Windows 10 환경에서 python3.9에 libpcap 라이브러리를 설치하고 사용하는 방법이 기록되어 있습니다(Linux 및 Mac 시스템은 Windows 참고).

pypi 주소: https://pypi.org/project/libpcap/

github 주소: https://github.com/karpierz/libpcap

1 libpcap 라이브러리를 설치합니다

. 1, 온라인 설치

pip를 사용하여 직접 설치:

pip install libpcap

기본적으로 최신 버전이 설치됩니다.

2. 오프라인 설치

2.1 오프라인 설치 파일 다운로드

pypi 페이지에서 소스 코드나 whl 파일을 찾을 수 있습니다.

2.2 오프라인 설치 수행

1) 소스 코드를 사용하여 설치할 수 있습니다.

파일을 현재 디렉터리에 추출한 다음 설치 명령을 실행합니다:

python -m pip install ./libpcap-1.11.0b7

2) 오프라인 설치를 위해 whl 파일을 사용할 수도 있습니다. 설치

설치 명령은 다음과 같습니다.

python -m pip install libpcap-1.11.0b7-py3-none-any.whl

2. libpcap 라이브러리 사용

1. pcap 라이브러리 가져오기 및 지정

import libpcap
libpcap.config(LIBPCAP="wpcap")

2.

tcpdump는 libpcap을 기반으로 구현되며, C 언어 libpcap의 문서는 tcpdump 공식 웹사이트에서 찾을 수 있습니다:

https://www.tcpdump.org/manpages/pcap.3pcap.html

다음은 Python의 일반적인 인터페이스에 대한 설명입니다.

2.1 네트워크 장치 인터페이스 가져오기

  • lookupdev(errbuf)

함수: 이 함수는 네트워크 장치를 찾는 데 사용되며 반환된 값은 open_live 함수에서 직접 호출할 수 있습니다.

매개변수:

errbuf는 오류 정보를 얻는 데 사용되는 C 언어 문자열 유형입니다.

사용 예:

import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
device = pcap.lookupdev(errbuf)
print(errbuf.value)
  • findalldevs(alldevs, errbuf)

기능: 이 기능은 모든 네트워크 장치를 찾는 데 사용됩니다.

매개변수:

alldevs는 발견된 모든 네트워크 장치 정보를 저장하는 데 사용되는 pcap_if_t 구조 포인터입니다.

errbuf는 오류 정보를 얻는 데 사용되는 C 언어 문자열 유형입니다.

사용 예:

import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
alldevs = ct.POINTER(pcap.pcap_if_t)()    
pcap.findalldevs(ct.byref(alldevs), errbuf)
print(alldevs[0].name)
pcap.freealldevs(alldevs)

2.2 패킷 캡처 인터페이스

  • open_live(device:bytes,snaplen:int,promisc:int,to_ms:int,errbuf)

기능: 이 기능은 네트워크를 여는 데 사용됩니다. 데이터를 캡처하는 장치

매개변수:

device는 API를 통해 얻을 수 있거나 수동으로 지정할 수 있는 네트워크 인터페이스의 이름입니다. 예: "eth0"

snaplen은 캡처된 데이터 패킷의 길이입니다. , 이는 65535

보다 클 수 없습니다. promiscuous 모드가 켜져 있는지 표시하는 데 사용됩니다. 1은 promiscuous 모드를 나타내고 다른 값은 non-promiscuous 모드를 나타냅니다.

to_ms는 대기할 시간(밀리초)을 나타냅니다. .이 시간 이후에는 데이터 패킷을 얻는 함수가 즉시 반환됩니다. 0은 데이터 패킷이 있을 때까지 기다리는 것을 의미합니다. Arrival

errbuf는 오류 정보를 얻는 데 사용되는 C 언어 문자열 유형입니다.

반환 값: pcap_t 유형 포인터를 반환합니다. 모든 후속 작업에서는 이 포인터를 사용해야 합니다.

사용 예:

import ctypes as ct
import libpcap as pcap
device = b'eth0' # linux 
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
handle = pcap.open_live(device,4096,1,1000,errbuf)
if errbuf.value:
    print("hanle error :",errbuf.value)
  • open_offline(fname: bytes,errbuf)

함수: 이 함수는 오프라인 패킷 캡처 파일을 여는 데 사용됩니다.

매개변수:

fname은 다음과 같은 파일 이름입니다. b"/tmp /test1.cap"

errbuf는 오류 정보를 얻는 데 사용되는 C 언어 문자열 유형입니다.

반환 값: pcap_t 유형 포인터를 반환합니다. 이 포인터는 모든 후속 작업에서 사용해야 합니다.

사용 예:

import ctypes as ct
import libpcap as pcap
errbuf = ct.create_string_buffer(pcap.PCAP_ERRBUF_SIZE + 1)
handle = pcap.open_offline(fname,errbuf)
if errbuf.value:
    print("hanle error :",errbuf.value)

2.3 데이터 패킷 획득 인터페이스

  • next(handle,pheader)

기능: 이 함수는 한 번에 하나의 패킷만 데이터 패킷을 얻는 데 사용됩니다.

매개변수:

handle为pcap_t类型指针

pheader为pcap_pkthdr结构体指针,可通过pkthdr函数创建

返回值:返回u_char类型指针,代表包数据,可使用struct.unpack函数解析

使用示例:

import libpcap as pcap
pheader = pcap.pkthdr()
packet = pcap.next(handle,pheader)

2.4 写文件接口

  • dump_open(handle,fname:bytes)

功能:该函数用于打开文件,存储获取到的数据包。

参数:

handle为pcap_t类型指针

fname为文件名称

返回值:返回pcap_dumper_t 类型指针,后面的所有操作都要使用这个指针。

使用示例:

import libpcap as pcap

fname = b"realtime1.cap"
fPcap = pcap.dump_open(handle,fname)
  • dump(handle,pheader,packet)

功能:该函数用于存储获取到的数据包。

参数:

handle为pcap_dumper_t类型指针

pheader为pcap_pkthdr结构体指针

packet是数据包

返回值:无返回值

使用示例:

fPcapUbyte = ct.cast(fPcap,ct.POINTER(ct.c_ubyte))
pcap.dump(fPcapUbyte,pheader,packet)
  • dump_flush(handle)

功能:该函数用于将缓存的数据刷到磁盘

参数:

handle为pcap_dumper_t类型指针

返回值:错误码,0代表成功,-1代表出错

2.5 资源释放接口

  • close(handle)

功能:释放pcap_t类型指针

参数:

handle为pcap_t类型指针

返回值:无返回值

  • dump_close(handle)

功能:释放pcap_dumper_t类型指针

参数:

handle为pcap_dumper_t类型指针

返回值:无返回值

3、典型使用场景

3.1、网卡实时抓包

可以使用libpcap库进行网卡实时数据抓包,这里进行简单的示例:

1)首先需要获取或指定抓包设备

方法1 :指定网卡接口名称

device = b'\Device\NPF_{BFDBF91E-9848-417D-B8AB-D3ED19990717}' # windows

device = b'eth0' # linux

Windows网卡接口名称可在wireshark的捕获界面看到,具体如下:

linux网卡名称获取:ifconfig

方法2 :使用lookupdev获取网卡接口名称

device = pcap.lookupdev(errbuf)

方法3 :使用findalldevs获取网卡接口名称

alldevs = ct.POINTER(pcap.pcap_if_t)()

pcap.findalldevs(ct.byref(alldevs), errbuf)

device =alldevs[0].name

2)使用open_live函数进行网卡抓包;

3)使用pkthdr函数创建header,获取包头信息(时间戳、包大小);

4)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换;

5)数据包(比如IP头)的解析可使用struct的unpack函数;

6)如果要将抓包数据存盘,可使用dump_open、dump、dump_flush系列函数进行操作,需要注意的是,dump_open函数的第二个参数必须是byte类型;

示例代码及运行效果:

3.2、离线数据解析

可以使用libpcap库进行离线抓包文件的解析,这里进行简单的示例:

1)首先需要使用open_offline函数打开pcap文件,需要注意的是,函数的第一个参数必须是byte类型;

2)使用pkthdr函数创建header,获取包头信息(时间戳、包大小);

3)使用next函数循环读取数据包,需要注意的是,获取的packet对象的contents是C语言类型,需要使用它ctypes的pointer函数进行转换;

4)数据包(比如IP头)的解析可使用struct的unpack函数;

示例代码及运行效果:

3.3、使用过滤条件抓包

网卡实时抓包和离线数据解析时,可以设置过滤条件,避免数据量过大。

过滤条件示例:

1) 过滤IP

  • host 过滤某个ip的所有包

host 8.8.8.8

  • src 过滤源ip

src 8.8.8.8

  • dst过滤目的ip

dst 8.8.8.8

2)过滤端口

  • port进行单个端口过滤

port 22

  • portange进行多个端口过滤

portange 1-1024

  • 可使用src或dst指定端口方向

src port 22

dst port 22

3)指定协议

tcp

udp

icmp

4)使用组合条件

  • and 进行与逻辑

src localhost and dst port 22

src localhost && dst port 22

  • or 进行或逻辑

port 80 or 22

port 80 || 22

샘플 코드 및 실행 효과:

[관련 권장 사항: Python3 비디오 튜토리얼 ]

위 내용은 Python에서 패킷 캡처 및 데이터 처리를 위해 libpcap 라이브러리를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제