Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

이상한 코딩 나라의 혜돌이

[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

Comments