How to send an IP packet in Python?

yegorov-p yegorov.p at gmail.com
Thu Dec 2 06:12:42 EST 2010


Hello.

I have sniffed some packet and now I would like to send it with the
help of python. It's some simple IGMP packet with VLAN tag.
(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)

At first I wrote that:

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

But for some reason python send that:
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

As you can see, python ignores my headers and creates its own.

I discussed that problem on stackoverflow.com and one user told me to
try that:

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)

But under Windows, AF_PACKET is said to be undefined. =( I tried to
replace it with AF_INET, but now python tells me that that protocol
(0x8100) is not supported. 0x8100 is IEEE 802.1Q and I just don't
understand, why it isn't supported. I can generate packet with VLAN
tag inside and send it with the help of pierf, for example. In fact, I
can generate and send the packet from my example with pierf and it
runs just fine. =) I've found a topic with the same problem (http://
www.computing.net/answers/programming/python-windows-sockets/11884.html)

So, is there any way to somehow send a packet with ready headers and
data under Windows with the help of python?



More information about the Python-list mailing list