ICMP后門(上)補(bǔ)充篇
前言
在上一篇文章Python3實(shí)現(xiàn)ICMP遠(yuǎn)控后門(上)中,我簡要講解了ICMP協(xié)議,以及實(shí)現(xiàn)了一個簡單的ping功能,在文章發(fā)表之后,后臺很多朋友留言,說對校驗(yàn)和的計算不是很了解,實(shí)現(xiàn)的ping功能僅實(shí)現(xiàn)了發(fā)送,接收沒有實(shí)現(xiàn),一個完整ping如何實(shí)現(xiàn)等等。本來對于ICMP后門寫三篇文章的,但是對大家的疑惑臨時開辟了一個補(bǔ)充篇,對ICMP協(xié)議校驗(yàn)方式,以及實(shí)現(xiàn)一個完整功能的ping給大家進(jìn)行詳細(xì)的講解。
第一節(jié)?ICMP協(xié)議校驗(yàn)和
對于校驗(yàn)和的計算,我對寫校驗(yàn)和的代碼進(jìn)行了如下注釋,注意看注釋就會明白校驗(yàn)的整個流程。
def checksum(packet):
? ? """
? ? 校驗(yàn)
? ? """
? ?#packet為icmp頭部和data的字節(jié)流,其中icmp校驗(yàn)和字段初始化為0? ??
? ? sum =0
? ?#countTo:記錄packet是有多少個16位,因?yàn)閷γ績蓚€字節(jié)進(jìn)行校驗(yàn)
? ? countTo = (len(packet)//2)*2?
? ? count =0
? ? while count <countTo:
? ? ? ? #將每兩個字節(jié)中的第二個字節(jié)作為高位,第一個字節(jié)作為低位組成16位的值
? ? ? ? sum += ((packet[count+1] << 8) | packet[count])
? ? ? ? count += 2
????#packet并不一定都是偶數(shù)字節(jié),可能是奇數(shù),把最后一個字節(jié)加到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
????#到這應(yīng)該就結(jié)束了,但是字節(jié)序有問題,下面是將主機(jī)字節(jié)序轉(zhuǎn)為網(wǎng)絡(luò)字節(jié)序
????#即高位轉(zhuǎn)低位,低位轉(zhuǎn)高位
? ? answer = answer & 0xffff
? ? answer = answer >> 8 | (answer << 8 & 0xff00)
? ? return answer
第二節(jié)?ICMP報文的標(biāo)識符與序列號
ICMP回送消息(Type = 8),被請求主機(jī)回送響應(yīng)消息(Type = 0),基本格式如下:
回送消息[ECHO]
回送響應(yīng)消息[ECHO REPLY]
Code = 0,
CheckSum為校驗(yàn)和,重點(diǎn)注意從ICMP的頭部到data結(jié)束(即到整個數(shù)據(jù)包結(jié)束)
Identifier為標(biāo)識符,由主機(jī)設(shè)定,一般設(shè)置為進(jìn)程號,回送響應(yīng)消息與回送消息中identifier保持一致
Sequence Number為序列號,由主機(jī)設(shè)定,一般設(shè)為由0遞增的序列,回送響應(yīng)消息與回送消息中Sequence Number保持一致
data為數(shù)據(jù),由主機(jī)設(shè)定,回送響應(yīng)消息與回送消息中data保持一致
第三節(jié) ping實(shí)現(xiàn)
在上篇中,我們講解了如何發(fā)送icmp請求,接下來我們實(shí)現(xiàn)如何接受響應(yīng),并計算響應(yīng)時間,效果類似下圖:
接收ping響應(yīng)的代碼如下:
ping的超時機(jī)制是通過select模型實(shí)現(xiàn)的。對于Identifier設(shè)置為進(jìn)程號,如下圖所示。
測試ping效果?
注意使用管理員權(quán)限運(yùn)行Python腳本,直接ping www.baidu.com
第四節(jié) 更多干貨
ping完整版的代碼在知識星球中發(fā)布,更多干貨請關(guān)注知識星球,隨著人數(shù)的增多,價格之后會上漲,越早關(guān)注越多優(yōu)惠。