이상한 코딩 나라의 혜돌이
[Python] Scapy를 이용해서 custom packet header 정의하기 2 [receive.py 편] 본문
Study/Network
[Python] Scapy를 이용해서 custom packet header 정의하기 2 [receive.py 편]
혜돌이 2020. 4. 25. 01:35패킷을 예쁘게 만들어서 보냈으면 당연히 받을 때도 예쁘게 받아줘야 한다.
물론 그냥 scapy에서 제공하는 hexdump(pkt) 또는 pkt.show()로 볼 수도 있지만, 그러면 필드값 추출하기가 너무 너무 너무 너무 까다로워진다.
send.py 짜는 법은 여기에서 확인
1. send.py에서 정의한 그대로 커스텀 헤더를 작성해 준다
class custom_header(Packet):
"""Custom Header"""
name = "custom header"
fields_desc = [
BitField("field1", 0, 16), # BitField("field_name", initial value, byte_length)
BitField("field2", 0, 8),
BitField("field3", 0, 8)
]
2. 프로토콜 스택 중 커스텀 헤더가 오는 자리에 바인딩을 해 준다
bind_layers(UDP, custom_header)
나는 UDP 뒤에 붙이려고 위와 같이 바인딩을 해 줬다.
처음에 이걸 모르는 바람에 hex값 읽어와서 변환하고... 아주... 난리도 아니었음
3. 패킷을 받는다
def handle_pkt(pkt):
pkt.show()
너무 쉽다.
+) 원하는 헤더 필드에 접근할 때는 기존에 정의되어있는 프로토콜이랑 같은 형식으로 접근할 수 있다
custom_hdr = pkt[custom_header]
f1 = custom_hdr.field1 # == pkt[custom_header].field1
-----------------------------------------------------------
예제 코드
#!/usr/bin/env python
import sys
import struct
import os
from scapy.all import sniff, sendp, hexdump, get_if_list, get_if_hwaddr, bind_layers
from scapy.all import Packet, IPOption
from scapy.all import ShortField, IntField, LongField, BitField, FieldListField, FieldLenField
from scapy.all import IP, TCP, UDP, Raw, Ether, Padding
from scapy.layers.inet import _IPOption_HDR
class custom_header(Packet):
"""Custom Header"""
name = "custom header"
fields_desc = [
BitField("field1", 0, 16), # BitField("field_name", initial value, byte_length)
BitField("field2", 0, 8),
BitField("field3", 0, 8)
]
bind_layers(UDP, custom_header)
def handle_pkt(pkt):
pkt.show()
hexdump(pkt)
custom_hdr = pkt[custom_header]
custom_hdr.show()
f1 = custom_hdr.field1 # == pkt[custom_header].field1
print('field1: ', f1)
def main():
ifaces = filter(lambda i: '' in i, os.listdir('/sys/class/net/')) # 원하는 interface 지정
iface = ifaces[0]
print "sniffing on %s" % iface
sys.stdout.flush()
sniff(iface = iface,
prn = lambda x: handle_pkt(x))
if __name__ == '__main__':
main()
-- 참고 자료 --
scapy document, https://scapy.readthedocs.io/en/latest/build_dissect.html
'Study > Network' 카테고리의 다른 글
[Python] Scapy를 이용해서 custom packet header 정의하기 1 [send.py 편] (0) | 2020.04.16 |
---|---|
Socket API : L3 (네트워크 계층)에서 IP 주소를 어떻게 알아올까? (0) | 2019.01.25 |
OTT challenges, 온라인 동영상 서비스 문제 (0) | 2019.01.08 |
Comments