Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   SetWindowsHookEx ... geht systemweit auch ohne DLL ... ? (https://www.delphipraxis.net/155084-setwindowshookex-geht-systemweit-auch-ohne-dll.html)

Daniel 7. Okt 2010 18:13

SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Moin,

vielleicht kann mir das ja einer erklären: Ich habe in meiner Delphi-Anwendung einen systemweiten Hook für Tastatur und Maus installiert. Klappt wunderbar und ich bekomme mit, wenn in anderen Anwendungen geklickt wird und welche Tasten in anderen Anwendungen gedrückt werden. Und das sogar zum Beispiel im 64bit-Internet Explorer.

Warum lese ich dann aber an allen relevanten Stellen, man müsse seinen Code in eine DLL auslagern, damit dieser in fremde Prozesse injiziert werden könne. ähm ... :gruebel: ... warum klappt das bei mir? Ich habe nur eine kleine schnuckelige EXE und das war's.

Vielleicht kann mir ja einer sagen, was ich gerade übersehe oder welche Vorteile ich hätte, wenn ich den Code in EXE und DLL splitten würde.

Luckie 7. Okt 2010 18:18

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Und du installierst in ganz normal mit SetWindowsHookEx?

Daniel 7. Okt 2010 18:25

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Ja, ganz trivial:
Delphi-Quellcode:
FHook:= SetWindowsHookEx( WH_MOUSE_LL, @FRawNotifierProc, HInstance, 0 );

Luckie 7. Okt 2010 18:27

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Unter welchen Betriebssystemen hast du das bisher getestet?

Daniel 7. Okt 2010 18:34

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Windows 7 x64, Windows XP x86 - letzteres in einer VM

Sir Rufo 7. Okt 2010 18:36

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Schieb doch mal die Source rüber, das würde mich auch interessieren :)

Daniel 7. Okt 2010 18:38

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Ich schaue mal, ob ich es heute noch schaffe, eine Demo-Anwendung zu erstellen. Den ganzen Source kann ich schlecht veröffentlichen.

Sir Rufo 7. Okt 2010 18:39

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Weltherrschaftübernahmecode :mrgreen:

Luckie 7. Okt 2010 18:40

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
WH_MOUSE_LL Global only
Zitat:

The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries.
:gruebel:

Keine Ahnung, was du da machst.

rollstuhlfahrer 7. Okt 2010 18:45

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Wenn MSDN aktuell ist, dann sollte diese Möglichlkeit gar nicht erst funktionieren.
Zitat:

Zitat von MSDN
You must place a global hook procedure in a DLL separate from the application installing the hook procedure. (aus MSDN - Using Hooks (Windows))

Scheinbar tappen da aber alle Entwickler scheinbar im Dunkeln (siehe z.B. hier). Ist das jetzt ein Bug oder ein Feature?

Bernhard

Daniel 7. Okt 2010 18:48

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Nun stellt Euch vor, wie viel überflüssige Arbeit ich gehabt hätte, wenn ich zuvor die Doku gelesen hätte. :mrgreen:

Sir Rufo 7. Okt 2010 18:50

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Das ist wie mit der Hummel und dem fliegen.

Würde die sich einen Kopf um Aerodynamik machen, käme die nicht einen Millimeter in die Höhe.
Aber so ... sie fliegt einfach allen aerodynamischen Regeln zum Trotz.

rollstuhlfahrer 7. Okt 2010 18:57

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
also mich hat das schon immer gestört, dass man eine DLL nehmen muss. Wenn das auch ohne geht, spart man sich viel Entwicklungsaufwand, da eine EXE wesentlich einfacher zu debuggen ist als eine DLL.

Bernhard

PS: Dann braucht auch keiner mehr den dazugehörigen Feature Request zu schreiben.

brechi 7. Okt 2010 21:03

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Es ging schon immer ohne DLL mit _LL nur gabs das nicht unter Win98 wenn ich mich net irre.
http://forum.madshi.net/viewtopic.ph...d1a7145923104f
von 2007 für Keyboard_LL

Luckie 7. Okt 2010 21:32

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Und wie ist dann das Windows SDK zu verstehen? Die entsprechende Stelle wurde ja schon zitiert.

Zacherl 8. Okt 2010 05:02

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Also ich kann bestätigen, dass ein globaler Tastaturhook mit SetWindowsHookEx() auch ohne DLL funktioniert. Hatte vor ewigen Zeiten schonmal ein Beispiel für einen einfachen Keylogger gesehen, der diese Methode verwendete.

Das MSDN Zitat bezieht sich nicht zufällig auf API Hooks oder dergleichen? Das würde die Sache ja erklären.

jaenicke 8. Okt 2010 05:12

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Es gibt verschiedene Arten von Hooks und dementsprechend verschiedene Stellen, an denen diese installiert werden. Deshalb funktionieren manche auch außerhalb einer DLL. Das sind genau die, deren aufzurufender Code aufgrund ihrer Funktionsweise einfach gesagt nicht von überall aus dem System erreichbar sein muss.

Dazu gehören die Hooks für das Abfangen von Tastatureingaben und der Maus, da diese über den Desktop Window Manager abgehandelt werden können. Andere Hooks müssen aber in den Speicherbereich anderer Prozesse eingeblendet werden und das geht nur mit Code, der in einer DLL liegt.

Deshalb gilt diese Restriktion nicht für alle Hooks. Es kann aber durchaus sein, dass sich dies in späteren Windowsversionen ändert, wenn das Handling geändert wird.

mleyen 8. Okt 2010 07:43

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
hook.pas D3+ bzw. hier

Welche Hooks gehen so denn nicht?
Ich dachte bisher immer der Trick liegt an der ASM-Prozedur:
Delphi-Quellcode:
function StdHookProc(Code, WParam: WPARAM; LParam: LPARAM): LResult; stdcall; assembler;
asm
  XOR    EAX,EAX
  PUSH   EAX
  PUSH   LParam
  PUSH   WParam
  PUSH   Code
  MOV    EDX,ESP
  MOV    EAX,[ECX].Longint[4]
  CALL   [ECX].Pointer
  ADD    ESP,12 
  POP    EAX
end;

toms 8. Okt 2010 07:48

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Zitat:

Zitat von mleyen (Beitrag 1054427)
Welche Hooks gehen so denn nicht?

Diese drei Hooks müsen sich nicht in einer dll befinden, all anderen Hooks schon (IIRC)
  • WH_MOUSE_LL
  • WH_KEYBOARD_LL
  • WH_JOURNAL
RECORD

Luckie 8. Okt 2010 08:02

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Das heißt, die Dokumentation ist an diesem Punkt unvollständig bzw. ungenau?

jaenicke 8. Okt 2010 08:05

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Zitat:

Zitat von toms (Beitrag 1054429)
Diese drei Hooks müsen sich nicht in einer dll befinden, all anderen Hooks schon (IIRC)

Richtig, eben genau die Hooks, die für Maus- und Tastatureingaben bzw. deren Aufzeichnung zuständig sind, gehen auf diese Weise.

Zitat:

Zitat von Luckie (Beitrag 1054432)
Das heißt, die Dokumentation ist an diesem Punkt unvollständig bzw. ungenau?

Ich vermute MS wollte hier dann keine Ausnahmen für diese Fälle in die Doku schreiben, da es mit DLLs eben immer funktioniert. Und wie gesagt, das mag sich für diese Hooks ja auch einmal ändern.

SirThornberry 8. Okt 2010 20:26

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Ich glaube es stand auch schonmal richtig im MSDN. Vielleicht kann ja mal einer der Delphi7 hat in der entsprechenden Hilfe nachschauen. Ich glaube da wurden eben die LL-Hooks gesondert aufgeführt.

toms 8. Okt 2010 20:47

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Interessant in diesem Zusammenhang:
Why aren't low-level hooks injected?

Wichtig:
Zitat:

Low-level hooks are consequently very expensive; don't leave them installed when you don't need them.

Christian Seehase 8. Okt 2010 21:04

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Moin Jens,

Zitat:

Zitat von SirThornberry (Beitrag 1054620)
Vielleicht kann ja mal einer der Delphi7 hat in der entsprechenden Hilfe nachschauen. Ich glaube da wurden eben die LL-Hooks gesondert aufgeführt.

also im SDK-Auszug, der bei D7 dabei ist, wird gar nichts von LL-Hooks erwähnt, und die Erklärung, ob die Callback-Routine in einer DLL liegen muss ober nicht, ist gleiche, wie man sie aktuell online im MSDN nachlesen kann.

himitsu 8. Okt 2010 21:32

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Warum die "normalen" Hooks in einer DLL liegen müssen
(oder in der EXE, worin geziehlt lokal gehookt wird)
ist doch bestimmt klar?

Diese Hooks werden direkt angesprungen und es werden womöglich größere Strukturen als Parameter übergeben, weswegen sie im selben Adressraum liegen müssen, wie die gehookte Prozedur.


Diese Low-Level-Hooks laufen vermutlich auf Windows-Ebene, also noch außerhalb der Anwendungen ab, von wo aus dann die eigene Hookprozedur über das System im eigenen Prozess aufgerufen wird.

jaenicke 9. Okt 2010 08:45

AW: SetWindowsHookEx ... geht systemweit auch ohne DLL ... ?
 
Zitat:

Zitat von himitsu (Beitrag 1054626)
Diese Low-Level-Hooks laufen vermutlich auf Windows-Ebene, also noch außerhalb der Anwendungen ab

Habe ich ja schon geschrieben. ;-)
Das läuft über den Desktop Window Manager.
// EDIT:
Und steht in dem Link von toms ja auch nochmal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 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