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