自己构造的IP-ICMP包

写在前面

写这篇笔记的时候,我还是很气的。

ip头

自己构造的IP-ICMP包_第1张图片

代码

引用内容
代码

import socket
import struct
def checksum(source_string):
    sum = 0
    countTo = (len(source_string)/2)*2
    count = 0
    while count1])*256 + ord(source_string[count])
        sum = sum + thisVal
        sum = sum & 0xffffffff 
        count = count + 2
    if countTo<len(source_string):
        sum = sum + ord(source_string[len(source_string) - 1])
        sum = sum & 0xffffffff 
    sum = (sum >> 16)  +  (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer
def ping(ip):            
    s=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_RAW)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
    source_ip = 'xx.xx.xx.xx'
    dest_ip = ip
    ihl = 5
    version = 4
    tos = 0
    tot_len = 28
    ip_id = 0
    frag_off = 0
    ttl = 255
    protocol = 1
    check = 0  
    saddr =socket.inet_aton ( source_ip )  #Spoof the source ip address if you want to
    daddr = socket.inet_aton ( dest_ip )
    ihl_version = (version << 4) + ihl
    # the ! in the pack format string means network order
    ip_header = struct.pack('!BBHHHBBH4s4s', ihl_version, tos, tot_len, ip_id, frag_off, 255,1, check, saddr, daddr) 
    packet = struct.pack("!BBHHH", 8, 0, 0, 0, 0)
    chksum=checksum(packet)
    packet = struct.pack("!BBHHH", 8, 0, chksum, 0, 0)
    packet=ip_header+packet
    k=s.sendto(packet,(ip,22222))
    print k

if __name__=='__main__':
    ping('xx.xx.xx.xx2')

分析

通过
s=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_RAW)
以及
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
创建原始套接字,保证自己可以修改IP头部信息。这样就可以修改源IP了。

为什么气!

做了很久的实验,发现这样的问题:
我一开始实在windows下进行的代码测试,却发现无法用wireshark抓到想要的ICMP包,所以我以为没有把这些包发送出去。但是我发现sendto函数返回给我一个28字节,讲道理的话它应该是把包发出去的。后来我怀疑可能是系统的原因!
于是我转战linux。发现了这样有趣的现象。在linux下,我可以给我的主机(我用的虚拟机)发送自己构造的 IP包头 以及 ICMP包头的icmp-echo,并且可以用linux中的wireshark抓到这个icmp-echo以及我主机的icmp-reply。可是与此同时,我却不能在主机中抓到icmp的任何包!为什么???如果有人知道,谢谢告知。

关于差错检验的内容

引用块内容
http://www.cnblogs.com/xy-kidult/archive/2013/05/06/3063800.html
这位大神写的很好。

你可能感兴趣的:(私人笔记——仅供自己记录学习)