Thema: Delphi Problem mit uallHook

Einzelnen Beitrag anzeigen

StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#1

Problem mit uallHook

  Alt 30. Mai 2006, 12:52
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.
  Mit Zitat antworten Zitat