如何在Python中发送IP数据包?

问题描述:

我嗅探了一个IGMP数据包,现在我想在python的帮助下发送它。有没有什么办法,只是发送类似如何在Python中发送IP数据包?

0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 81 00 00 DE ..^.Cg..іИD?..Ю 
0x0010 08 00 46 00 00 20 00 01-00 00 01 02 36 4C C0 A8 ..F.. ......6LАЁ 
0x0020 00 7B EA 00 43 67 94 04-00 00 16 00 BC 97 EA 00 .{к.Cg”.....ј—к. 
0x0030 43 67            Cg 

包没有任何包发生器的像impacket?

UPD好吧,我试图用原始套接字,这样的:

dst = '234.0.67.103' 

# Open a raw socket. 
s = socket.socket(socket.AF_INET, socket.SOCK_RAW,2) 

res='' 

temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67' 
for i in temp.split(' '): 
    res+=chr(int(i, 16)) 
print res 
s.sendto(res, (dst, 0)) 

一切都只是一个小东西... 罚款,如果我嗅出这个包,它看起来就像是:

0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 08 00 45 00 ..^.Cg..іИD..E. 
0x0010 00 46 07 06 00 00 01 02-C4 25 C0 A8 00 7B EA 00 .F......Д%АЁ.{к. 
0x0020 43 67 01 00 5E 00 43 67-00 02 B3 C8 7F 44 81 00 Cg..^.Cg..іИDЃ. 
0x0030 00 DE 08 00 46 00 00 20-00 01 00 00 01 02 36 4C .Ю..F.. ......6L 
0x0040 C0 A8 00 7B EA 00 43 67-94 04 00 00 16 00 BC 97 АЁ.{к.Cg”.....ј— 
0x0050 EA 00 43 67          к.Cg 

正如你所看到的,由于某种原因,Python会忽略我的头文件并创建它自己的头文件。我该如何解决它?

+2

这可能会帮助:http://*.com/questions/316866/ping-a-sit e-in-python(这里有纯python ping - 我假设你可以适应它) – sje397 2010-11-30 12:12:27

+1

你有没有试过[原始套接字](http://*.com/questions/1117958/how-do-i-use-raw-插座中的Python)? – kichik 2010-11-30 12:24:20

嗯,我明白了,要做到这一点的唯一方法就是在那样的方式来使用Scapy的:

from scapy.all import * 
a=Ether(import_hexcap()) 
<some dumped hex> 
sendp(a) 

以下是你的代码的修改,将发送的原始数据包:

import socket 

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x8100) 
s.bind(('eth0', 0x8100)) 

res='' 
temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67' 
for i in temp.split(' '): 
    res+=chr(int(i, 16)) 
s.send(res) 

由于Unix网络编程(3TH ED):

sockfd = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
# inform os about that program are compose ip header 
sockfd.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, True)