![]() |
Problem mit uallHook
Hi zusammen,
ich habe Probehalber mal versucht, eine API mit der uallCollection zu hooken. mein Code dazu sieht so aus Hauptprogramm:
Delphi-Quellcode:
DLL :
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.
Delphi-Quellcode:
Das Ganze kompiliert ohne Murren, nur passiert nichts. Beim Debuggen hab ich auch gesehen warum.
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. in diesem Teil aus der Funktion InjectLibrary...
Delphi-Quellcode:
... liefert OpenProcess() eine 0 zurück und folgedem wird das EXIT ausgeführt.
dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessID);
if (dwProcessID2 = 0) then Exit; {Cant open the target process with all access rights.} 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. |
Re: Problem mit uallHook
Nun, es könnte natürlich sein, dass du auf bestimmte Prozesse nicht die vollen Zugriffsrechte bekommst (bei mir z.B. ZoneAlarm), oder dass dieser Zugriff durch andere Programme geblockt wird (bei mir z.B. wieder ZoneAlarm).
Es könnte natürlich auch noch sein, dass du ne veraltete Version der uallCollection hast: Zitat:
Delphi-Quellcode:
Wobei ich das gerade nicht ganz nachvollziehen kann ... (sagen wir so, es erscheint mir falsch zu sein ... :D )
dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
if (dwProcessID2 <> 0) then dwProcessID := dwProcessID2; Alternativ könntest du dich an den Autor Brechi selbst wenden, oder eine andere Hookinglibrary ausprobieren, z.B. ![]() Oder du wartest darauf, dass Brechi mal wieder selbst hier vorbeischaut ... ^^ ciao, Philipp |
Re: Problem mit uallHook
ok hab die "neue" Version runtergeladen.
jetzt gibt OpenProcess immer noch 0 zurück, das Programm läuft wegen der geänderten Abfrage ja weiter. Jetzt gibt
Delphi-Quellcode:
aber auch nil zurück, was dazu führt, dass das ganze bei
pLLA := GetProcAddress(GetModuleHandleA('kernel32.dll'),'LoadLibraryA');
Delphi-Quellcode:
rausspringt und nichts tut :(
if (pLLA <> nil) and (pTargetMemory <> nil) and (pLibraryName <> nil) then
|
Re: Problem mit uallHook
Hi Stefan.
Ich hatte deine PN bekommen, hatte aber nur kurz reingeschaut. Da war jedenfalls ein Bug im Disassembler. (Und ist auch noch in der Version die ich geupped habe). Zu dem OpenProcess. Das ist nur dazu da, damit ich mit einem bereits geöffneten Processhandle weiterarbeiten kann. Deshalb versuche ich die ID die übergeben wurde nochmal zu öffnen, failed es, so muss es bereis ein Handle sein. Ist also dafür da, damit ich support für ProcessID und ProcessHandle habe. Die alte version hatte noch keine GetProcessID funktion, die musste ich erst für WinNT < XP und Win9x nachbauen. ALso selbs wenn OpenProcess failed, heißt es nicht das es nicht funktionieren kann, dann wird einfach von einem ProcessHandle ausgegangen. Sicher, dass das LoadLibrary / GetProcAddress failed? Könnte ja auch sein, dass du keinen Speicher bekommen hast. Anstatt Globales InjectLibrary zu testen, versuch es besser erst mal mit einem Prozess. Um es in die Systemprozesse zu laden brauchst du weiterhin die Debugrechte (uallKernel.SetDebugPrivilege). Aber das ist dann wieder alles kritisch und wenn du Windows crashed, bitte nicht bei mir beschweren. Also kann es sein, dass bei manchen Anwendungen eben InjectLibrary failed. Versuchs mal mit NotePad für einen dll load test (MessageBoxA bei dll load). Klappt das versuch mal einen Gloablen Hook (MessageBoxA mit ausgabe Paramstr(0)) damit du weiß ob es funktioniert hat. Sollte das Auch geklappt haben, kannste mal vorher das Debug Privilege sezten und mal die dll in alle Prozesse laden. |
Re: Problem mit uallHook
ups sorry, mir ist da ein Fehler unterlaufen beim C&P :(
der Fehler tritt auf beim
Delphi-Quellcode:
(Rückgabewert ist nil)
pTargetMemory := VirtualAllocExX(dwProcessID,nil,dwMemSize, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
und nicht wie oben geschrieben beim GetProcAddress |
Re: Problem mit uallHook
Welchen Wert hat dwProcessID? Welchen dwMemSize? Handelt es sich um ein Win9x oder WinNT system?
|
Re: Problem mit uallHook
Abend mitnand!
Auch wenn das Thema über ein Jahr alt ist muss ich hier jetzt posten, denn: 1. ich habe genau das selbe Problem 2. steht hier keine Lösung Also mach ich mal dort weiter wo StefanG aufgehört hat und beantworte deine Fragen @brechi: 1. System: WinNT (XP SP2, falls das von belang sein sollte) 2. dwProcessID = 10715264 (auf jeden Fall <> 0... und die Betonung liegt auf ID) 3. dwMemSize = 74 GetLastError liefert zurück, dass das Handle ungültig ist. Deshalb denke ich, dass der Fehler in/bei OpenProcess liegt, da dieses immer "0" zurück liefert. Ich vermute, dass es mit dem DebugPrivilege zusammenhängt. Das erhält man über SetDebugPrivilege(SE_PRIVILEGE_ENABLED), oder? Wenn ja, ändert das auch nichts... weder unter meinem beschränktem Konto, noch unter meinem Admin-Konto. Ich hoffe du, brechi, oder jemand anderst kann mir helfen, da ich gerne diese HookUnits verwenden möchte, da afxCodeHook scheinbar nicht mehr existiert und madCodeHook leider nicht OS ist und außerdem ne Fremd-DLL verwendet. Und damit sich keiner beschwert... hier noch ein bisschen Code: Da die HookDLL selbst bisher ja noch nicht ausgeführt wird, poste ich nur mal den Code der ausführenden Anwendung...
Delphi-Quellcode:
PS: Nicht wundern, wenn ich die nächste Woche nicht antworte... ich bin auf Studienfahrt in Schweden, wo wohl mein Internetzugang wohl gegen 0 tendiert ;)(* Eine Form mit zwei Buttons... Button1 zum Inject und Button2 zum Unload. FIsHooked is ein Feld in der Form vom Typ Boolean. MJOLNIR ist eine Konstante und enthält den Pfad zur DLL (welcher korrekt ist). "RPGChatClient.exe" ist die zu hookende App, die auch von mir stammt (sie ist eigentlich für einen anderen Zweck, setzt aber wsock32.dll ein, worauf ich es abgesehen habe) GetProcessID stammt, wenn ich mich recht erinnere von Luckie und schwirrt irgendwo hier im Forum rum (Schande über mich). Die Funktion hat mir bisher immer gute Dienste geleistet, wenn es ums Ermitteln der ProcessID ging und ich schließe sie einfach mal optimistisch als Fehlerquelle aus. Ach ja... ignoriert sonstige (unwichtige) Kleinigkeiten in dem Code, da des nur ne Quick-and-Dirty Test Anwendung für die DLL ist. *) procedure TForm1.Button1Click(Sender: TObject); var PID, hr: Cardinal; begin if not FIsHooked then begin hr := GetProcessID('RPGChatClient.exe', PID); if hr = 0 then begin if not InjectLibrary(PID, MJOLNIR) then ShowMessage('Fehler beim Hooken des Prozesses: ' + SysErrorMessage(GetLastError)) else begin ShowMessage('Prozess erfolgreich gehookt'); FIsHooked := True; end; end else ShowMessageFmt('Fehler beim Ermitteln der Prozess-ID: %d', [hr]); end; end; procedure TForm1.Button2Click(Sender: TObject); var PID, hr: Cardinal; begin if FIsHooked then begin hr := GetProcessID('RPGChatClient.exe', PID); if hr = 0 then begin if not UnloadLibrary(PID, MJOLNIR) then ShowMessage('Fehler beim Unhooken des Prozesses.') else begin ShowMessage('Prozess erfolreich enthookt'); FIsHooked := False; end; end else ShowMessageFmt('Fehler beim Ermitteln der Prozess-ID: %d', [hr]); end; end; procedure TForm1.FormCreate(Sender: TObject); begin if not SetDebugPrivilege(SE_PRIVILEGE_ENABLED) then raise Exception.Create('Fehler beim Erhalten der Debug-Rechte.'); FIsHooked := False; end; procedure TForm1.FormDestroy(Sender: TObject); begin if FIsHooked then Button2.Click; end; PPS: Falls sich jemand wundert, was ich mit der wsock32.dll vorhabe... es geht um eine Firewall nach dem Vorbild von ![]() |
Re: Problem mit uallHook
Jo hab selbst wenig Zeit wegem dem Studium und paar Seminararbeiten und Projekte :) Wäre nett wenndu mir sagen könntest ob du in kein Programm was reinladen kannst, oder ob es nur mit einem bestimmten nicht geht. WElchen AV/ Firewall hast du?
|
Re: Problem mit uallHook
So... ich bin wieder da :mrgreen:
Ich danke dir auf jeden Fall schon mal, dass du dir dennoch Zeit für mich nimmst ;) Also: AV: AntiVir FW: Windows Firewall Ich habe den Hook mal noch mit notepad.exe und wmplayer.exe ausgetestet: Immer das selbe Problem... Ich werd mal schauen, ob nicht doch GetProcessID irgendwo was verbockt, was eigentlich nicht wahrscheinlich sein dürfte, da sie ja sonst perfekt funktioniert... Ich hoffe wir finden gemeinsam eine Lösung :zwinker: |
Re: Problem mit uallHook
OK... ich habe das Problem gelöst.
Es war ein kleiner aber gemeiner Fehler in der GetProcessID. Drauf gekommen bin ich dadurch, dass ich ein funktionierendes Programm, dass GetProcessID einsetzt mit meinem aktuellen verglichen hab. Ersteres verwendete eine komplette Unit von Luckie, die er auf seiner Homepage zum Download anbietet, das zweite nur die GetProcessID-Methode, die ich vor einiger Zeit in meine nützliche-Methoden-Unit hinein kopiert habe. Der Fehler an sich war folgender:
Delphi-Quellcode:
Das Hooken der DLL funktioniert nun endlich und ich kann mich darum kümmern meine Firewall zum Laufen zu bringen ;) (ich bin also vollauf zufrieden :mrgreen: )
function GetProcessID(const ProcName: string; var ID: DWORD): DWORD;
(...) begin dw := 0; hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap <> 0 then // <-- in der kopierten Variante stand hier "=" begin (...) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 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