AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein In Hook auslösender Prozess ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

In Hook auslösender Prozess ermitteln

Ein Thema von hesch21 · begonnen am 16. Dez 2013 · letzter Beitrag vom 19. Dez 2013
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#11

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:13
Er sucht aber nicht die eigene ProcessId, sondern die PID des Prozesses, der grade eine Eingabe empfangen hat. Beim LLKEYBOARD_HOOK wird die DLL ja nichts injected, deshalb funktioniert deine Methode da nicht. Aber das schon genannte GetForegroundWindow, sollte eigentlich klappen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:22
hab's ausprobiert. Im dwExtraInfo kommt kein Fensterhandle daher.
Irgendwie brauche ich immer noch jemand, der bei mir den Rollladen hoch zieht. Und eigentlich bin ich beim Thema DLL und Hook ganz gut bewandert. Die Tutorials von Assarbad kenne ich seit Jahren und im Link, den mir baumina geschickt hat, ist ein Fehler: Maus- und Tastatur-Hook müssen nicht in eine DLL untergebracht werden (kann man sich IPC ersparen). Und wenn ich in diesem Beispiel von Assarbad die InstallHook function anschaue, resp. den ganzen Code, sehe ich keinen Sinn für WindowHandle. Wird gar nie verwendet.
Also Ihr seht, so ganz auf den Kopf gefallen bin ich eigentlich nicht, nur habe ich momentan echt das Gefühl, er stecke irgendwie im Sand.
Hmmm, warum hast du dann den KeyboardHook in einer DLL laufen?

Wenn diese DLL keinem anderen Programm bekannt ist, dann wird auch keiner darüber den Hook einhängen, sondern einen eigenen Hook einhängen (wie auch immer).

Und der Hook wird von der Tastatur ausgelöst und von keinem Programm/Form etc.
Die Tastatur sendet ein Ereignis (Taste gedrückt) und Windows schickt das durch den Hook.
Dann wird geschaut, was das aktive Fenster ist und diese Nachricht wird dann dorthin geschickt.

Und man kennt weder den Vorgänger, nach den Nachfolger beim Hook, sondern veranlasst nur, dass der nächste (wer immer das sein mag) diese Nachricht bearbeiten soll.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Dez 2013 um 16:28 Uhr)
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#13

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:32
Hallo himitsu

meine Hook-Start-Prozedur sieht wie folgt aus:
Delphi-Quellcode:
procedure HookOn(AppHandle: HWND; Welche: integer); stdcall;
begin
  if (Welche = 0) or (Welche = 2) then
     HookTastatur := SetWindowsHookEx(WH_KEYBOARD_LL, @CallBackDelHook, HInstance , 0);
  if (Welche = 1) or (Welche = 2) then
     HookMaus := SetWindowsHookEx(WH_MOUSE_LL, @MouseHookProc, HInstance , 0);
  hApp := AppHandle;
end;
Da in der DLL sowohl ein Maus- als auch ein Tastatur-Hook drin ist, kommt vom Programm, welches den Hook setzt, explizit das Window-Handle mit und die Steuerung, welche(r) Hook aktiviert werden soll.
Das Handle wird im aufrufenden Programm mittels WinHand := FindWindow ('TSILog', nil); ermittelt und explizit an die DLL übermittelt weil diese den Empfang der Tastenkombinationen über SendMessage(hApp, WM_USER + 4242, 0, 0); vollzieht.

Wie gesagt, das funktioniert alles.

Wenn das, was Aphton sagt, stimmen würde, müsste ja das mit mProz := GetCurrentProcessID; klappen, was ich bereits zu Beginn erwähnt habe, aber eindeutig nicht geht.

Und irgendwie ist mir immer noch nicht klar, warum Ihr so auf dem Handle oder der ID oder was auch immer des Prozesses oder Programmes herum reitet, welches den Hook gestartet hat. Die weiss ich ja. Aber wie komme ich an die PID, welche den Hook (oder von mir aus die DLL) aufruft?
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:47
Und irgendwie ist mir immer noch nicht klar, warum Ihr so auf dem Handle oder der ID oder was auch immer des Prozesses oder Programmes herum reitet, welches den Hook gestartet hat. Die weiss ich ja. Aber wie komme ich an die PID, welche den Hook (oder von mir aus die DLL) aufruft?
Weil die Nachricht vom Betriebssystem kommt und von keinem Programm.

Man kann sich in diese Nachrichtenschlange einhängen (hooken) also einen Einhänger (Hook) dort reinsetzen, da es sich um einen spezielle Nachrichttypen (WH_*) handelt, wo man sich einhängen kann.

Siehe Hooks
Zitat:
A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure.
Dein Denkfehler ist, dass das Tastaturereignis von einer Anwendung kommt.

