Delphi hook to redirect to different ip
Posted
by Chris
on Stack Overflow
See other posts from Stack Overflow
or by Chris
Published on 2010-05-19T18:53:37Z
Indexed on
2010/05/20
1:40 UTC
Read the original article
Hit count: 436
What is the best way to redirect ANY browser to a different ip for specific sites? For example if the user will type www.facebook.com in any browser he will be redirected to 127.0.0.1. Also the same should happen if he will type 66.220.146.11.
What I have until now is this: using the winpkfilter I am able to intercept all the traffic on port 80, with type(in or out), source ip, destination ip and packet. My problem is to modify somehow the packet so the browser will be redirected.
This is the code that i have right now:
program Pass;
{$APPTYPE CONSOLE}
uses SysUtils, Windows, Winsock, winpkf, iphlp;
var iIndex, counter : DWORD; hFilt : THANDLE; Adapts : TCP_AdapterList; AdapterMode : ADAPTER_MODE; Buffer, ParsedBuffer : INTERMEDIATE_BUFFER; ReadRequest : ETH_REQUEST; hEvent : THANDLE; hAdapter : THANDLE; pEtherHeader : TEtherHeaderPtr; pIPHeader : TIPHeaderPtr; pTcpHeader : TTCPHeaderPtr; pUdpHeader : TUDPHeaderPtr; SourceIP, DestIP : TInAddr;
thePacket : PChar;
f : TextFile;
SourceIpString, DestinationIpString : string; SourceName, DestinationName : string;
function IPAddrToName(IPAddr : string) : string; var SockAddrIn : TSockAddrIn; HostEnt : PHostEnt; WSAData : TWSAData; begin WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr)); HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt <> nil then begin result := StrPas(Hostent^.h_name) end else begin result := ''; end; end;
procedure ReleaseInterface(); begin // Restore default mode AdapterMode.dwFlags := 0; AdapterMode.hAdapterHandle := hAdapter; SetAdapterMode(hFilt, @AdapterMode);
// Set NULL event to release previously set event object SetPacketEvent(hFilt, hAdapter, 0);
// Close Event if hEvent <> 0 then CloseHandle(hEvent);
// Close driver object CloseFilterDriver(hFilt);
// Release NDISAPI FreeNDISAPI(); end;
begin
// Check the number of parameters if ParamCount() < 2 then begin Writeln('Command line syntax:'); Writeln(' PassThru.exe index num'); Writeln(' index - network interface index.'); Writeln(' num - number or packets to filter'); Writeln('You can use ListAdapters to determine correct index.'); Exit; end;
// Initialize NDISAPI InitNDISAPI();
// Create driver object hFilt := OpenFilterDriver('NDISRD');
if IsDriverLoaded(hFilt) then begin
// Get parameters from command line
iIndex := StrToInt(ParamStr(1));
counter := StrToInt(ParamStr(2));
// Set exit procedure
ExitProcessProc := ReleaseInterface;
// Get TCP/IP bound interfaces
GetTcpipBoundAdaptersInfo(hFilt, @Adapts);
// Check paramer values
if iIndex > Adapts.m_nAdapterCount then
begin
Writeln('There is no network interface with such index on this system.');
Exit;
end;
hAdapter := Adapts.m_nAdapterHandle[iIndex];
AdapterMode.dwFlags := MSTCP_FLAG_SENT_TUNNEL or MSTCP_FLAG_RECV_TUNNEL;
AdapterMode.hAdapterHandle := hAdapter;
// Create notification event
hEvent := CreateEvent(nil, TRUE, FALSE, nil);
if hEvent <> 0 then
if SetPacketEvent(hFilt, hAdapter, hEvent) <> 0 then
begin
// Initialize request
ReadRequest.EthPacket.Buffer := @Buffer;
ReadRequest.hAdapterHandle := hAdapter;
SetAdapterMode(hFilt, @AdapterMode);
counter := 0;
//while counter <> 0 do
while true do
begin
WaitForSingleObject(hEvent, INFINITE);
while ReadPacket(hFilt, @ReadRequest) <> 0 do
begin
//dec(counter);
pEtherHeader := TEtherHeaderPtr(@Buffer.m_IBuffer);
if ntohs(pEtherHeader.h_proto) = ETH_P_IP then
begin
pIPHeader := TIPHeaderPtr(Integer(pEtherHeader) +
SizeOf(TEtherHeader));
SourceIP.S_addr := pIPHeader.SourceIp;
DestIP.S_addr := pIPHeader.DestIp;
if pIPHeader.Protocol = IPPROTO_TCP then
begin
pTcpHeader := TTCPHeaderPtr(Integer(pIPHeader) +
(pIPHeader.VerLen and $F) * 4);
if (pTcpHeader.SourcePort = htons(80)) or
(pTcpHeader.DestPort = htons(80)) then
begin
inc(counter);
if Buffer.m_dwDeviceFlags = PACKET_FLAG_ON_SEND
then
Writeln(counter, ') - MSTCP --> Interface')
else
Writeln(counter, ') - Interface --> MSTCP');
Writeln(' Packet size = ',
Buffer.m_Length);
Writeln(Format(' IP %.3u.%.3u.%.3u.%.3u --> %.3u.%.3u.%.3u.%.3u PROTOCOL: %u',
[byte(SourceIP.S_un_b.s_b1),
byte(SourceIP.S_un_b.s_b2),
byte(SourceIP.S_un_b.s_b3),
byte(SourceIP.S_un_b.s_b4),
byte(DestIP.S_un_b.s_b1),
byte(DestIP.S_un_b.s_b2),
byte(DestIP.S_un_b.s_b3),
byte(DestIP.S_un_b.s_b4),
byte(pIPHeader.Protocol)]
));
Writeln(Format(' TCP SRC PORT: %d DST PORT: %d',
[ntohs(pTcpHeader.SourcePort),
ntohs(pTcpHeader.DestPort)]));
//get the data
thePacket := pchar(pEtherHeader) +
(sizeof(TEtherHeaderPtr) + pIpHeader.VerLen * 4
+ pTcpHeader.Offset * 4);
{
SourceIpString :=
IntToStr(byte(SourceIP.S_un_b.s_b1)) + '.' +
IntToStr(byte(SourceIP.S_un_b.s_b2)) + '.' +
IntToStr(byte(SourceIP.S_un_b.s_b3)) + '.' +
IntToStr(byte(SourceIP.S_un_b.s_b4));
DestinationIpString :=
IntToStr(byte(DestIP.S_un_b.s_b1)) + '.' +
IntToStr(byte(DestIP.S_un_b.s_b2)) + '.' +
IntToStr(byte(DestIP.S_un_b.s_b3)) + '.' +
IntToStr(byte(DestIP.S_un_b.s_b4));
}
end;
end;
end;
// if ntohs(pEtherHeader.h_proto) = ETH_P_RARP then
// Writeln(' Reverse Addr Res packet');
// if ntohs(pEtherHeader.h_proto) = ETH_P_ARP then
// Writeln(' Address Resolution packet');
//Writeln('__');
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);
{
if counter = 0 then
begin
Writeln('Filtering complete');
readln;
break;
end;
}
end;
ResetEvent(hEvent);
end;
end;
end;
end.
© Stack Overflow or respective owner