AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit uallHook

Ein Thema von StefanG · begonnen am 30. Mai 2006 · letzter Beitrag vom 10. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Problem mit uallHook

  Alt 30. Mai 2006, 13:41
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 von StefanG:
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.}
In meiner steht nämlich was anderes:
Delphi-Quellcode:
  dwProcessID2 := OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
  if (dwProcessID2 <> 0) then
    dwProcessID := dwProcessID2;
Wobei ich das gerade nicht ganz nachvollziehen kann ... (sagen wir so, es erscheint mir falsch zu sein ... )

Alternativ könntest du dich an den Autor Brechi selbst wenden, oder eine andere Hookinglibrary ausprobieren, z.B. MadCodeHook (ist aber leider nicht opensource).
Oder du wartest darauf, dass Brechi mal wieder selbst hier vorbeischaut ... ^^

ciao,
Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
StefanG

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

Re: Problem mit uallHook

  Alt 30. Mai 2006, 16:24
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

pLLA := GetProcAddress(GetModuleHandleA('kernel32.dll'),'LoadLibraryA'); aber auch nil zurück, was dazu führt, dass das ganze bei

if (pLLA <> nil) and (pTargetMemory <> nil) and (pLibraryName <> nil) then rausspringt und nichts tut
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Problem mit uallHook

  Alt 30. Mai 2006, 17:21
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.
  Mit Zitat antworten Zitat
StefanG

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

Re: Problem mit uallHook

  Alt 1. Jun 2006, 08:36
ups sorry, mir ist da ein Fehler unterlaufen beim C&P

der Fehler tritt auf beim

pTargetMemory := VirtualAllocExX(dwProcessID,nil,dwMemSize, MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE); (Rückgabewert ist nil)

und nicht wie oben geschrieben beim GetProcAddress
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#6

Re: Problem mit uallHook

  Alt 1. Jun 2006, 18:17
Welchen Wert hat dwProcessID? Welchen dwMemSize? Handelt es sich um ein Win9x oder WinNT system?
  Mit Zitat antworten Zitat
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
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#8

Re: Problem mit uallHook

  Alt 3. Jul 2007, 16:37
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?
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

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

Re: Problem mit uallHook

  Alt 8. Jul 2007, 13:32
So... ich bin wieder da

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
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

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

Re: Problem mit uallHook

  Alt 9. Jul 2007, 19:02
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:
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
(...)
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 )
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz