python-socket

# import necessary package

import socket

import binascii

 

# destination ip

dst = '1.1.1.1'

 

# protocol number. This value will be set in Protocol field in IPv4 header.

# This value will be interprested as 'Unknown' protocol by wireshark and it would not try decode the payload.

# I intentionally used this value to prevent Wireshark from decoding the payload in strange way

proto = 253

 

# Open a raw socket.

print("Opening Socket..")

s = socket.socket(socket.AF_INET, socket.SOCK_RAW,proto)

 

print("Socket Info = ",s)

 

msgStr = "Hello World!"

bArray = bytearray(msgStr.encode('ascii'))

 

s.sendto(bArray, (dst, 0))

 

print("Sent complete")

 

 

Result :----------------------------------------------------------------------------

 

Opening Socket..

Socket Info =  <socket.socket fd=256, family=AddressFamily.AF_INET, type=SocketK

ind.SOCK_RAW, proto=253>

Sent complete

 

NOTE : If you compare the IP packet captured on Sender PC and Reciever PC

 

You may see HeaderChecksum error on Sender PC depending on the operating system or Network Interface Card. It would be because NIC calculate the checksum and wireshark captured the packet at the stage before NIC add checksum. But if you see the packet captured on reciever PC, you will see Checksum value is properly inserted.

 

< Packet captured by Sender PC >

 

No.     Time               Source                Destination           Protocol Length Info

     25 03:09:24.749326000 1.1.1.100             1.1.1.1               IPv4     46     Unknown (253)

 

Frame 25: 46 bytes on wire (368 bits), 46 bytes captured (368 bits) on interface 0

    Interface id: 0

    Encapsulation type: Ethernet (1)

    Arrival Time: Mar 29, 2016 23:09:24.749326000 Eastern Daylight Time

    [Time shift for this packet: 0.000000000 seconds]

    Epoch Time: 1459307364.749326000 seconds

    [Time delta from previous captured frame: 0.000008000 seconds]

    [Time delta from previous displayed frame: 0.000008000 seconds]

    [Time since reference or first frame: 135.151637000 seconds]

    Frame Number: 25

    Frame Length: 46 bytes (368 bits)

    Capture Length: 46 bytes (368 bits)

    [Frame is marked: False]

    [Frame is ignored: False]

    [Protocols in frame: eth:ip:data]

    [Coloring Rule Name: Checksum Errors]

    [Coloring Rule String: eth.fcs_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1 || cdp.checksum_bad==1 || edp.checksum_bad==1 || wlan.fcs_bad==1]

Ethernet II, Src: DellPcba_28:8d:92 (f0:1f:af:28:8d:92), Dst: Anritsu_06:41:e1 (00:00:91:06:41:e1)

    Destination: Anritsu_06:41:e1 (00:00:91:06:41:e1)

        Address: Anritsu_06:41:e1 (00:00:91:06:41:e1)

        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Source: DellPcba_28:8d:92 (f0:1f:af:28:8d:92)

        Address: DellPcba_28:8d:92 (f0:1f:af:28:8d:92)

        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Type: IP (0x0800)

Internet Protocol Version 4, Src: 1.1.1.100 (1.1.1.100), Dst: 1.1.1.1 (1.1.1.1)

    Version: 4

    Header length: 20 bytes

    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))

        0000 00.. = Differentiated Services Codepoint: Default (0x00)

        .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)

    Total Length: 32

    Identification: 0x02aa (682)

    Flags: 0x00

        0... .... = Reserved bit: Not set

        .0.. .... = Don't fragment: Not set

        ..0. .... = More fragments: Not set

    Fragment offset: 0

    Time to live: 128

    Protocol: Unknown (253)

    Header checksum: 0x0000 [incorrect, should be 0x32d1 (may be caused by "IP checksum offload"?)]

        [Good: False]

        [Bad: True]

            [Expert Info (Error/Checksum): Bad checksum]

                [Message: Bad checksum]

                [Severity level: Error]

                [Group: Checksum]

    Source: 1.1.1.100 (1.1.1.100)

    Destination: 1.1.1.1 (1.1.1.1)

    [Source GeoIP: Unknown]

    [Destination GeoIP: Unknown]

Data (12 bytes)

 

0000  48 65 6c 6c 6f 20 57 6f 72 6c 64 21               Hello World!

    Data: 48656c6c6f20576f726c6421

    [Length: 12]

 

 

< Packet captured by Reciever PC >

 

No.     Time               Source                Destination           Protocol Length Info

    931 18:48:42.432656000 1.1.1.100             1.1.1.1               IPv4     60     Unknown (253)

 

Frame 931: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) on interface 0

    Interface id: 0

    WTAP_ENCAP: 1

    Arrival Time: Mar 29, 2016 18:48:42.432656000 Eastern Daylight Time

    [Time shift for this packet: 0.000000000 seconds]

    Epoch Time: 1459291722.432656000 seconds

    [Time delta from previous captured frame: 0.009614000 seconds]

    [Time delta from previous displayed frame: 0.009614000 seconds]

    [Time since reference or first frame: 12.930574000 seconds]

    Frame Number: 931

    Frame Length: 60 bytes (480 bits)

    Capture Length: 60 bytes (480 bits)

    [Frame is marked: False]

    [Frame is ignored: False]

    [Protocols in frame: eth:ip:data]

