On 2012-08-22, Dennis Lee Bieber <wlfr...@ix.netcom.com> wrote:
> On Wed, 22 Aug 2012 01:43:19 -0700 (PDT), Guillaume Comte
><guillaume.comt...@gmail.com> declaimed the following in
> gmane.comp.python.general:
>
>> I've managed to build the IP header. I've put the source and destination 
>> addresses in this header but it doesn't change the real source address...
>
>       For all I know (I've done very little network programming, and that
> was years ago using plain TCP and UDP -- worse, on a VMS system so it
> wasn't the "UNIX style" socket interface), your network stack may still
> be overriding the packet at some lower level and inserting the IP
> associated with the interface the packet went out on...

I've only been intermittently following this thread, but back when I
added Python's raw packet support for Unix, the socket module was a
_very_ thin wrapper for the underlying OS network socket API.  The
behavior of various types of sockets was defined entirely by the
underlying OS.

So, if you're trying to do something obscure (which it seems you are),
asking people who know how to do it in C on the relevent OS is
probably the best approach.

Below are examples of sending and receiving a completely raw packet on
Linux (where you provide _all_ the bytes: the MAC addreses, the
Ethernet type, everything).

------------------------------send------------------------------
#!/usr/bin/python
import sys,os,socket,struct
from optparse import OptionParser

p = OptionParser()
p.add_option("-i","--interface",dest="interface",metavar="<name>",type='str',default="eth0")
options,args = p.parse_args()

if len(args) != 1:
    sys.stderr.write("you must provide a destination MAC address\n")
    sys.exit(1)
    
def toHex(s):
    return " ".join([("%02x" % ord(c)) for c in s])

ethProto = 0x5678
dstMacStr = args[0]
dstMacAddr = "".join(map(chr,[int(x,16) for x in dstMacStr.split(":")]))

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ethProto)
s.bind((options.interface,ethProto))

ifName,ifProto,pktType,hwType,hwAddr = s.getsockname()
srcMacAddr = hwAddr

ethHeader = struct.pack("!6s6sh",dstMacAddr,srcMacAddr,ethProto)
packet = ethHeader + "some ASCII data here"

sys.stdout.write("tx: %s\n" % toHex(packet))
s.send(packet)
s.close()
-----------------------------------------------------------------

------------------------------recv------------------------------
#!/usr/bin/python
import sys,os,socket,struct
from optparse import OptionParser

p = OptionParser()
p.add_option("-i","--interface",dest="interface",metavar="<name>",type='str',default="eth0")
options,args = p.parse_args()

if len(args) != 0:
    sys.stderr.write("no arguments accepted\n")
    sys.exit(1)
    
def toHex(s):
    return " ".join([("%02x" % ord(c)) for c in s])

ethProto = 0x5678

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ethProto)
s.bind((options.interface,ethProto))

packet = s.recv(4096)
sys.stdout.write("rx: %s\n" % toHex(packet))
s.close()
-----------------------------------------------------------------

-- 
Grant Edwards               grant.b.edwards        Yow! I'm changing the
                                  at               CHANNEL ... But all I get
                              gmail.com            is commercials for "RONCO
                                                   MIRACLE BAMBOO STEAMERS"!
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to