Python3实现ICMP远控后门(上)_补充篇


ICMP后门(上)补充篇python

 

前言

在上一篇文章Python3实现ICMP远控后门(上)中,我简要讲解了ICMP协议,以及实现了一个简单的ping功能,在文章发表以后,后台不少朋友留言,说对校验和的计算不是很了解,实现的ping功能仅实现了发送,接收没有实现,一个完整ping如何实现等等。原本对于ICMP后门写三篇文章的,可是对你们的疑惑临时开辟了一个补充篇,对ICMP协议校验方式,以及实现一个完整功能的ping给你们进行详细的讲解。网络

 

第一节 ICMP协议校验和

 对于校验和的计算,我对写校验和的代码进行了以下注释,注意看注释就会明白校验的整个流程。ide

def checksum(packet):

    """

    校验

    """

   #packet为icmp头部和data的字节流,其中icmp校验和字段初始化为0    

    sum =0

   #countTo:记录packet是有多少个16位,由于对每两个字节进行校验

    countTo = (len(packet)//2)*2 

    count =0

    while count <countTo:

        #将每两个字节中的第二个字节做为高位,第一个字节做为低位组成16位的值

        sum += ((packet[count+1] << 8) | packet[count])

        count += 2

    #packet并不必定都是偶数字节,多是奇数,把最后一个字节加到sum中

    if countTo<len(packet):

        sum += packet[len(packet) - 1]

        sum = sum & 0xffffffff

    #sum中超过16位的高位加到低位

    sum = (sum >> 16)  +  (sum & 0xffff)

    sum = sum + (sum >> 16)

    #对sum取反

    answer = ~sum

    #到这应该就结束了,可是字节序有问题,下面是将主机字节序转为网络字节序

    #即高位转低位,低位转高位

    answer = answer & 0xffff

    answer = answer >> 8 | (answer << 8 & 0xff00)

    return answer

  

第二节 ICMP报文的标识符与序列号

ICMP回送消息(Type = 8),被请求主机回送响应消息(Type = 0),基本格式以下:测试

回送消息[ECHO]spa

回送响应消息[ECHO REPLY]code

  • Code = 0,blog

  • CheckSum为校验和,重点注意从ICMP的头部到data结束(即到整个数据包结束)进程

  • Identifier为标识符,由主机设定,通常设置为进程号,回送响应消息与回送消息中identifier保持一致get

  • Sequence Number为序列号,由主机设定,通常设为由0递增的序列,回送响应消息与回送消息中Sequence Number保持一致class

  • data为数据,由主机设定,回送响应消息与回送消息中data保持一致

 

第三节 ping实现

 在上篇中,咱们讲解了如何发送icmp请求,接下来咱们实现如何接受响应,并计算响应时间,效果相似下图:

接收ping响应的代码以下:

 

 ping的超时机制是经过select模型实现的。对于Identifier设置为进程号,以下图所示。

 

测试ping效果 

 

注意使用管理员权限运行Python脚本,直接ping www.baidu.com

 

最后

若是以为本文还能够,必定记得推荐哟。欢迎关注个人公众号。

 

相关文章
相关标签/搜索