AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL Funktion Hook - Allgemeingültige Lösung / Codevorlage?
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Funktion Hook - Allgemeingültige Lösung / Codevorlage?

Offene Frage von "blackdrake"
Ein Thema von blackdrake · begonnen am 19. Jul 2009 · letzter Beitrag vom 23. Jul 2009
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz