Was ist ein "Haken" und wie kann ich einen in Java schreiben? Und wie man mit dem Kernel kommuniziert, um die Tasten zu kennen, die vom Benutzer gedrückt werden / sich beim OS registrieren

8

Obwohl ich viel gesucht habe, ist mir immer noch unklar, was genau ein "Haken" ist. Zum Beispiel habe ich diesen Beitrag auf Wiki-Antworten gelesen:

  

Ein Hook ist eine Methode, ein Stück Code vor einem anderen zu platzieren   Stück Code, so dass das erste Stück Code vor dem ausgeführt wird   zweites Stück Code, das dem ersten Stück Code eine Chance gibt   Überwachen und / oder Filtern des Verhaltens des zweiten Codeteils. Ein   Beispiel könnte ein Maus-Hook sein, der es dem Hook-Code ermöglicht, die Maus zu überwachen   Maus bei gleichzeitiger Erhaltung der Funktionalität des   ursprüngliche Routine zur Verarbeitung von Mausereignissen.

Ich lese auch diesen Post , aber Ich verstehe immer noch nicht, was ein "Haken" genau ist. Kann jemand bitte in Laiensprache erklären, was ein "Haken" ist? Warum schreiben manche einen "Haken"? Ist es auch möglich, einen "Haken" in Java zu schreiben?

Hinweis:

Ich wollte einen Keylogger in Java schreiben und einer meiner Freunde sagte, dass Sie in C einen "Haken" schreiben müssen. Kann ich den ganzen Keylogger nicht in Java schreiben (nur für Windows)?

BEARBEITEN

Bitte geben Sie eine Antwort w.r.t keylogger. Wie kann ich kernel bitten, die Informationen über die Taste zu geben, die durch Haken an meine Anwendung gedrückt wurde? Oder wie kann ich meine Anwendung unter Verwendung von JNI bei OS registrieren? Ich möchte, dass meine Anwendung vom Benutzer gedrückte Tasten aufnimmt.

    
saplingPro 02.09.2011, 15:14
quelle

8 Antworten

5

Aus Wikipedia ,

  

In der Computerprogrammierung umfasst der Begriff "Hooking" eine Reihe von Techniken   verwendet, um das Verhalten eines Betriebssystems zu ändern oder zu erweitern, von   Anwendungen oder anderer Softwarekomponenten durch abfangende Funktion   Anrufe oder Nachrichten oder Ereignisse zwischen Softwarekomponenten. Code   das behandelt solche abgefangenen Funktionsaufrufe, Ereignisse oder Nachrichten   ein "Haken" genannt.

Ein gutes in Java eingebautes Beispiel wäre Runtime.addShutdownHook . Ein Shutdown-Hook ist einfach ein initialisierter aber nicht gestarteter Thread. Wenn die virtuelle Maschine ihre Abschaltsequenz beginnt, startet sie alle registrierten Shutdown-Hooks in einer nicht angegebenen Reihenfolge und lässt sie gleichzeitig laufen.

%Vor%     
mre 02.09.2011 15:24
quelle
2

Ich würde das Wort hook mit mindestens zwei verschiedenen Konzepten verknüpfen:

a) das Observer-Muster, in dem Sie mit einer Klasse einen Listener hinzufügen können, der bei bestimmten Ereignissen benachrichtigt wird. Sie können dies über Swing, die Servlet-API und viele Drittanbieter-Frameworks finden.

b) Das Template-Methodenmuster. Eine abstrakte Klasse definiert, welche Methoden in welcher Reihenfolge aufgerufen werden, und die implementierende Klasse kann diese Methoden überschreiben. Beispiele dafür sind nicht das , aber Sie sehen sie von Zeit zu Zeit.

    
Sean Patrick Floyd 02.09.2011 15:19
quelle
1

Andere Namen dafür könnten Delegat oder Callback sein.

Ein Beispiel hierfür in Java ist der MouseListener (http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html). MouseListener ist eine Schnittstelle mit Methoden wie mouseClicked(MouseEvent e) . Um auf Mausaktionen des Benutzers zu reagieren, würden Sie MouseListener implementieren und wenn der Benutzer klickt, ruft die Java Swing-Bibliothek Ihre Listener-Klasse auf (nachdem Sie sie durch Aufrufen von addMouseListener registriert haben.

)     
Brigham 02.09.2011 15:20
quelle
1

