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