이상한 코딩 나라의 혜돌이
[Python] Scapy를 이용해서 custom packet header 정의하기 1 [send.py 편] 본문
사실 원하는 헤더를 직접 만들어서 패킷을 보낼 일은 많지 않다.
그래도 연구 하시는 분들에게는 도움이 될 수도 있으니까 + 나도 볼 겸 정리를 해 본다.
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()
인덴테이션까지 해준다 짱이다
---------------------------------------------------------------
예제 코드는 아래와 같습니다
(다른 걸 테스트하다 들고온거라 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()
아니 근데 티스토리 진짜 좋아졌다...
'Study > Network' 카테고리의 다른 글
[Python] Scapy를 이용해서 custom packet header 정의하기 2 [receive.py 편] (0) | 2020.04.25 |
---|---|
Socket API : L3 (네트워크 계층)에서 IP 주소를 어떻게 알아올까? (0) | 2019.01.25 |
OTT challenges, 온라인 동영상 서비스 문제 (0) | 2019.01.08 |
Comments