Hallo,
ich bin gerade dabei einen Packet-Sniffer für ein Spiel zu schreiben und möchte das durch Hooks in ws2_32.dll machen.
Normalerweise läuft das so ab:
Spiel -> ws2_32.send -> Spiel
Ich möchte folgendes:
Spiel -> ws2_32.send (gepatchter Code) -> Sniffer-
DLL -> ws2_32.send -> Sniffer-
DLL -> Spiel
Der erste Teil (Hook) funktioniert schon mit diesem Code:
Delphi-Quellcode:
type
TRecvSend =
function(s: TSocket;
var Buf; len, flags: Integer): Integer;
stdcall;
var
hWS, SendRet: Cardinal;
function NewSend(s: TSocket;
var Buf; len, flags: Integer): Integer;
stdcall;
begin
Result := TRecvSend(SendRet)(s, Buf, len, flags);
raise Exception.Create('
Test');
end;
function JMP(iFrom, iTo: Cardinal): Cardinal;
begin
Result := (iTo - iFrom) - 5;
end;
var
F, o, o2: Cardinal;
begin
hWS := LoadLibraryA('
ws2_32.dll');
[...]
F := Cardinal(GetProcAddress(hWS, '
send'));
SendRet := F + 5;
VirtualProtect(Pointer(F), 5, PAGE_EXECUTE_READWRITE, o);
PByte(F)^ := $E9;
PCardinal(F + 1)^ := JMP(F, DWORD(@NewSend));
VirtualProtect(Pointer(F), 5, o, o2);
end.
Ich sehe, dass das Spiel die Pakete an den Server sendet, allerdings wird der nachfolgende Code (hier testweise eine
Exception) nicht mehr ausgeführt. Meine Vermutung ist, dass er irgendwie direkt ins Spiel zurückspringt.
Das heißt, ich müsste die Rückkehradresse speichern, sie dann auf mein NewSend setzen und dann am Ende mit der Adresse ins Spiel zurückkehren.
Weiß jemand wie das geht?