Windows (Service) Hooking

W

WindowsHook

Gast
Guten Morgen,

bevor ich meine eigentliche Frage stelle möchte ich folgendes anmerken :

Bei meiner Frage handelt es sich eigentlich eher um die mögliche Machbarkeit als um einen produktiven Einsatz.

Zur Frage selbst :

Es gibt verschiedene Tools mit denen es möglich ist Java-Programme als Windows-Service laufen zu lassen. Soweit ist das auch kein Problem. Meine Frage bezieht sich jetzt auf die Kommunikation mit diesen.

Überlegung :

Der Service soll beim Start mit JNI einen "Hook-Point" erstellen. Also einen Punkt in den sich später eine weitere DLL "einhooken" kann. Zusätzlich soll dieser "Hook-Point" dann eine bi-direktionale Callback-Kommunikation ermöglichen, also das ich aus einer "Kontroll-Anwendung" Daten an den Service schicken kann und von diesem auch wieder Daten erhalte oder umgekehrt. Dabei soll das ganze a-synchron laufen und wenn möglich direkt mit Java-Objekten.

Problem :

Ich "spreche" leider kein C mit dem es realisierbar wäre.

Ich habe mich bereits soweit erkundigt das ich weis das es zwei "Teilnehmer" geben muss : der eine ist der Service selbst der einen "Hook-Point" anbietet, der andere ist die "Kontroll-Anwendung" die sich dort "einhookt" und so den Service steuern kann.

Das man sowas eigentlich nicht mit Java macht ist mir bewusst, aber ich sagte ja das es mir hier eher um die Machbarkeit als um einen sinnvollen Einsatz geht.


Nun daher meine Frage an die C-Profis : wie müsste sowas implementiert werden das es auch mit JNI funktioniert ? Auch bitte ich, wenn möglich, um lauffähigen Beispiel-Code den man anpassen kann da ich wie gesagt keine Ahnung von C habe.

Der Sinn dahinter soll lediglich sein eine Kommunikation zwischen zwei von einander unabhängigen Java-Programmen in getrennten VM-Instanzen auf Java-Objekt-Ebene zu ermöglichen ohne auf Dinge wie "Sockets" zurückgreifen zu müssen.

Ich hoffe das jemand meine Idee versteht und umsetzen kann. Wenn irgendwelche Informationen fehlen oder etwas unklar ist versuche ich es natürlich noch mal genauer zu erklären.
 
G

Gast2

Gast
Der Sinn dahinter soll lediglich sein eine Kommunikation zwischen zwei von einander unabhängigen Java-Programmen in getrennten VM-Instanzen auf Java-Objekt-Ebene zu ermöglichen ohne auf Dinge wie "Sockets" zurückgreifen zu müssen.

gibt es einen Grund dir die Finger mit JNI und C zu brechen und nicht Sockets zu nehmen, außer weil du "Angst" vor Sockets hast?
 

KSG9|sebastian

Top Contributor
Wenn du Sockets nicht magst dann nimm RMI, fahr nen Embedded-Jetty hoch und nimm Spring Remoting oder nimm eine Datei zur "Kommunikation" oder (...viele andere Möglichkeiten...).

Wenn du absolut kein C kannst wirst du mit Beispielcode auch nix anfangen..denn der wird zu 80% in C sein da der Java-Teil an sich ja nichts macht.
 
W

WindowsHook

Gast
Hallo,
erstmal danke für die Antworten.

zu "mogel"

Nein, eigentlich gibt es keinen "sinnvollen" Grund auf sowas einfaches wie eine Socket-Verbindung zu verzichten, und "Angst" habe ich auch nicht davor. Mir geht es hier lediglich darum ob es möglich wäre, gleich welchen Aufwand sich man machen würde (wobei ich glaube das "gebrochene Finger" schon gut andeuten in welch irrsinnige Richtung das wohl geht).


zu "KSG9|sebastian"

Also die Kommunikation über eine Datei scheidet aus (auch wenn in meinem Fall dank Java7 und NIO.2 machbar). Auch mal eben einen RMI-Server zu starten dürfte wohl was den Resourcen-Verbrauch angeht bei dieser Sache nicht gerechtfertigt sein.
Zum "überhaupt kein C" : ist vielleicht nicht ganz richtig ausgedrückt. Über elementare Grundlagen verfüge ich schon, zumindest reicht es dafür um C-Code halbwegs zu verstehen und teilweise sogar dafür einiges nach Java zu portieren (Beispiel : ich habe die in RFC4648 verlinkte C99-Implementierung von Base64 erfolgreich auf Java portiert). In so fern dürfte es auch dafür reichen zumindest im groben zu verstehen wie es funktionieren würde. Und zur Not gibt es ja immer noch Google und API-Docs.


