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

 

最後

若是以爲本文還能夠,必定記得推薦喲。歡迎關注個人公衆號。

 

相關文章
相關標籤/搜索