Hi zusammen,
ich habe Probehalber mal versucht, eine
API mit der uallCollection zu hooken.
mein Code dazu sieht so aus
Hauptprogramm:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
btn: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses uallHook;
procedure TForm1.FormCreate(Sender: TObject);
var
result : Cardinal;
begin
result := GlobalInjectLibrary(pchar('
terminateprocessdll.dll'));
showmessage(inttostr(result));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalUnloadLibrary(pchar('
terminateprocessdll.dll'));
end;
end.
DLL :
Delphi-Quellcode:
library terminateprocessdll;
uses
SysUtils,
windows,
uallHook,
Classes;
var
oldTerminateProcess, nextTerminateProcess : function(hProcess : Cardinal; uExitCode : Integer) : LongBool; stdcall;
{$R *.res}
function myTerminateProcess(hProcess : Cardinal; uExitCode : Integer) : LongBool; stdcall;
begin
result := False;
end;
procedure injectmain;
var
h : integer;
begin
h := GetModuleHandle(kernel32);
if h > 0 then
begin
@oldTerminateProcess := GetProcAddress(h,'TerminateProcess');
if @oldTerminateProcess <> nil then
HookCode(@oldTerminateProcess,@myTerminateProcess,@nextTerminateProcess);
end;
end;
procedure uninjectmain;
begin
UnhookCode(@nextTerminateProcess);
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.
Das Ganze kompiliert ohne Murren, nur passiert nichts. Beim Debuggen hab ich auch gesehen warum.
in diesem Teil aus der Funktion
InjectLibrary...
Delphi-Quellcode:
dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessID);
if (dwProcessID2 = 0)
then
Exit;
{Cant open the target process with all access rights.}
... liefert OpenProcess() eine 0 zurück und folgedem wird das EXIT ausgeführt.
Die Frage ist nun, warum habe ich nicht die nötigen Zugriffsrechte und wovon hängen diese ab? (Bin in der Gruppe Administratoren)
PS : Die Funktion TerminateProcess habe ich nur zu Testzwecken genommen, weil die so wenig Parameter hatte und man den Erfolg leicht nachvollziehen kann.