Ethernet II, Src: f0:1f:af:28:8d:92 (f0:1f:af:28:8d:92), Dst: Anritsu_06:41:e1 (00:00:91:06:41:e1)

    Destination: Anritsu_06:41:e1 (00:00:91:06:41:e1)

        Address: Anritsu_06:41:e1 (00:00:91:06:41:e1)

        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Source: f0:1f:af:28:8d:92 (f0:1f:af:28:8d:92)

        Address: f0:1f:af:28:8d:92 (f0:1f:af:28:8d:92)

        .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)

        .... ...0 .... .... .... .... = IG bit: Individual address (unicast)

    Type: IP (0x0800)

    Padding: 0000000000000000000000000000

Internet Protocol Version 4, Src: 1.1.1.100 (1.1.1.100), Dst: 1.1.1.1 (1.1.1.1)

    Version: 4

    Header length: 20 bytes

    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))

        0000 00.. = Differentiated Services Codepoint: Default (0x00)

        .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)

    Total Length: 32

    Identification: 0x0a76 (2678)

    Flags: 0x00

        0... .... = Reserved bit: Not set

        .0.. .... = Don't fragment: Not set

        ..0. .... = More fragments: Not set

    Fragment offset: 0

    Time to live: 128

    Protocol: Unknown (253)

    Header checksum: 0x2b05 [correct]

        [Good: True]

 

 

NOTE : If you have errors as follows.

 

In some case, you may have following error messsage when you run the scrip. This is because you don't have enough permission to get access to RAW socket data.

If you are running this on Linux, try with su. If you are running this on Windows PC, run 'cmd.exe' windows with 'Run as administrator' and run the script as command line.

 

OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions

 

 

Example 02 > ========================================================

 

< Script on Sender PC >

 

import socket

import binascii

 

dst = '1.1.1.1'

proto = 253

 

# Open a raw socket.

print("Opening Socket..")

s = socket.socket(socket.AF_INET, socket.SOCK_RAW,proto)

 

print("Socket Info = ",s)

 

while 1 :

  msgStr = input("Type in the message to send : ")

  bArray = bytearray(msgStr.encode('ascii'))

  s.sendto(bArray, (dst, 0))

  if msgStr.upper() == "QUIT" :

     break

 

 

< Script on Reciever PC >

 

import socket

import binascii

 

proto = 253

 

### Open a raw socket.

print("Opening Socket..")

s = socket.socket(socket.AF_INET, socket.SOCK_RAW,proto)

 

# Based on my test on Windows, you have to specify the specific explicit IP address assigned to a NIC

# the local IP 127.0.0.1 didn't work in case of Raw Socket.

# Since Raw IP does not have port number field, you can use any port number

# In reciever script, you need to execute bind() whereas you may not need bind() in sender script

s.bind(('1.1.1.1',0))

 

print("Socket Info = ",s)

 

while 1 :

   recvBytes = s.recv(4096)  # This read all the data including IP header. Does not include Ethernet Frame.

   if len(recvBytes) > 0 :

       recvByteHex=binascii.b2a_hex(recvBytes)   # Convert recived data into Hex String

       print(recvByteHex)

       header = recvBytes[0:20]  # Take out IP Header. This assumes that IP header is 20 bytes

       payLoad = recvBytes[20:len(recvBytes)] # Take out payload part. This is still a bytearray

       payLoadStr = payLoad.decode('ascii') # Convert the payload from Bytearray format to a String format

       print(payLoadStr)

       if payLoadStr.upper().find("QUIT") >= 0 : # Exit the while loop if it recieves "QUIT"

           break

 

 

Result :----------------------------------------------------------------------------

 

< Result on Sender PC >

 

NOTE : The green part is what I typed in during the execution.

 

Opening Socket..

Socket Info =  <socket.socket fd=256, family=AddressFamily.AF_INET, type=SocketK

ind.SOCK_RAW, proto=253>

Type in the message to send : Hello World !

Type in the message to send : Hi

Type in the message to send : How are you ?

Type in the message to send : Quit

 

 

< Result on Reciever PC >

 

Opening Socket..

Socket Info =  <socket.socket fd=284, family=AddressFamily.AF_INET, type=SocketKind.SOCK_RAW, proto=253, laddr=('1.1.1.1', 0)>

b'4500002136c8000080fdfeb1010101640101010148656c6c6f20576f726c642021'

Hello World !

b'4500001636dd000080fdfea701010164010101014869'

Hi

b'450000213716000080fdfe630101016401010101486f772061726520796f75203f'

How are you ?

b'450000183760000080fdfe22010101640101010151756974'

Quit

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值