Note that there are some explanatory texts on larger screens.

plurals
  1. POICMP Checksum error
    text
    copied!<p>I am trying to checksum icmp packet using the same technique for tcp and udp but it get wrong checksum, can you tell me where is my problem ?</p> <pre><code> ICMP_HEADER *icmpheader = new ICMP_HEADER; memcpy(icmpheader,ICMPHeader,sizeof(ICMP_HEADER)); icmpheader-&gt;Checksum = 0; PSEUDO_HEADER *psheader = new PSEUDO_HEADER; memcpy(&amp;psheader-&gt;daddr, &amp;IPHeader-&gt;DestinationAddress, sizeof(UINT)); memcpy(&amp;psheader-&gt;saddr, &amp;IPHeader-&gt;SourceAddress, sizeof(UINT)); psheader-&gt;protocol = IPHeader-&gt;Protocol; psheader-&gt;length = htons((USHORT)(sizeof(ICMP_HEADER) + ICMPDataSize)); psheader-&gt;zero = 0x0000; UINT packet_size = sizeof(ICMP_HEADER) + ICMPDataSize + sizeof(PSEUDO_HEADER); packet_size = packet_size + ((packet_size%2)*2); UCHAR *icmppacket = (UCHAR*)malloc(packet_size); memset(icmppacket,0, packet_size); memcpy(icmppacket, psheader, sizeof(PSEUDO_HEADER)); memcpy(&amp;icmppacket[sizeof(PSEUDO_HEADER)], icmpheader,sizeof(ICMP_HEADER)); memcpy(&amp;icmppacket[sizeof(PSEUDO_HEADER) + sizeof(ICMP_HEADER)],ICMPData,ICMPDataSize); if (GlobalChecksum((USHORT*)icmppacket,packet_size) != ICMPHeader-&gt;Checksum) { isMalformed = true; PacketError = PACKET_ICMP_CHECKSUM; } USHORT cPacket::GlobalChecksum(USHORT *buffer, UINT length) { register int sum = 0; USHORT answer = 0; register USHORT *w = buffer; register int nleft = length; while(nleft &gt; 1){ sum += *w++; nleft -= 2; } sum = (sum &gt;&gt; 16) + (sum &amp; 0xFFFF); sum += (sum &gt;&gt; 16); answer = ~sum; return(answer); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload