Python3實現ICMP遠控後門(上)_補充篇
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遠控後門(上)_補充篇