1. 程式人生 > >Python3實現ICMP遠控後門(上)_補充篇

Python3實現ICMP遠控後門(上)_補充篇

eply image left adding TP 網絡 管理 如何實現 style


ICMP後門(上)補充篇

前言

在上一篇文章Python3實現ICMP遠控後門(上)中,我簡要講解了ICMP協議,以及實現了一個簡單的ping功能,在文章發表之後,後臺很多朋友留言,說對校驗和的計算不是很了解,實現的ping功能僅實現了發送,接收沒有實現,一個完整ping如何實現等等。本來對於ICMP後門寫三篇文章的,但是對大家的疑惑臨時開辟了一個補充篇,對ICMP協議校驗方式,以及實現一個完整功能的ping給大家進行詳細的講解。

第一節 ICMP協議校驗和

對於校驗和的計算,我對寫校驗和的代碼進行了如下註釋,註意看註釋就會明白校驗的整個流程。

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]

技術分享圖片

回送響應消息[ECHO REPLY]

技術分享圖片

  • Code = 0,

  • CheckSum為校驗和,重點註意從ICMP的頭部到data結束(即到整個數據包結束)

  • Identifier為標識符,由主機設定,一般設置為進程號,回送響應消息與回送消息中identifier保持一致

  • Sequence Number為序列號,由主機設定,一般設為由0遞增的序列,回送響應消息與回送消息中Sequence Number保持一致

  • data為數據,由主機設定,回送響應消息與回送消息中data保持一致

第三節 ping實現

在上篇中,我們講解了如何發送icmp請求,接下來我們實現如何接受響應,並計算響應時間,效果類似下圖:

技術分享圖片

接收ping響應的代碼如下:

技術分享圖片

ping的超時機制是通過select模型實現的。對於Identifier設置為進程號,如下圖所示。

技術分享圖片

測試ping效果

註意使用管理員權限運行Python腳本,直接ping www.baidu.com

技術分享圖片

最後

如果覺得本文還可以,一定記得推薦喲。歡迎關註我的公眾號。

技術分享圖片

Python3實現ICMP遠控後門(上)_補充篇