Thema: Delphi Problem mit uallHook

Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Problem mit uallHook

  Alt 29. Jun 2007, 20:34
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.
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat