Python에서 패킷 캡처 및 데이터 처리를 위해 libpcap 라이브러리를 사용하는 방법
이 글은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.