Ich versuche es vielleicht noch mal an einem sehr einfachen Schema zu erklären :

Service > start > über JNI einen "Hook-Point" bereitstellen > normaler Betrieb
(zufälliger Zeitpunkt)
Start einer weiteren Anwendung > laden der "Hook-Lib" > "einhooken" in den vom Service gestellten "Hook-Point" > a-synchroner bi-direktionaler Datenaustausch

Mir ist bewusst dass das Ganze eher wenig bis gar keinen Sinn hat, aber wie erwähnt geht es mir hier lediglich um die Machbarkeit.
Außerdem die Frage : wie würde man so etwas "best practice" im produktiven Einsatz gestallten ? Würde man hier wirklich mit Sockets und RMI arbeiten ?
 
G

Gast2

Gast
Moin,

also wenn es nur um das "ich will wissen wie es geht" geht, dann vergiss erstmal Java. Mach Dich erstmal schlau wie man das normaler weise löst. Also die Kommunikation zwischen 2 Programmen. Dazu wirst Du aber ein anderes Forum suchen dürfen. Hier wird es dir wahrscheinlich keiner sagen können.

Wenn Du das Problem mit der DLL gelöst hast, kannst Du Dich um den JNI Kram kümmern.

hand, mogel
 
W

WindowsHook

Gast
Hallo,

ich bedanke mich erstmal für die gegebenen Antworten. Ich denke das ich wohl erstmal keine andere Wahl haben werde als ein entsprechendes Forum aufzusuchen und mir zur Not einige Kenntnisse anzueigenen.

Ich hoffe, das falls ich es soweit schaffe eine Kommunikation irgendwie zu bewerkstelligen, das mir dann auf dessen Basis jemand bei der Implementierung von JNI helfen kann.

Ich werde dieses Thema dann zum entsprechenden Zeitpunkt noch einmal aufsuchen.
 
W

WindowsHook

Gast
Ich grabe dieses Thema doch noch mal aus.

Ich habe mitlerweile herausgefunden das es bei DLL's sowas wie "sharing" gibt.
Wenn man das mal auf Java überträgt sähe das wie folgt aus :

Eine Klasse mit einem static field. Die Funktionsweise kennen wir alle : der Inhalt bleibt über alle Instanzen innerhalb der VM gleich. Ändert man ihn in einer Instanz so wird er auch in allen anderen geändert. Das "sharing" in DLL's geht sogar noch eine Nummer weiter : stellt euch vor das diese Änderung nicht nur innerhalb einer VM abläuft sondern über die Grenzen einer VM hinweg auch in anderen.

Daraus folgt meine Überlegung :

Wenn man mit JNI arbeitet und über eine DLL mit diesem "sharing" zwei verschiedene VM's kombinieren will müsste man in diesem speziellen Speicherbereich eigentlich nur 4 Pointer anlegen : je zwei für das JNI-Env was die VM selbst repräsentiert und dann noch zwei jObject-pointer für die jeweilige Instanz der Klasse in den beiden VM. Natürlich könnte man die weg lassen und in Java dann mit "static" arbeiten, aber das will ich nicht.

Laut Wikipedia sieht eine native JNI-Methode so aus :
Code:
JNIEXPORT void JNICALL Java_ClassName_MethodName
   (JNIEnv *env, jobject obj)
 {
     /*Implement Native Method Here*/
 }
Definiert man diese Methode nun zwei mal, also einmal für den Service und einmal für den Controller, so müsste es doch möglich sein im shared-memory diese zu speichern und dann jeweils von der anderen VM darauf zu zugreifen.

Nun gibt es dabei aber einige Probleme :

1) Laut MSDN müssen alle Variablen in der "sharing"-Deklaration bereits initialisiert werden. Kann man hier "NULL" oder "0" für die Pointer verwenden oder muss man dafür erstmal "pseudo-Objekte" nutzen die dann später überschrieben werden ?

2) Laut Wikipedia muss eine native-Methode sich erstmal in den aktuellen Thread von "JNI-Env" einklinken damit der call gültig ist. Am schluss soll man sich von diesem auch wieder lösen um es sauber aufzuräumen. Wie würde man das nun umsetzen ?

