Einzelnen Beitrag anzeigen

WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#1

Rückkehradresse bei Hook

  Alt 19. Dez 2010, 12:56
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?
  Mit Zitat antworten Zitat