2014-01-03 3 views
1

За последние несколько дней, я увлечен протоколом ICMP, и я нашел функцию питона, которая вычисляет контрольную сумму:контрольной суммы ICMP питон с Wireshark

def carry_around_add(a, b): 
    c = a + b 
    return (c & 0xffff) + (c >> 16) 

def checksum(msg): 
    s = 0 
    for i in range(0, len(msg), 2): 
     w = ord(msg[i]) + (ord(msg[i+1]) << 8) 
     s = carry_around_add(s, w) 
    return ~s & 0xffff 

print checksum("abcdefghijklmnopqrst") 

В этой картине захвата Wireshark: http://memory00stack.files.wordpress.com/2013/12/resultat.png

Контрольная сумма «0xcfcb», но функция в моем тесте возвращает «55 245 ->0xd7cd». Зачем ?

Большое спасибо =)

ответ

2

Ваш Wireshark дамп показывает контрольную сумму ICMP, но (wikipedia):

Третий и четвертый байты являются контрольная сумма всего сообщения ICMP.

...

Контрольная сумма - проверка ошибок данные, вычисленные из заголовка ICMP и данных, со значением 0 замещенного для этого поля. Используется контрольная сумма Интернета, указанная в RFC 1071.

Ваш ввод в процедуру контрольной суммы в вашем тесте является только частью полезной нагрузки ASCII. Вы должны предоставить весь вход ICMP.


Например:

def carry_around_add(a, b): 
    c = a + b 
    return (c & 0xffff) + (c >> 16) 

def checksum(msg): 
    s = 0 
    for i in range(0, len(msg), 2): 
     w = ord(msg[i]) + (ord(msg[i+1]) << 8) 
     s = carry_around_add(s, w) 
    return ~s & 0xffff 

payload_body = "abcdefghijklmnopqrst" 
chk = checksum(payload_body) 
print chk, '{:x}'.format(chk), '(host byte order)' 

msg_type = '\x08' # ICMP Echo Request 
msg_code = '\x00' # must be zero 
msg_checksum_padding = '\x00\x00' # "...with value 0 substituted for this field..." 
rest_header = '\x00\x01\x00\x01' # from pcap 
entire_message = msg_type + msg_code + msg_checksum_padding + rest_header + payload_body 
entire_chk = checksum(entire_message) 
print entire_chk, '{:x}'.format(entire_chk), '(host byte order)' 

Когда я бегу это на мой (Little Endian) машины, я получаю:

$ ./icmp_checksum_test.py 
52695 cdd7 (host byte order) 
52175 cbcf (host byte order) 
+0

Вы говорите дейтаграмм ICMP? Тип (8 бит), код (8 бит), контрольная сумма (16 бит) и сообщение. Но как это сделать в Python? Благодаря !! – newuser

+0

@newuser, я распространил ответ, чтобы включить более подробную информацию. Это просто вопрос включения других полей в качестве входных данных. –

+0

спасибо вам большое. Я все понимаю !! Я мог бы получить некоторые подробности о «msg_checksum_padding» и «rest_header»? – newuser

Смежные вопросы