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:
(*
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;
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
PPS: Falls sich jemand wundert, was ich mit der wsock32.dll vorhabe... es geht um eine Firewall nach dem Vorbild von
iSafer, einer Open-Source Pascal Firewall, die eben die beiden Socket DLLs (wsock32.dll und ws2_32.dll) hookt.