Контрольная сумма TCP/IP,UDP,ICMP

Тема в разделе "WASM.NETWORKS", создана пользователем AlexeyR777, 16 сен 2006.

  1. AlexeyR777

    AlexeyR777 Alexey

    Публикаций:
    0
    Регистрация:
    12 сен 2006
    Сообщения:
    2
    Вот написал процедуру перерасчёта контрольной суммы пакета. Когда пакет приходит то я меняю IP адреса и необходим перерасчёт контрольной суммы. Но почемуто в сниффере отображается что контрольная сумма не верна.
    Помогите... Может где-то в коде ошибка...

    На вход: Указатель на пришедший пакет. Без заголовка ether
    Размер всего пакета.
    Процедура должна пересчитать контрольную сумму у IP,TCP,ICMP,UDP пакета...

    Код (Text):
    1. RebuildChecksum proc PackBuff: DWORD, PackLen: DWORD
    2.     LOCAL PPacket       : DWORD
    3.     LOCAL PLenght       : DWORD
    4.     LOCAL POther        : DWORD
    5.     LOCAL srcip         : DWORD
    6.     LOCAL dstip         : DWORD
    7.     LOCAL Chksum        : WORD
    8.     LOCAL IPpacket[sizeof ip_hdr] : BYTE
    9.     LOCAL Ptype         : BYTE
    10.    
    11.         mov eax, [PackBuff]
    12.         add eax, sizeof ip_hdr
    13.         mov [POther],eax
    14.         sub eax, sizeof pseudo_hdr
    15.         mov [PPacket], eax
    16.        
    17.         mov eax, [PackLen]
    18.         sub eax, sizeof ip_hdr              ; Длина пакета без IP заголовка
    19.         add eax, sizeof pseudo_hdr
    20.         mov [PLenght], eax
    21.        
    22.         mov esi, [PackBuff]
    23.         mov eax, (ip_hdr ptr [esi]).ip_src
    24.         mov [srcip], eax
    25.         mov eax, (ip_hdr ptr [esi]).ip_dest
    26.         mov [dstip], eax
    27.        
    28.         invoke ChkSumm, esi, sizeof ip_hdr  ; Считаем контрольную сумму IP пакета
    29.         mov (ip_hdr ptr [esi]).ip_cksum, ax
    30.         mov ecx, sizeof ip_hdr
    31.         lea edi, IPpacket
    32.         rep movsb                           ; Сохраняем IP пакет
    33.        
    34.         ; Проверяем какому протоколу мы будем вычислять контрольную сумму
    35.         mov edi, [PackBuff]
    36.         mov al, (ip_hdr ptr [edi]).ip_p
    37.         .if al == IPPROTO_TCP
    38.             mov [Ptype], IPPROTO_TCP   
    39.         .endif
    40.        
    41.         .if al == IPPROTO_ICMP
    42.             mov [Ptype], IPPROTO_ICMP
    43.         .endif
    44.        
    45.         .if al == IPPROTO_UDP
    46.             mov [Ptype], IPPROTO_UDP
    47.         .endif 
    48.        
    49.         invoke RtlZeroMemory, [PPacket], sizeof pseudo_hdr
    50.         mov edi, [PPacket]
    51.         mov eax, [srcip]
    52.         mov (pseudo_hdr ptr [edi]).src_addr, eax
    53.         mov eax, [dstip]
    54.         mov (pseudo_hdr ptr [edi]).dst_addr, eax
    55.         mov byte ptr al, [Ptype]
    56.         mov (pseudo_hdr ptr [edi]).protocol, al ;IPPROTO_?
    57.         mov eax,[PLenght]
    58.         sub eax, sizeof pseudo_hdr ; Длина пакета без псевдо заголовка
    59.         invoke htons, eax
    60.         mov (pseudo_hdr ptr [edi]).len,ax
    61.        
    62.         invoke ChkSumm, [PPacket], [PLenght]    ; Считаем контрольную сумму пакета
    63.         mov [Chksum],ax
    64.        
    65.         mov edi, [PackBuff]
    66.         lea esi, IPpacket
    67.         mov ecx, sizeof ip_hdr
    68.         rep movsb
    69.        
    70.         mov byte ptr al, [Ptype]
    71.         .if al == IPPROTO_TCP
    72.             mov word ptr ax,[Chksum]
    73.             mov edi,[POther]
    74.             mov (tcp_hdr ptr [edi]).tcp_cksum,ax
    75.         .endif
    76.        
    77.         .if al == IPPROTO_ICMP
    78.             mov word ptr ax,[Chksum]
    79.             mov edi,[POther]
    80.             mov (icmp_hdr ptr [edi]).icmp_cksum,ax
    81.         .endif
    82.        
    83.         .if al == IPPROTO_UDP
    84.             mov word ptr ax,[Chksum]
    85.             mov edi,[POther]
    86.             mov (udp_hdr ptr [edi]).udp_cksum,ax
    87.         .endif 
    88.  
    89.     ret
    90.  
    91. RebuildChecksum endp
    Процедура расчёта контрольной суммы верна... Вот на всяк случай...
    Код (Text):
    1. ChkSumm proc pData:dword, SzData:dword
    2.  
    3.     LOCAL tmpVal : dword
    4.  
    5.     mov tmpVal, 0
    6.     @@:
    7.     cmp SzData, 1
    8.     jle @f
    9.     mov eax, pData
    10.     xor ecx, ecx
    11.     mov cx, [eax]
    12.     mov edx, tmpVal
    13.     add edx, ecx
    14.     mov tmpVal, edx
    15.     mov eax, pData
    16.     add eax, 2
    17.     mov pData, eax
    18.     mov ecx, SzData
    19.     sub ecx, 2
    20.     mov SzData, ecx
    21.     jmp @b
    22.     @@:
    23.     cmp SzData, 0
    24.     jz @f
    25.     mov edx, pData
    26.     xor eax, eax
    27.     mov al, [edx]
    28.     mov ecx, tmpVal
    29.     add ecx, eax
    30.     mov tmpVal, ecx
    31.     @@:
    32.     mov edx, tmpVal
    33.     shr edx, 10h
    34.     mov eax, tmpVal
    35.     and eax, 0FFFFh
    36.     add edx, eax
    37.     mov tmpVal, edx
    38.     mov ecx, tmpVal
    39.     shr ecx, 10h
    40.     mov edx, tmpVal
    41.     add edx, ecx
    42.     mov tmpVal, edx
    43.     mov eax, tmpVal
    44.     not eax
    45.     ret
    46.  
    47. ChkSumm endp
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Что-то я не вижу обнуления ячеек с контрольной суммой перед её расчётом.
    Еще не совсем понятно зачем так часто использовать tmpVal, когда можно всё сделать в регистрах(смотреть самый первый вариант): http://www.wasm.ru/forum/viewtopic.php?id=16048
     
  3. AlexeyR777

    AlexeyR777 Alexey

    Публикаций:
    0
    Регистрация:
    12 сен 2006
    Сообщения:
    2
    Большое спасибо. Я разобрался.