Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: DLL Funktion Hook - Allgemeingültige Lösung / Codevorlag

  Alt 19. Jul 2009, 21:37
Hallo.

Irgendwie scheint das nicht ganz zu funktionieren.

Ich habe jetzt folgenden Code:

Delphi-Quellcode:
  @origMessageBoxA := GetProcAddress(LoadLibrary('winmm.dll'),'midiOutOpen');

  uallHook.HookCode(@origMessageBoxA,@callbackMessageBoxA,@newMessageBoxA);

  readln;

  uallHook.UnhookCode(@newMessageBoxA);
In meiner überschriebenen Funktion wird ein writeln() ausgeführt. Kann es sein, dass midiOutOpne nicht systemweit überschrieben wird? Wie kann ich die Funktion für einen fremden Prozess überschreiben?

// Edit

Nochmal mit MessageBoxA mit den originalen Examples probiert. Ein anderer Prozess ruft MessageBoxA() auf.

* uallHook.HookCode --> Kein Einfluss im Fremdprozess!
* ualltableHook.HookApiJmp --> Kein Einfluss im Fremdprozess!
* uallHook.HookApiIAT --> Kein Einfluss im Fremdprozess!
* uallRelocHook.HookRelocationTable --> Kein Einfluss im Fremdprozess!

(Jeweils zwei Tests gemacht: Fremdprozess läuft bereits und Fremdprozess wurde nach dem Hook gestartet)

Was soll ich machen, damit der Fremdprozess sein Verhalten bezüglich der API Funktion ändert?

// Edit 2

Ich habe mir auch mal das 1337 Example angeschaut und es hatte funktioniert. Jetzt habe ich es auf MessageBoxA umgestellt und es funktioniert nicht! Ich weiß nicht mehr, was ich machen soll.

Hier der komplette Testfall!

HOOK.DLL

Delphi-Quellcode:
library hook;

uses
  windows,
  sysutils,
  uallDisasm in '..\..\uallDisasm.pas',
  uallDisasmEx in '..\..\uallDisasmEx.pas',
  uallHook in '..\..\uallHook.pas',
  uallKernel in '..\..\uallKernel.pas',
  uallProcess in '..\..\uallProcess.pas',
  uallProtect in '..\..\uallProtect.pas',
  uallUtil in '..\..\uallUtil.pas';

var
  origMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
  newMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;

function callbackMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
  Result := newMessageBoxA(hWnd,PChar(lpText+' [hooked]'),lpCaption,uType);
end;

procedure injectmain;
var h: integer;
begin
  h := GetModuleHandle('user32.dll');
  if h > 0 then
  begin
    @origMessageBoxA := GetProcAddress(h,'MessageBoxA');
    if @origMessageBoxA <> nil then
      uallHook.HookCode(@origMessageBoxA,@callbackMessageBoxA,@newMessageBoxA);
  end;
end;

procedure uninjectmain;
begin
  uallHook.UnhookCode(@newMessageBoxA);
end;

procedure dllmain(dwReason: integer);
begin
  case dwreason of
    DLL_PROCESS_ATTACH:
      injectmain;
    DLL_PROCESS_DETACH:
      uninjectmain;
  end;
end;

begin
  DLLProc := @DLLMain;
  DLLMain(1);
end.
EXEMAIN.EXE

Delphi-Quellcode:
program exemain;

uses
  windows,
  tlhelp32,
  uallDisasm in '..\..\uallDisasm.pas',
  uallDisasmEx in '..\..\uallDisasmEx.pas',
  uallHook in '..\..\uallHook.pas',
  uallKernel in '..\..\uallKernel.pas',
  uallProcess in '..\..\uallProcess.pas',
  uallProtect in '..\..\uallProtect.pas',
  uallUtil in '..\..\uallUtil.pas';

const lh = '1337 hook';

begin
  if paramcount < 1 then
    MessageBox(0,'No Param, use PARAM -load / -unload to use 1337 hook',lh,0) else

  if uppercase(paramstr(1)) = uppercase('-load') then
    GlobalInjectLibrary(pchar(uallUtil.GetExeDirectory+'hook.dll')) else

  if uppercase(paramstr(1)) = uppercase('-unload') then
    GlobalUnloadLibrary(pchar('hook.dll')) else

    MessageBox(0,'Wrong Param, use PARAM -load / -unload to use 1337 hook',lh,0);
end.
TEST.EXE (Teil)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageBoxA(handle, 'X', 'Y', 0);
end;
Ergebnis: Ich habe die Hook-DLL geladen (-load) und die Test.exe gestartet. Die erscheinende MessageBoxA hat nicht den erwarteten Zusatz " [hooked]".

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat