Forum Replies Created
-
AuthorPosts
-
I 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.
Checksum = 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
Try 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. -
AuthorPosts