2017-09-16 15 views
2

scapy를 사용하여 새 레이어를 만들고 싶습니다. 새 레이어를 만들었지 만 다른 컴퓨터로 보내면 잃어 버렸고 wireshark도 인식 할 수 없었습니다. 어떻게이 문제를 해결할 수 있습니까?scapy로 새 레이어 또는 새 프로토콜을 만드는 방법은 무엇입니까?

class OMER(Packet): 
    name = "OMER" 
    fields_desc = [StrLenField("Omer", "", None)] 
+0

['wireshark'] (https://www.wireshark.org/)가 자신의 프로토콜 사양을 이해하고 디코딩 할 수 있으려면 어떻게해야합니까? 이 문제를 해결하기 위해 로컬 디코더를 작성할 수 있습니다. 자세한 내용은 ['scapy's docs] (https://scapy.readthedocs.io/en/latest/build_dissect.html)를 읽어보십시오. – coder

+0

이 정보를 읽으려고했으나 깊이 이해하지 못했습니다. 너에게 설명 할 수 있니? 또 다른 질문은 왜 내 컴퓨터의 패킷을 하나의 컴퓨터에서 다른 컴퓨터로 보낼 때 모든 레이어가 내 레이어 – Omer

답변

1

당신은 그들이 당신의 프로토콜의 특성의 인식하지 때문에 wireshark (및 기타)와 같은 새로운 프로토콜이나 scapy와 새 레이어, 다른 네트워크 도구를 만들 때가 자동으로 구문 분석 할 수 없습니다 바르게.

새로운 프로토콜을 실험하려면 자신의 로컬 디코더를 만들어야합니다. 의 인식이 을 볼 수 있듯이

[+] Writing net.pcap file... 
[+] Examining net.pcap file... 

###[ myprotocol ]### 
    fld1  = 0 
    fld2  = 0x3 
###[ myprotocol ]### 
    fld1  = 1 
    fld2  = 0x3 
###[ myprotocol ]### 
    fld1  = 2 
    fld2  = 0x3 
...skip... 

:


#!/usr/bin/env python 

from scapy.all import * 

# create a simple protocol 
# (example similar with the one in the scapy docs...) 
class Exmpl(Packet): 
    name = "myprotocol" 
    fields_desc=[ ShortField("fld1",5), 
        XByteField("fld2",3) ] 

from scapy.utils import PcapWriter 

# write data in a pcap file to examine later with 
# 1 -> scapy 
# 2 -> wireshark 
print '\n[+] Writing net.pcap file...' 
cap = PcapWriter("net.pcap", append=True, sync=True) 
for i in range(10): 
    packet = Exmpl(fld1=i) 
    cap.write(packet) 

# read the data and examine them with scapy 
# scapy is aware of the "Exmpl" protocol (e.g. its fields etc...) 
# and how to decode it, while wireshark is not 
print '[+] Examining net.pcap file...\n' 
packets = rdpcap('net.pcap') 
for p in packets: 
    Exmpl(str(p)).show() 

위 스크립트의 출력은 같은 것입니다 : 다음 예는 심지어 최소한의, 그것은 위의 모든 방법을 보여줍니다 프로토콜을 사용하여 데이터를 올바르게 구문 분석 할 수 있습니다.

enter image description here

이 프로토콜을 인식하지 그 결과는 가 올바르게 구문 분석 할 수 없습니다 : 당신이 wireshark과 함께 "net.pcap"파일을 검사하려고하면 지금 당신은 다음을 참조한다 .

알림 : 알다시피, 다른 장치에 패킷을 보내더라도 (실제로 다른 장치도 구현해야 함) 알 수 있듯이 해당 장치는 프로토콜을 알고 있어야합니다. 올바르게 구문 분석 할 수 없습니다. 그래서 한 컴퓨터에서 다른 컴퓨터로 패킷을 보내려고하면 수신기가 패킷을 성공적으로 디코딩 할 수 없었습니다.

+0

을 제외한 모든 레이어에 나타나는지 확인하고 다른 컴퓨터가 내 프로토콜을 인식하도록 만드는 것입니다. – Omer

+0

다른 컴퓨터의 스크립트에'Exmpl'을 임포트하고 코드 스 니펫과 같이 pcap을 파싱해야합니다. 그건 그렇고, 아무도 당신의 프로토콜의 특성을 알 수 없기 때문에 이것은 네트워크에서 데이터를 숨기는 방법입니다. 프로토콜 표준에 대한 추가 정보가 들어있는 [이 위키 링크] (https://en.wikipedia.org/wiki/Communications_protocol)를 확인하십시오. – coder

+0

좋아, 내가이 코드를 작성하면 ip 또는 tcp와 같은 다른 레이어가 취소됩니까? IP()/UDP()/my_protocol()을 쓸 수 있습니까? – Omer

0

새 레이어/프로토콜을 이전 레이어/프로토콜에 바인딩 했습니까? 예 : bind_layers (Ether, OMER) OMER 계층이 Ether 계층 바로 뒤에 오는 경우.