美文网首页
构造icmp包python-socket-校验和

构造icmp包python-socket-校验和

作者: 平解技术控 | 来源:发表于2019-06-24 23:59 被阅读0次

    构造检验和的包,通过抓包看下,发出去的包正常收到了对端的回包,试验成功。校验和需要计算请求头+payload的和

    def checksum(source_string):
        """
        I'm not too confident that this is right but testing seems
        to suggest that it gives the same answers as in_cksum in ping.c
        """
        sum = 0
        countTo = (len(source_string)/2)*2
        count = 0
        while count<countTo:
            thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
            sum = sum + thisVal
            sum = sum & 0xffffffff # Necessary?
            count = count + 2
    
        if countTo<len(source_string):
            sum = sum + ord(source_string[len(source_string) - 1])
            sum = sum & 0xffffffff # Necessary?
    
        sum = (sum >> 16)  +  (sum & 0xffff)
        sum = sum + (sum >> 16)
        answer = ~sum
        answer = answer & 0xffff
    
        # Swap bytes. Bugger me if I know why.
        answer = answer >> 8 | (answer << 8 & 0xff00)
    
        return answer
    
    
    # generate icmp data
    def generate_pkg():
       ## ICMP pkg header
       pkt_id = os.getpid()
       ident = 0
       pkg_header_pre = struct.pack("!BBHHH", 8, 0, 0, pkt_id, ident)
       payload = struct.pack("d", time.time())
       pkgheader_check = checksum(pkg_header_pre+payload)
       pkg_header = struct.pack("!BBHHH", 8, 0, pkgheader_check, pkt_id, ident)
       pkg = pkg_header+payload
       return pkg
    

    抓包文件如下


    image.png

    在完成了基本功能之后,下一步就是要做接收包的功能,取出响应包的时延可视化。多次访问一个IP列表,看下程序的访问时间,性能,还有一步优化,收包功能做完之后,接入算法评选ping延时的链路稳定性。
    整体代码如下:

    #!/bin/env/python
    
    import socket
    import struct
    import os
    import time
    
    # create icmp socket
    def create_socket():
        proto = 'ICMP'
        try:
            icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
            print icmp_socket
        except Exception as e:
            raise e
        return icmp_socket
    
    
    def checksum(source_string):
        """
        I'm not too confident that this is right but testing seems
        to suggest that it gives the same answers as in_cksum in ping.c
        """
        sum = 0
        countTo = (len(source_string)/2)*2
        count = 0
        while count<countTo:
            thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
            sum = sum + thisVal
            sum = sum & 0xffffffff # Necessary?
            count = count + 2
    
        if countTo<len(source_string):
            sum = sum + ord(source_string[len(source_string) - 1])
            sum = sum & 0xffffffff # Necessary?
    
        sum = (sum >> 16)  +  (sum & 0xffff)
        sum = sum + (sum >> 16)
        answer = ~sum
        answer = answer & 0xffff
    
        # Swap bytes. Bugger me if I know why.
        answer = answer >> 8 | (answer << 8 & 0xff00)
    
        return answer
    
    
    # generate icmp data
    def generate_pkg():
       ## ICMP pkg header
       pkt_id = os.getpid()
       ident = 0
       pkg_header_pre = struct.pack("!BBHHH", 8, 0, 0, pkt_id, ident)
       payload = struct.pack("d", time.time())
       pkgheader_check = checksum(pkg_header_pre+payload)
       pkg_header = struct.pack("!BBHHH", 8, 0, pkgheader_check, pkt_id, ident)
       pkg = pkg_header+payload
       return pkg
    
    
    def send_pkg(icmp_socket,pkt,dst_addr):
        icmp_socket.sendto(pkt,dst_addr)
    
    
    if __name__ == '__main__':
        icmp_socket = create_socket()
        pkt = generate_pkg()
        dst_addr = '61.135.169.121'
        real_dst_addr = (dst_addr, 0)
        send_pkg(icmp_socket, pkt, real_dst_addr)
    

    相关文章

      网友评论

          本文标题:构造icmp包python-socket-校验和

          本文链接:https://www.haomeiwen.com/subject/rtqzqctx.html