Re: Same here, at Sofia

Home Forums Discussions Support Portal Modify TTL of the packets Re: Same here, at Sofia

#5995

wise_guybg
Participant

Same here, at Sofia… I can’t use inet on my laptop brought from work. Simple Windows ICS from my desktop PC doesn’t work so I had to play with the NTKernel goodies. Really nice libs. Thanks guys.

Let’s go to implementation:
1. Start with the PassThru example
2. Add some checks on the received packet
3. ttl=5
4. checksum=0
5. checksum=RecalcChecksum(ipheader, ipheaderlen)

I had the most problems on the checksum as different functions found on the net work with different params and it was hard to set it correctly. Now it works 🙂

some delphi code:


while not Terminated and (ReadPacket(hFilt, @ReadRequest) <> 0) do
begin
try
pEtherHeader := TEtherHeaderPtr(@Buffer.m_IBuffer);
// Check for IP protocol and OnReceive flag
if ntohs(pEtherHeader.h_proto) = ETH_P_IP then
begin
pIPHeader := TIPHeaderPtr(Integer(pEtherHeader) +
SizeOf(TEtherHeader));

// Check if TTL causes problems
if pIPHeader.TTL < = ERR_TTL then
begin
pIPHeader.TTL := NEW_TTL;
pIPHeader.Checksum := 0;
pIPHeader.Checksum := htons(
Checksum(PWord(pIPHeader),
(SizeOf(TIPHeader) - SizeOf(DWORD)) div 2));
end;
end;
finally
// Send the request down the line
if Buffer.m_dwDeviceFlags = PACKET_FLAG_ON_SEND then
// Place packet on the network interface
SendPacketToAdapter(hFilt, @ReadRequest)
else
// Indicate packet to MSTCP
SendPacketToMstcp(hFilt, @ReadRequest);
end;
end;
end;