Hier ist ein einfaches Beispiel:

%Vor%

In diesem stark vereinfachten Beispiel bietet HookableMethod einem externen Objekt die Möglichkeit, es anzuhängen - das heißt, einen externen Objektverweis zu übergeben, und dieses externe Objekt wird zuerst ausgeführt. Wenn Sie also eine Art von Verarbeitung benötigen, die nicht Teil der ursprünglichen Implementierung ist, können Sie dies tun, indem Sie einfach eine Referenz übergeben und nicht die ursprüngliche Quelle patchen.

    
LordDoskias 02.09.2011 15:21
quelle
1

Was den Keylogger betrifft: Ja, man kann das meiste davon in Java schreiben, aber ein kleiner Teil wird in ein JNI-Modul gehen müssen, weil zum Beispiel mit einem globalen Hook eine DLL / Thread / was auch immer in andere Prozesse "injiziert" wird. .. da nicht alle host eine JVM usw. hosten wird dies in Java nicht funktionieren ... also musst du JNI und ein C benutzen, um eine DLL für diesen Teil deines Keyloggers zu schreiben ...

EDIT - wie Kommentar:

Dieser Artikel beschreibt ausführlich, was globale Hooks bewirken und was mit dem Injizieren usw. gemeint ist. .

    
Yahia 02.09.2011 15:46
quelle
1

In Ihrem Fall ist ein Hook ein Softwaremechanismus, um einen Listener (Handler) im Betriebssystem zu registrieren. Dieser Handler (z. B. eine Methode in Ihrer Anwendung) wird vom Betriebssystem benachrichtigt, wenn ein Schlüsselereignis ausgelöst wird (Schlüssel wird gedrückt).

Dies ist nur eine Anwendung des Beobachtermusters.

Ein fiktives Beispiel:

%Vor%

Wie sie Ihnen in anderen Antworten gesagt haben, gibt es keine Möglichkeit, dies in Java zu tun, ohne sich auf irgendeinen nativen Code zu verlassen. Ich denke, der einfachste Weg ist die Auswahl einer Sprache für das Betriebssystem, auf das Sie zielen. Für Windows würde ich es mit C # machen.

Überprüfen Sie diesen Link:

Ссылка

    
Mister Smith 05.09.2011 10:49
quelle
1

Erfassen von Low-Level-Geräteereignissen erfordert das Ausführen von nativem Code (JNI, JNA usw.) und ist stark systemabhängig . Unter Linux müssen Sie wahrscheinlich nicht mit dem Kernel kommunizieren, am wahrscheinlichsten mit X11 Server.

    
Rostislav Matl 08.09.2011 16:45
quelle
0

Zuerst müssen Sie eine Manager-Klasse definieren, etwa so:

%Vor%

Verwenden Sie dann javah , um einen C-Header zu erzeugen, das Ergebnis ist ungefähr so ​​( Ich habe diesen Code nicht wirklich kompiliert, also ist das hypothetisch ):

%Vor%

Erstellen Sie ein C-Projekt, fügen Sie diese Datei hinzu und implementieren Sie diese Methode. Stellen Sie sicher, dass, wenn der tatsächliche Hook ausgelöst wurde, invokeCallback in Ihrem C-Code aufrufen:

%Vor%

Kompilieren Sie das C-Projekt in eine DLL-Datei, sagen wir hookimpl_win32.dll , und verknüpfen Sie es dynamisch irgendwo in Ihrem Java-Code:

%Vor%

Stellen Sie sicher, dass sich die DLL im selben Ordner wie Ihr Glas befindet. Oder geben Sie -Djava.library.path=/path/to/your/dlls in VM-Argumenten an.

Wie Sie jeden Schlüsselstrich protokollieren können, bietet OS in der Regel einige APIs an, mit denen Sie Schlüsselereignisse abfangen können. Bei Windows-Systemen können Sie dies erreichen, indem Sie globale Schlüsselnachrichten abfangen. Ich habe keine Erfahrungen mit anderen Systemen. Wie auch immer, Sie können die richtigen Interrupts einstellen, die leise sind. Sie können Ihre Antwort immer googlen. :)

    
claude 09.09.2011 04:55
quelle

Tags und Links