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.
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.
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.
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.
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.
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. .
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:
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.
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 ):
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:
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:
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. :)