Raw Socketによるイーサネットフレーム解析
3389 ワード
RAW SOCKET
RAWソケットは、ネットワークスタック全体を迂回し、イーサネットフレームをアプリケーションに直接送信する方法を提供します.
(ネットワーク層とトランスポート層のフィルタ解析をスキップするので、新しいパケットフォーマットまたはカスタムパケットフォーマットを直接処理できます)
RAWソケットフォーマットの作成方法:AF_PACKETとPF_SOCKET.AF_PACKETはwinとmacシステムに用いられる.本編ではLinuxベースのPF_についてご紹介しますPACKET作成方法.
PF_ベースPACKETのPF_SOCKET
受信したパケットをsocketモジュールで読み込む
解釈と分析を行う
これによりパケット解析を行う
PF_からPACKETはカスタム2階建ての発注と梱包を行い(2階建ての直結を要求し、2台の試験機が直結していないので、私は午後==)、簡易コードを作った.
送信側
じゅしんたんし
-------------------------------------------------------------------
送信側完全版
RAWソケットは、ネットワークスタック全体を迂回し、イーサネットフレームをアプリケーションに直接送信する方法を提供します.
(ネットワーク層とトランスポート層のフィルタ解析をスキップするので、新しいパケットフォーマットまたはカスタムパケットフォーマットを直接処理できます)
RAWソケットフォーマットの作成方法:AF_PACKETとPF_SOCKET.AF_PACKETはwinとmacシステムに用いられる.本編ではLinuxベースのPF_についてご紹介しますPACKET作成方法.
PF_ベースPACKETのPF_SOCKET
受信したパケットをsocketモジュールで読み込む
解釈と分析を行う
>>> import socket
>>> import struct
>>> import binascii
>>>
>>> rawSocket = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x0800))
>>> pkt = rawSocket.recvfrom(2048)
>>> ethernetHeader = pkt[0][0:14]
>>> ethernetHeader
'\x90\xb1\x1cZ\xa8\x89p\xf9mYF\x9d\x08\x00'
>>> binascii.hexlify(eth_hdr[0])
'90b11c5aa889'
>>> binascii.hexlify(eth_hdr[1])
'70f96d59469d'
>>> binascii.hexlify(eth_hdr[2])
'0800'
>>> ipHeader = pkt[0][14:34]
>>> ip_hdr = struct.unpack("!12s4s4s",ipHeader)
>>> ip_hdr
('E\x00\x00(U\xe4@\x00~\x06\x91\xbe', '\xc0\xa8d\x9a', '\xc0\xa8/B')
>>> socket.inet_ntoa(ip_hdr[1])
'192.168.100.154'
>>> socket.inet_ntoa(ip_hdr[2])
'192.168.47.66'
>>> tcpHeader = pkt[0][34:54]
これによりパケット解析を行う
PF_からPACKETはカスタム2階建ての発注と梱包を行い(2階建ての直結を要求し、2台の試験機が直結していないので、私は午後==)、簡易コードを作った.
送信側
import struct
import socket
s= socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0901))
s.bind(("eth1", 0))
#dst_addr = "\x90\xb1\x1c\x5a\xa8\x89"
dst_addr = "\x00\x0c\x29\x89\xaf\x38"
src_addr = "\x00\x0c\x29\xb6\xe5\xb7"
ethtype = "\x09\x01"
packet = struct.pack("!6s6sH", dst_addr, src_addr, 0x0901)
s.send(packet + "hello!")
じゅしんたんし
import socket
import struct
import binascii
socket1 = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0901))
while True:
pkt = socket1.recvfrom(2048)
eth_header = pkt[0][0:14]
eth_hdr = struct.unpack("!6s6sH",eth_header)
print repr(eth_hdr[0])
type = eth_hdr[2]
if( type == 0x0901):
print("get 0x0901")
print("end")
-------------------------------------------------------------------
送信側完全版
import socket
import struct
import binascii
def set_mac(hexstring):
mac_addr=[]
for i in xrange(0, len(hexstring)/2):
int_c = int(hexstring[i*2:i*2+2],16)
mac_addr.append(int_c)
return mac_addr
def packed(dmac, smac, ethtype):
packed = b""
i =0
for value in dmac:
packed += struct.pack("!B", value)
for value in smac:
packed += struct.pack("!B", value)
packed += struct.pack("!H", ethtype)
return packed
socket2 = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
socket2.bind(('eth1', 0))
data = b""
d_mac = "000c2989af38"
s_mac = "000c29b6e5b7"
dmac = set_mac(d_mac)
smac = set_mac(s_mac)
ethtype = 0x0901
pack_res = packed(dmac, smac, ethtype)
data += pack_res
try:
socket2.send(data)
print('ok')
except:
raise Exception("send failed")