Ich werde mal versuchen mit Hilfe von Google und dem was ich dort finde mir zumindest theroetisch mal etwas zusammen zu klicken. Ich hoffe das jemand der Ahnung von JNI hat mir dann hilft das ganze funktionsfähig zu bekommen.
 
W

WindowsHook

Gast
Ich habe noch eine wichtige Information an alle C- und JNI-Freaks die das hier (hoffentlich) verfolgen :

Laut einem Thread auf StackOverflow ist es wohl doch nicht ganz so einfach wie ich es dachte. Grund hierfür ist das man eben nicht so einfach Pointer in den "shared memory" einer DLL packen kann. Als Erklärung wurde genannt das die eine Instanz nichts mit der virtuellen Adresse der anderen Instanz anfangen kann. Eine wohl noch sehr simple Lösung soll es wohl sein zur Compile-Time einen Daten-Buffer im "shared memory" zu deklarieren und diesen dann vermutlich mit ein paar weiteren Status-Flags regelmäßig zu pollen (was man mit diesem Data-Buffer machen soll wurde so leider nicht erwähnt).

Das ganze klingt dann an sich aber immer noch halbwegs machbar. Immerhin müsste man ja beide VMs immer in mindestens einem non-deamon-Thread halten a ansonsten die VM terminiert. Und ob man nun diesen sinnlos mit Thread.sleep() einfach nur vergeudet oder dann doch noch sinnvoll für ein polling nutzt würde zumindest das Problem lösen wie man die VM vom terminieren abhält.

Allerdings kommt mir dazu wieder eine Java-spezifische frage in Kopf : sowohl der Lese- als auch der Schreibzugriff müssten mit dem Poll-Thread synchronisiert werden. Sicher könnte man dafür einfach 4 Flags nehmen : ServiceRead, ServiceWrite, ControllerRead, ControllerWrite, aber trotzdem muss doch gewährleistet sein das wenn der Service z.B. gerade am Lesen ist nicht einfach a-synchron ein anderer Thread schreiben kann. Genau so umgekehrt : das Lesen müsste solange blockiert werden bis der schreibende Thread es freigibt. Ich denke das man hier zumindest in Java-termen ein Beispiel finden könnte.

Ich werde weiter dran bleiben und Google weiter nach Informationen absuchen. Hoffentlich ergibt sich mal irgendwann etwas.
 
W

WindowsHook

Gast
Ich bin gerade auf folgendes gestoßen : http://www.codeproject.com/Articles/2460/Using-Memory-Mapped-Files-and-JNI-to-communicate-b
Ich hab mir das Sample mal geladen und es geht schon in die Richtung die ich möchte. Kleinere Mankos sind noch das es so wie man es laden kann nur in eine Richtung läuft und auch nur direkt x86-DLLs beiliegen.
Ich denke jedoch das ich mit Hilfe des Codes in der Lage sein sollte es so zu modifizieren das ich es bi-direktional mit Java-Objekten verwenden kann anstatt mit Strings, denn beides lässt sich ja in ein Byte-Array zerlegen und so speichern.

