Home › Forums › Discussions › Support › Modify packet [DELPHI]
- This topic has 8 replies, 5 voices, and was last updated 13 years, 1 month ago by SergeySW.
-
AuthorPosts
-
June 22, 2004 at 10:29 am #4856
Hi,
I need to modify packet, but how to calculate the new checksum in Delphi
I have tried to translate C++ example, but it doesn’t work 🙁
Thank for your help
(sorry for my english).
June 24, 2004 at 6:16 am #5575Try it. It is universal function.
p – pointer to begin of header.
Size – size of header in words.
Attention: Field Checksum must be = 0 before call function.function Checksum(p: PWORD; Size: word): WORD;
var
i: Integer;
Sum: DWORD;
begin
Sum := 0;
for i := 0 to Size – 1 do
begin
Sum := Sum + ntohs(p^);
inc(p);
end;
while (Sum shr 16) > 0 do
Sum := (Sum and $FFFF) + (Sum shr 16);
Sum := not Sum;
Result := Sum;
end;Examples:
1. Calc checksum for IPHeader. For uses without IPOptions.IPHeader.Checksum := 00;
IPHeader.Checksum := htons(Checksum(Pword(IPHeader), sizeof(IP_HDR) div 2));2. Calc checksum for ICMPHeader.
IcmpHeader.Checksum := 00;
IcmpHeader.Checksum := htons(Checksum(Pword(IcmpHeader),
(sizeof(ICMP_HDR)+Length(Data)) div 2));Don`t forget call htons for result of function Checksum.
Sorry for my English.June 24, 2004 at 9:45 am #5576Thank for your help 🙂
But how to calculate TCP checksum ?
I’ve tried your function but the checksum is incorrect
Thanks
June 24, 2004 at 10:45 am #5577Checksum = calculate (pointer, (header+data) div 2), as for ICMP as TCP
Example:
Packet = ETH_HDR+IP_HDR+TCP_HDR+Data;
IP_HDR.Checksum := 00;
IP_HDR.Checksum := htons(Checksum(Pword(IP_HDR), sizeof(IP_HDR) div 2));
TCP.Checksum := 00;
TCP_HDR.Checksum := htons(Checksum(Pword(TCP_HDR), sizeof((TCP_HDR+Length(Data)) div 2));
For more: See ICMP example in previous reply
June 26, 2004 at 5:58 am #5578Why i can’y calc TCP checksum? Please help
first, i decare this
TIPHeaderPtr = ^TIPHeader;
TIPHeader = packed record
VerLen: Byte; //HL
TOS: Byte;
TotalLen: Word;
Identifer: Word;
FragOffsets: Word;
TTL: Byte;
Protocol: Byte;
CheckSum: Word;
SourceIp: DWORD;
DestIp: DWORD;
// Options: DWORD;
end;
TTCPHeaderPtr = ^TTCPHeader;
TTCPHeader = packed record
SourcePort:Word;
DestPort:Word;
SequenceNumber:DWord;
AcknowledgementNumber:DWord;
Offset:Byte; //only left 4 bits. Header length in 32-bit segments
Flags:Byte;
Window:Word;
Checksum:Word; //includes speudo header instead of TCP header.
UrgentPointer:Word;
end;
pTCPData: PChar;
after that i get IP header and calc IP check sum is collect but why i can’t calc TCP checksum. the code like below.
pTCPHeader.Checksum := 00;
pTCPHeader.Checksum := htons(Checksum(Pword(pTCPHeader), (sizeof(TTCPHeader)+length(pTCPData)) div 2));
i forgot something? or i should not use PChar for get the TCP data?
June 27, 2004 at 9:43 am #5579@PLY wrote:
Why i can’y calc TCP checksum? Please help
first, i declare this
TIPHeaderPtr = ^TIPHeader;
TIPHeader = packed record
VerLen: Byte; //HL
TOS: Byte;
TotalLen: Word;
Identifer: Word;
FragOffsets: Word;
TTL: Byte;
Protocol: Byte;
CheckSum: Word;
SourceIp: DWORD;
DestIp: DWORD;
// Options: DWORD;
end;
TTCPHeaderPtr = ^TTCPHeader;
TTCPHeader = packed record
SourcePort:Word;
DestPort:Word;
SequenceNumber:DWord;
AcknowledgementNumber:DWord;
Offset:Byte; //only left 4 bits. Header length in 32-bit segments
Flags:Byte;
Window:Word;
Checksum:Word; //includes speudo header instead of TCP header.
UrgentPointer:Word;
end;
pTCPData: PChar;
after that i get IP header and calc IP check sum is collect but why i can’t calc TCP checksum. the code like below.
pTCPHeader.Checksum := 00;
pTCPHeader.Checksum := htons(Checksum(Pword(pTCPHeader), (sizeof(TTCPHeader)+length(pTCPData)) div 2));
i forgot something? or i should not use PChar for get the TCP data?
June 29, 2004 at 6:45 am #5580I not absolutely understand a question, therefore I shall answer how I have understood it.
...
var
ReadRequest: ETH_REQUEST;
Buffer: INTERMEDIATE_BUFFER;
pEthernetHeader: PETHERNET_HDR;
pIpHeader: PIP_HDR;
pTCPHeader: PTCP_HDR;
pData: Pbyte;
DataSize: Integer;
...
const
HSIZE = sizeof(ETHERNET_HDR) + sizeof(IP_HDR)+ sizeof(ICMP_HDR);
...
ReadRequest.EthPacket.Buffer := @Buffer;
ReadRequest.hAdapterHandle := hAdapter;
...
if ReadPacket (hFilt, @ReadRequest) <> 0 then
begin
...
pEthernetHeader := @ReadRequest.EthPacket.Buffer.m_IBuffer;
pIPHeader := Pointer(integer(pEthernetHeader)+sizeof(ETHERNET_HDR));
pTCPHeader := Pointer(integer(pIPHeader)+sizeof(IP_HDR));
DataSize := ReadRequest.EthPacket.Buffer.m_Length - HSIZE;
PData := Pointer(integer(pEthernetHeader)+HSIZE);
// or so
//PData := Pointer(integer(pTCPHeader)+sizeof(TCP_HDR));
...
// Change Port Destination to 4032
pTCPHeader.Destination := htons(4032);
// Tne IPHeader checksum it is not recalculated therefore as the size of a package has not changed
pTCPHeader.CheckSum := 00;
pTCPHeader.Checksum := htons(Checksum(Pword(pTCPHeader), (sizeof(TCP_HDR) + DataSize) div 2));
//If the size of a packet has changed, it is necessary to align a packet to word and recalc IP Header and accordingly TCP Header
...
SendPacketToAdapter(hFilt, @ReadRequest);
end;
...
In a code there can be mistakes, for what beforehand apologize.
September 5, 2011 at 12:46 pm #5581Hi
i write a program with delphi
but i have problem Correct Calculate TCP CheckSum
i used code write by “heilong”
give correct on IPcheksum And ICMPcheksum
but on UDP & TCP incorect result
i think this code need “pseudo header”
See Picture :i read all other post in froums about CheckSum ,
and read all fucntion in C++ to calculatechecksumi can convert this code to DLL and export fucntion:
http://www.netfor2.com/tcpsum.htm
but I do not know used parammerter in delphiBut i can’t wirte a correct algoritm in delphi 🙁
or give me any solution in DELPHI to i can correct TCP & UDP checksum Calculate
.Edited @00:14 AM , used 🙂 OKY 😯
دهنمو گاید ، ولی بلاخره شد ، ای مردشور هرچی پوینتر هست ببرن 🙂
October 27, 2011 at 7:25 pm #5582
function RecalculateTCPChecksum(aLen: Integer; aSrcAddr, aDstAddr: Cardinal; buff: PByteArray): Word;
var
w16,padd: word;
i,sum: ulong;
sIP,dIP: in_addr;
begin
padd := 0;
sum := 0;
if (aLen div 2) * 2 <> aLen then begin
padd := 1;
buff[aLen] := 0;
end;
i := 0;
while i < aLen+padd do begin
w16 := ((buff shl 8)and $FF00) + (buff[i+1]and $FF);
sum := sum + dword(w16);
i := i + 2;
end;
//add IP length
sIP := in_addr(aSrcAddr);
dIP := in_addr(aDstAddr);
sum := sum + ntohs(sIP.S_un_w.s_w1) + ntohs(sIP.S_un_w.s_w2);
sum := sum + ntohs(dIP.S_un_w.s_w1) + ntohs(dIP.S_un_w.s_w2);
sum := sum + IPPROTO_TCP + word(aLen);
while (sum shr 16)>0 do
sum := (sum and $FFFF)+(sum shr 16);
sum := not sum;
sum := htons(sum);
Result := sum;
end;
aaLen := ntohs(pIPHeader.TotalLen) - ((pIPHeader.VerLen and $F)*4);
pTCPHeader.Checksum := 0;
testSum := RecalculateTCPChecksum(aaLen, pIPHeader.SourceIp, pIPHeader.DestIp, byteArray(pTCPHeader));
pTCPHeader.Checksum := testSum;
-
AuthorPosts
- You must be logged in to reply to this topic.