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 정의하기 1 [send.py 편] 본문

Study/Network

[Python] Scapy를 이용해서 custom packet header 정의하기 1 [send.py 편]

혜돌이 2020. 4. 16. 16:32

사실 원하는 헤더를 직접 만들어서 패킷을 보낼 일은 많지 않다.

그래도 연구 하시는 분들에게는 도움이 될 수도 있으니까 + 나도 볼 겸 정리를 해 본다.

 

1. 원하는 패킷의 헤더를 Class 형태로 정의한다

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)
  ]

BitField(원하는 필드 이름, 0, 비트수)로 리스트 형태로 정의해 주면 된다.

두 번째 파라미터는 무슨 의미인지 잘 모르겠음. ==> 초기값

 

 

2. 원하는 곳에 헤더를 붙여 packet을 구성하고 보낸다

pkt = Ether(...) / IP(...) / UDP(...) / custom_header(field1=10, field2=20, field3=30)
sendp(pkt, iface=dest_if, verbose=False)

원하는 자리에 / 를 이용해서 껴 넣기만 하면 됨

 

 

3. 패킷을 확인하면 예쁘게 보여준다

pkt.show()

pkt.show()를 입력하면 자동으로 화면에 찍어준다

인덴테이션까지 해준다 짱이다

 

 

---------------------------------------------------------------

예제 코드는 아래와 같습니다

(다른 걸 테스트하다 들고온거라 import가 지저분하네요..)

#!/usr/bin/env python
import argparse
import sys
import socket
import struct

from scapy.all import sendp, send, get_if_list, get_if_hwaddr, hexdump
from scapy.all import Packet
from scapy.all import Ether, IP, UDP
from scapy.all import hexdump, BitField, BitFieldLenField, ShortEnumField, X3BytesField, ByteField, XByteField

class custom_header(Packet):
    """Custom Header"""
    name = "custom header"
    fields_desc = [
      BitField("field1", 0, 16), # BitField("field_name", 0, byte_length)
      BitField("field2", 0, 8),
      BitField("field3", 0, 8)
    ]

def main():
    iface = "" # need to change
    print('\n---------- Send pakcet ----------')
    pkt = Ether(src='00:00:00:00:00:01', dst='00:00:00:00:00:02') / IP(src='10.0.0.1', dst='10.0.0.2', proto=17) / UDP(sport=1234, dport=5678) / custom_header(field1=10, field2=20, field3=30)
    sendp(pkt, iface=iface, verbose=False)
    pkt.show()

if __name__ == '__main__':
    main()

 

 

 

 

 

아니 근데 티스토리 진짜 좋아졌다...

Comments