Я изучаю программу, которую дал мне мой инструктор для моего урока по сетевым технологиям. Предполагается, что Ping-сервер использует ICMP. Однако программа не работает. Я запустил его с WireShark, и он говорит, что байт контрольной суммы не возвращается правильно. Видимо, это работает для моих одноклассников, но не для меня. А для тех, кто может сказать «спроси своего профессора», я пытался спросить его об этом какое-то время, но пока не смог встретиться с ним. Вот функция, которая реализует контрольную сумму.
def checksum(string):
csum = 0
countTo = (len(string) // 2) *2
count = 0
while count < countTo:
thisVal = ord(strin[count+1]) *256 + ord(string[count])
csum = csum + this Val
csum = csum & 0xffffffff
count = count +2
if coutnTo < len(string):
csum = csum = ord(string[len(string) -1])
csum = csum & 0xffffffff
csum = (csumm >> 16) + (csum & 0xffff)
csum = csum + (csum >>16)
answer = ~csum
answer = answer & 0xffff
answer = answer >> 8 | (answer << 8 & 0xff00)
return answer
Следует также упомянуть, что для создания строкового аргумента он использует struct.pack примерно так:
header = struct.pack("bbHHh", ICMP_ECHO_REQUEST,0,0, ID,1)
data = struct.pack("d",time.time())
checksum(str(header+data))
Я также запускаю это в Kali Vm, если это имеет значение.