Es ist aber genau umgekehrt. Die Tastatur weiß nichts von irgendeiner Anwendung. Die bekommt nur den Anschlag mit und erschreckt sich dabei so sehr, dass eine Nachricht an das Betriebssystem gegeben wird.

Dieses fühlt sich nun veranlasst eine Nachricht (WH_KEYBOARD_LL) zu verschicken.
Dann wird das aktive Fenster ermittelt und an die Anwendung wird das Tastaturereignis geschickt.

Also zum Zeitpunkt (WH_KEYBOARD_LL) hat sich noch keiner darum gekümmert, wer das Tastaturereignis empfangen soll.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Dez 2013 um 16:50 Uhr)
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#15

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:47
Hallo Sir Rufo

ehrlicherweise hab ich den Hook produktiv gar nicht in einer DLL. Aber ich hab keine andere schlaue Idee gehabt, wie ich bei dem direkt im Programm eingebundenen Hook heraus finden soll, aus welchem Prozess nun der Hook angesprochen wurde. Zumal mein Programm mit dem Hook auch noch ein Dienst ist, was die Sache auch nicht einfacher macht.
Ich habe mir nun aber gedacht, in der DLL müsste das doch gehen, da diese ja 'irgendwie' direkt von dem Prozess angesteuert wird, in dem das Tastenergeignis statt findet. Aber offenbar laufe ich auch da ins Leere.
Heinz Schneider
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:52
Hallo Sir Rufo

ehrlicherweise hab ich den Hook produktiv gar nicht in einer DLL. Aber ich hab keine andere schlaue Idee gehabt, wie ich bei dem direkt im Programm eingebundenen Hook heraus finden soll, aus welchem Prozess nun der Hook angesprochen wurde. Zumal mein Programm mit dem Hook auch noch ein Dienst ist, was die Sache auch nicht einfacher macht.
Ich habe mir nun aber gedacht, in der DLL müsste das doch gehen, da diese ja 'irgendwie' direkt von dem Prozess angesteuert wird, in dem das Tastenergeignis statt findet. Aber offenbar laufe ich auch da ins Leere.
Ja, weil der Prozess kein Tastaturereignis auslöst.

Und man kann auch nicht feststellen, wer da alles einen Hook gesetzt hat.
Habe ich eine DLL, die einen Hook einhängt, dann kann ich alle die Prozesse bemerken (merken in der DLL), die den Hook mit dieser DLL einhängen. Alle anderen aber nicht - obwohl die trotzdem einen Hook haben könnten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (16. Dez 2013 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#17

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:56
Aber wie komme ich an die PID, welche den Hook (oder von mir aus die DLL) aufruft?
Delphi-Quellcode:
var
  Wnd: HWND;
  ProcessId,
  ThreadId: DWord;
begin
  Wnd := GetForegroundWindow;
  ThreadId := GetWindowThreadProcessId(Wnd, ProcessId);
  { .. }
Zwar um 3 Ecken rum, aber es sollte funktionieren. Zumindest solange dein Hook Prozess unter der selben SessionId und auf dem selben Desktop läuft, wie das aktuelle Vordergrundfenster.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 16:58
Aber wie komme ich an die PID, welche den Hook (oder von mir aus die DLL) aufruft?
Delphi-Quellcode:
var
  Wnd: HWND;
  ProcessId,
  ThreadId: DWord;
begin
  Wnd := GetForegroundWindow;
  ThreadId := GetWindowThreadProcessId(Wnd, ProcessId);
  { .. }
Aber auch nur wenn die Anwendung zufällig grad das Vordergrundfenster ist...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 17:00
Aber wie komme ich an die PID, welche den Hook (oder von mir aus die DLL) aufruft?
Delphi-Quellcode:
var
  Wnd: HWND;
  ProcessId,
  ThreadId: DWord;
begin
  Wnd := GetForegroundWindow;
  ThreadId := GetWindowThreadProcessId(Wnd, ProcessId);
  { .. }
Zwar um 3 Ecken rum, aber es sollte funktionieren. Zumindest solange dein Hook Prozess unter der selben SessionId und auf dem selben Desktop läuft, wie das aktuelle Vordergrundfenster.
Das wird schwierig, denn das soll ja in einem Dienst laufen ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#20

AW: In Hook auslösender Prozess ermitteln

  Alt 16. Dez 2013, 17:01
Hat sich etwas überschnitten. Was Du mir schön plastisch erklärst ist mir eigentlich schön klar und ich weiss schon, dass das Keyboard-Event zum CallBack vom OS mehr oder weniger direkt von der Tastatur kommt. Aber etwas dämlich und ebenso plastisch ausgedrückt weiss das OS mit Garantie auch, welcher Prozess zu dem Zeitpunkt gerade aktiv ist. Und das möchte ich auch gerne wissen. Aber wie bringt man dieses liebe Betriebssystem dazu, dieses Geheimnis preis zu geben?
Heinz Schneider
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 15:36 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