Einzelnen Beitrag anzeigen

sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Detours : Routinen hooken

  Alt 5. Okt 2007, 15:02
Naja, es ist schon die richtige Größe.

Wenn ich z.B. Sleep aus der kernel32.dll hooken möchte, dann bestehen
die Bytes, die ich überschreibe aus dem stdcall. Dies rekonstruiere ich
bei der neuen Sleep wieder.

Falls es jemand anderen noch interessiert, hier der Code mit Beispiel.

Delphi-Quellcode:

var origSleep: Pointer;

procedure NewSleep(dwMilliseconds: Cardinal);stdcall;
begin
  MessageBox(0, 'Hallo aus der neuen Prozedur.', 'NewSleep', MB_ICONINFORMATION);
  asm
    jmp origSleep
  end;
end;

function DetourHook(lpModule, lpRoutine: PChar; pNewAddr: Pointer):Pointer;
type
  TDetourRec = packed record
    bJmpOpcode: Byte;
    dwAddress: DWord;
end;
var
  lpDetourCode: TDetourRec;
  lpGatewayCode: TDetourRec;
  pTargetAddr: Pointer;
  pJmpGateway: Pointer;
  dwTargetProtect: DWord;
const
  DETOUR_JMP = $E9;
  DETOUR_SIZE = $05;
begin
  result := nil;

  pTargetAddr := GetProcAddress(GetModuleHandle(lpModule), lpRoutine);
  if pTargetAddr = nil then exit;

  pJmpGateway := VirtualAlloc(0, DETOUR_SIZE, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  if pJmpGateway <> nil then
  begin

    lpDetourCode.bJmpOpcode := DETOUR_JMP;
    lpDetourCode.dwAddress := DWord(pNewAddr) - DWord(pJmpGateway) - DETOUR_SIZE;

    CopyMemory(pJmpGateway, @lpDetourCode, DETOUR_SIZE);

    lpGatewayCode.bJmpOpcode := DETOUR_JMP;
    lpGatewayCode.dwAddress := DWord(pJmpGateway) - DWord(pTargetAddr) - DETOUR_SIZE;

    if VirtualProtect(pTargetAddr, DETOUR_SIZE, PAGE_EXECUTE_READWRITE, dwTargetProtect) then
    begin
      CopyMemory(pTargetAddr, @lpGatewayCode, DETOUR_SIZE);
      result := Pointer(DWord(pTargetAddr) + DETOUR_SIZE);
    end;
  end;
end;

begin
  origSleep := DetourHook('kernel32.dll', 'Sleep', @NewSleep);
  if origSleep = nil then ExitProcess(0);
  Sleep(2007);
  MessageBox(0, 'I slept 2007 milliseconds', 'EntryPoint', MB_ICONINFORMATION);
end.
Ja, ich weiß, ich brauch gar keinen Speicherbereich allozieren, es geht auch
mit weniger Code, bzw. einfacher, aber das kann ja jeder selbst ändern.
  Mit Zitat antworten Zitat