AGB  ·  Datenschutz  ·  Impressum  







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

Hook produziert wo Error?

Ein Thema von TStringlist · begonnen am 28. Jan 2004 · letzter Beitrag vom 28. Jan 2004
Antwort Antwort
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#1

Hook produziert wo Error?

  Alt 28. Jan 2004, 05:12
Hallo,

ich bräuchte mal ein paar gute Inspirationen bezüglich einer Hookinstallation.

Und zwar möchte ich mittels eines Programmes 'A' einen Maushook in einem anderen Programm 'B' installieren.

[
Zuvor habe ich schon einen globalen Mousehook mit folgender Zeile erfolgreich zum Laufen gebracht:

HookHandle := SetWindowsHookEx(WH_Keyboard, @spcHookProc,HInstance, 0);

...und einen localen der quasi im eigenen Programm 'A' selbst installiert wurde mit dieser Installationszeile:

HookHandle := SetWindowsHookEx(WH_Mouse, @spcHookProc, 0, AThreadID);
]


Jetzt also zu Programm 'A' möchte in Programm 'B' einen Hook installieren. Dazu habe ich alsodann folgende Zeilen benutzt:

ZielWndHandle := FindWindow('TApplication', 'HookDestination');
AHInstance := GetWindowLong(ZielWndHandle, GWL_HINSTANCE);
AThreadID := GetWindowThreadProcessId(ZielWndHandle);
HookHandle := SetWindowsHookEx(WH_Mouse, @spcHookProc, AHInstance, AThreadID);

Der Effekt jedesmal war: Wenn ich mit der Maus auf Programm-Window 'B' drauffahre, gibt's folgenden Error:

---------------------------
HookDestination: ShowDateTime.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x01783518" verweist auf Speicher in "0x01783518". Der Vorgang
"read" konnte nicht auf dem Speicher durchgeführt werden.

Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------

Einerseits zeigt mir das zwar, dass der Hook auch bei Programm 'B' angekommen sein muss, andererseits kann ich mit dieser Errormeldung aber trotzdem irgendwie nichts richtiges anfangen. Eigentlich kann es ja nur an der Hook-Routine selbst liegen. Die allerdings habe ich zwecks Fehlersuche in der Zwischenzeit auf nur noch mehr eine einzige Zeile reduziert, nämlich diese:

Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);

Und beim anfänglichen globalen und localen Hook gab es da ja auch nie einen solchen Error, weder in der HookProc noch überhaupt. Hat eventuell irgendjemand eine Idee was das mit diesem Error auf sich hat, bzw. wie man den event. weg bekommt?

Thx schonmal im Voraus
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Hook produziert wo Error?

  Alt 28. Jan 2004, 05:30
Hm, das was du versucht's kann nicht funktionieren.

Ich versuche dich mal mit einer Gegenfrage auf die Denk-fährte zu bringen.
Die zwei letzten Paramter von SetWindowHookEx() sind entweder eine ThreadID oder ein Instancehandle eines geladenen Modules (nur eines darf angegeben werden, eines muß 0 sein).

Nun WARUM und WOFÜR könnte Windows diese beiden Werte benötigen ??
Angenomen die ThreadID lässt sich ebenfalls im Kernel API auf ein Instance-handle eines geladenen Modules reduzieren, dies ist fakt. Und wenn nun ein Instance-Handle aus der Sicht des Windows Kernels nichts anderes ist als ein Zeiger in den Speicher einen Modules ?

Windows benötigt also in jedem Falle eines Zeiger auf den Speicher zu einem geladenen Modul. Warum ?
Weil exakt dort die Callback Funktion liegen sollte. Du kannst nicht aus deinem Modul heraus einen Hook erzeugen auf ein anderes Modul referneziert.

Denn in deiner Callback rufst du CallNextHookEx(HookHandle, ...) auf. Aber WO wurde die Variable HookHandle denn gespeichert ? Natürlich in Datensegement deines Prozesse, eg Modules. Die Hook-Callback wird aber im Context des angegeben Ziel-Prozesses aufgerufen der garnicht auf DEIN Datensegment zugreifen kann. D.h. mit CallNextHookEx(HookHandle, ...) erzeugt der Compielr Code um auf HookHandle im Datensegement zuzugreifen. Dies Speicherbereich steht aber im Zielprozess nicht zur Verfügung oder enthält falsche Daten.

In deinem Falle must du eine DLL programmieren. In dieser DLL installierst du einen lokalen Mouse Hook. Diese DLL wird durch einen Globalen Hook in alle Prozesse injeziert zb. mit WH_CALLWNDPROC o.ä. Innerhalb der DLL installierst du NUR für den gültigen Zielprozess den lokalen Mousehook und rufts LoadLibrary(HInstance,,) auf. Danach deinstallierst du den globale Hook.

Eine andere Möglichkeit mit Code-Injects habe ich dir hier im Forum schon aufgezeigt.

Gruß Hagen
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Hook produziert wo Error?

  Alt 28. Jan 2004, 12:37
hi, erstmal vielen Dank für deine Antwort. Das mit dem jeweils ein Parameter=0 hatte ich ja anfangs auch schon so ...denn ich hatte ja oben in [] schon kurz angedeutet, einen globalen Hook (für alle anderen Prozesse gleichzeitig funktionierend) und auch schon einen localen Hook (nur für Prog 'A' selbst funktionierend) zum Laufen gebracht zu haben. Und hierzu musste ich die ganze Sache ja dann auch schon in eine DLL verpackt haben (selbst wenn das in meinem ersten post vielleicht auch nicht so 100% klar ersichtlich wurde). Nur, als ich dann auch mal einen Hook von Prog 'A' nur noch in ein einziges anderes Prog (nämlich) 'B' hineininstallieren wollte, klappte das dann aber eben leider irgendwie nicht mehr ganz. Und da dachte ich, mit dem zweiten Parameter (jeweils bisher=0) dieses Ziel-Programm 'B' dann eventuell doch noch etwas weiter spezifizieren zu können. Leider aber erfolglos.

(...und diese deine andere Methode ist mir jetzt einfach im Moment etwas zu theoretisch. Ne, jetzt wollte ich das erstmal über so eine (eigentlich gesicherte) Hook-Technik realisieren.)

Also, auch jetzt habe ich nochmal versucht, einen der Parameter wieder auf 0 zu setzten ...leider wieder ohne Besserung. Was mich da so besonders wundert ist, dass es ja vorher (beim normalen globalen Hook und ebenso beim normalen localen Hook) eigentlich ohne Probs ging und nur jetzt (wo ich quasi den globalen nur etwas einschränken wollte) auf einmal nicht mehr.

?
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Hook produziert wo Error?

  Alt 28. Jan 2004, 20:34
hmmm, eventuell könnte ja auch mal jemand bezüglich dieses Beispiels: Prog 'A' installiert Hook über Window von Prog 'B' seine eigenen 3 Zeilen bis zur SetWindowsHookEx()-Zeile hier rein posten (sofern er sowas schonmal selbst zum Laufen gebracht hat), oder event. auch einen Link angeben, wo man sich das mal genau ansehen könnte (was also in diesem speziellen Fall dann genau in welchen der 2 letzen Parameter der SetWindowsHookEx-Funktion geladen wird ...und mit welchen Funktionen man sich dieses dann selbst wiederum organisiert).

Habe nämlich auch mittels der Suchfunktion in Sachen Hook selbst leider noch nichts derartiges hier im Forum auftreiben können.....
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:21 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