Werde das ergebnis dann hier posten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards JAR als Windows Service mit Appache Procrun (prunsrv) Allgemeine Java-Themen 6
D Daemon bzw. Windows Service Allgemeine Java-Themen 5
R -jar der Windows-Registry hinzufügen Allgemeine Java-Themen 1
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
MarekLanger Filebeat in Docker unter Windows Allgemeine Java-Themen 1
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
T Java Windows sounds erkennen Allgemeine Java-Themen 1
P Java als Windows Dienst Allgemeine Java-Themen 2
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
H Änderung im maximalen heap space unter Windows 7 ?! Allgemeine Java-Themen 5
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
Neumi5694 Task-Name unter Windows Allgemeine Java-Themen 4
M Checkliste mit erweiterbaren Einträgen, Baumstruktur, wie Windows Explorer Navigation Allgemeine Java-Themen 2
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
R JDK installieren JDK / Maven auf Windows 10 installieren Allgemeine Java-Themen 9
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
D Jsch nur für Windows? Allgemeine Java-Themen 2
X JDK installieren Weiß jemand, wie ich GCJ (WINDOWS) installieren und anwenden kann? Allgemeine Java-Themen 11
D JRE in .jar verpacken unter Windows Allgemeine Java-Themen 4
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
C Windows RCP Application unter Linux bauen lassen Allgemeine Java-Themen 3
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
Tom299 Beliebiges Windows-Programm / Prozess in den Vordergrund bringen Allgemeine Java-Themen 4
D Konsoleneingabe ist in Windows CMD nicht sichtbar Allgemeine Java-Themen 4
P Effizientes Programmieren - oder Windows Autostart fürs Herunterfahren Allgemeine Java-Themen 11
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
F Windows Umlaute Allgemeine Java-Themen 15
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
G Wie installiere ich javax-usb unter windows? Allgemeine Java-Themen 0
M Swing Windows und Ubuntu Allgemeine Java-Themen 4
H JFileChooser soll NUR Windows-Netzwerkumgebung anzeigen Allgemeine Java-Themen 2
L Windows CMD werte Parsen. Allgemeine Java-Themen 2
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
HarleyDavidson Tomcat VS Windows Scheduled Task Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
M Java auf Linux und Windows Allgemeine Java-Themen 6
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
P Eclipse Unter Windows erstelle .jar unter Linux (Ubuntu) funktioniert nicht Allgemeine Java-Themen 5
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
njans Windows Verknüpfung von Icon Allgemeine Java-Themen 2
P windows mit java bedienen Allgemeine Java-Themen 8
X Windows-Environment-Variable per jRegistryKey anpassen Allgemeine Java-Themen 6
P .Jar Datein Windows Konsole zugewiesen Allgemeine Java-Themen 3
C Encoding Problem Windows Allgemeine Java-Themen 9
L Input/Output ProcessBuilder und Windows - Konsole verbergen? Allgemeine Java-Themen 5
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Änderungen in einem Verzeichnis beobachten - Windows Allgemeine Java-Themen 3
A Nach Benutzerwechsel mit anderem Account in Windows anmelden Allgemeine Java-Themen 8
T Jar File läuft unter Windows aber nicht unter linux Allgemeine Java-Themen 10
B Windows Konsolenbefehle Allgemeine Java-Themen 3
Z Probleme bei Stringvergleichen (Windows/Linux) Allgemeine Java-Themen 10
B Windows Shutdown abfangen Allgemeine Java-Themen 10
E CMD Registry Key für Windows 7? Allgemeine Java-Themen 9
TiME-SPLiNTER vlcj und Windows Allgemeine Java-Themen 15
S Prozess der von anderem Prozess gestartet wurde beenden? (Windows Bildschirmtastatur) Allgemeine Java-Themen 4
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2
R Windows ermitteln ob Administratorrechte vorhanden Allgemeine Java-Themen 17
Y MenuBar -> Windows / Mac OS X Allgemeine Java-Themen 2
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
I Encoding Problem bei exec und Windows Allgemeine Java-Themen 2
R Windows - User Passwort ändern Allgemeine Java-Themen 2
F java prog als windows-dienst. Erfahrungen? Allgemeine Java-Themen 2
R Dateien vom Windows-Explorer zum Programm senden Allgemeine Java-Themen 21
H Standard Windows-Druck-Dialog Allgemeine Java-Themen 2
S Windows "öffnen mit..." Allgemeine Java-Themen 4
D Clipboard getSystemSelection() funktioniert unter Windows* nicht Allgemeine Java-Themen 3
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
P Windows Media Player starten / finden Allgemeine Java-Themen 2
D Windows-Konsole auslesen - Zeichenkodierung Allgemeine Java-Themen 4
J Path-Eintrag unter Windows 7 Allgemeine Java-Themen 11
Q .jar wird mit cmd gestartet - Zuordnung von Dateitypen ändern (Windows 7) Allgemeine Java-Themen 7
G jad JDK1.6 Windows 7 Allgemeine Java-Themen 2
Z Position/Größe von Windows-Fenstern ermitteln Allgemeine Java-Themen 12
Z Probleme mit Java unter Vista/ Windows 7 Allgemeine Java-Themen 12
O Jar-Datei auf Windows 98 Allgemeine Java-Themen 6
K Windows Fehlerkanal -> Ausgabe in Datei Allgemeine Java-Themen 6
M Runtime.getRuntime().exec(cmd); auf windows ... Allgemeine Java-Themen 2
P Runnable Jar File über Windows ausführbar doch über Linux nicht Allgemeine Java-Themen 8
A JavaVM Zeit Windows 7 Allgemeine Java-Themen 9
P USB Temperatursensor auslesen Windows Allgemeine Java-Themen 7
T Mac OS X <--> Windows XP Portierungsprobleme Allgemeine Java-Themen 7
G Textdatei einlesen unter Windows 7 Allgemeine Java-Themen 4
Benji0815 Verzeichnis wie im Windows Explorer in einem JTree anzeigen Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben