Kommunikation Java-Programm <--> nicht-Java-Programm

Dazu hätte ich die Frage, wie man die textuelle Textausgabe (A-Z, a-Z, 0-9, ÄÖÜß, etc.) einer Nicht-Java-Anwendung (z. B. Flash, aber auch andere) einer Java-Anwendung schicken kann. Wie geht das (ohne Deckompilierung und Reengineering der Nicht-J.-Anwendung) (in Windows)?

Edit: Meine Frage passte zu der anderen Frage.

(Tomate_Salat: Abgetrennt von diesem Thema)

Meinst du jetzt Interprozesskommunikation oder das Einfügen von Text in z.B. Textboxen?

Sowohl als auch, vornehmlich Einfügen in Textboxen und lesen der Ausgabe eines Programms eines UI/GUI, aber auch Webbrowser ansteuern (ohne eigenes Plugin/AddOn) wäre interessant und besonders wünschenswert.

Wie ich auch gerade im anderen Thread schrieb : Java ist dafür nicht geeignet.
Alleine der Punkt Interprozesskommunikation würde bei deinem Vorhaben verlangen das “alle Gesprächsteilnehmer die gleiche Sprache sprechen”, oder anders formuliert : eine gemeinsame Schnittstelle einsetzen über die eine Interprozesskommunikation überhaupt möglich ist. Einfach mal so Daten an einen anderen Prozess senden und von diesem lesen geht schon auf Grund des Speicherschutzes nicht. Und auch eine direkte Verbindung ohne den System-Bus wirst du nicht hinbekommen da man sowas leider nicht direkt über Shared-Memory laufen lassen kann.

Um es mal anders auszudrücken : es ist schon schwierig genug zwei VM-Instanzen mit einander kommunizieren zu lassen ohne auf Standard-Designs wie Socket-Verbindung oder Shared-Memory-mapped-File. Ich hab dazu mal ne Lib gefunden die sich der Windows-API und deren Event-Bus zu nutze macht, unter der Haube aber auch nur Daten in ein File packt und dann über den Event-Bus eine Nachricht verschickt das Daten zum lesen bereit sind. ABER : das setzt auch vorraus das die andere Anwendung darauf reagiert und dann mit den Daten auch was macht bzw wieder selbst welche zurück liefert. Genau DAS wird jedoch eine X-fremde Anwendung mit sicherheit NICHT machen.

Für sowas bräuchte man schon DLL-Process-Injection oder wie sich das nennt, wobei man eine DLL in einen anderen Prozess einklinkt und darüber manipulieren kann, aber das ist dann 1) weder Fachgebiet Java sondern eher C (und/oder Abarten) und 2) nicht universell auf jeden Prozess anwendbar, mal ganz davon abgesehen das sowas stark Platformabhängig ist da die System-API genutzt werden muss. Und ob sowas überhaupt unter allen Systemen umsetzbar ist ist auch noch mehr als fraglich.

Um es also abzukürzen : wenn der Ziel-Prozess keine von Java nutzbare Schnittstelle bereitstellt ist es schlicht und einfach NICHT MACHBAR.

//EDIT

Und im Netzwerkforum ist es auch irgendwie falsch. Vermutlich hast du es gewählt weil es hier um Dinge geht die häufig im Zusammenhang mit dem Internet genutzt werden. An sich aber eher eine “allgemeine” Frage, wenn auch schon sehr speziell, so in der Form schon öfter gestellt und auch genau so beantwortet. “Drüben” (also im J-F) wird sich sicher auch nichts sinnvolles finden lassen, würde hier eher an StackOverflow verweisen.

Bevor man auf so etwas überhaupt antworten kann, sollte man klären, was die textuelle Textausgabe einer Anwendung überhaupt sein soll. Die Frage ist so schwammig formuliert, dass man die Grenze zum Nonsens schon gut im Blick hat.

bei dem Thema sollte jede vernüftige Firewall sofort Amok laufen. Über diese Methode kann man sich in den IE-Task hängen und als $BADPROGRAM fleißig auf Port 80 mit seinem Server reden.

OK, Danke für Eure Antworten. Ich will ja keine Schadsoftware schreiben, sondern ich möchte Programme nur für mich schreiben und keine Schadsoftware an andere verteilen. Dann werde ich wohl etwas über dll injection suchen müssen. Danke für eure Antworten. Eigentlich suche ich ein “Ereignis/Event”, wenn in einem Textfeld das erste Mal ein Buchstabe/Zeichen gezeichnet werden soll.

Ich bin mir nicht sicher ob das wirklich das richtige Schlagwort ist. Früher war es so, dass jedes beliebige Programm einem Windows-Prozess Messages schicken konnte. Darüber kann man auch Text einfügen, klicken, etc. AutoIt macht das meines Wissens so. Wenn es nur für dich ist, ist vielleicht AutoIt die bessere Möglichkeit.

Ja, aber wie programmiert man AutoIt nach? Und ich bin mir nicht sicher, ob darüber auch die Textausgabe eines Programmes in eine GUI (z. B. als Datentyp “String”) zu erreichen wäre.

Nachprogrammieren ist keine sinnvolle Idee. Ich würde an deiner Stelle lieber gleich ein AutoIt-Skript schreiben. Text auslesen funktioniert übrigens.

Och, wenn man nicht den gesamten Funktionsumpfang von AutoIt inklusive GUI benötigt, dann finde ich das schon eine sinnvolle Alternative. In C lässt sich unter Windows ja atemberaubend leicht Schindluder treiben: Um beispielsweise den Tastendruck von „F1“ in einer beliebige Anwendung zu faken konnte man schreiben:

SetFocus(myWindowHandler);
keybd_event ((CHAR)(SHORT)VK_F1, 0,0,0 );
keybd_event ((CHAR)(SHORT)VK_F1, 0, KEYEVENTF_KEYUP,0 );

Ich selber habe dieses Verfahren damals häufiger (rein privat) zur Automatisierung verwendet. Mit ähnlichen Funktionen lassen sich auch Mausklicks simulieren oder die Fensterbitmaps auslesen usw. War schon recht praktisch, bot aber - wie gesagt - auch enormes Mißbrauchspotential.
Ob das heute immer noch so problemlos geht weiss ich allerdings nicht. Hatte das damals nur bis W2000 oder XP oder so gemacht. Muß man wohl mal nach googeln (Stichwort damals war „GDI32“). Auch wenn das Verfahren nicht wirklich „schön“ ist - solange es mir stundenlange doofe Arbeit erspart würde ich es auch heute noch verwenden. :smiley:

Okay, ich sage euch, was ich damit vorhabe. Jetzt wird’s albern… Auf dem Desktop/Anzeige sind zwei Schachprogramme geöffnet mit zwei unterschiedlichen Schachprogrammen und zwei Feldern mit je 8x8 Feldern. Bisher mache ich einfach ein screenCapture, um den Pixel links oben und rechts unten zu finden, außerdem speichere ich für jedes Feld: leer, besetzt mit weiß oder besetzt mit schwarz. Wenn nun ein Zug gemacht wurde, erkenne ich, dass sich mindestens zwei Felder geändert habe, die kann ich “nachsetzen”. Da hört der Spaß aber auch schon wieder auf, denn das Ganze ist fehleranfällig, wenn zum Beispiel rochiert, en-passant geschlagen oder in eine Dame umgewandelt wird oder wenn das andere Schachprogramm innerhalb des nächsten Delays für den screenCapture zieht (schnell). Es gibt zu viele Fälle und mein screenCapture ist nicht schnell genug, zu rechenintensiv. Deshalb gerne 'ne Alternative (die auch die Uhr syncen könnte).

Ein zweites Beispiel wäre (wollte ich schon immer mal programmieren), einen aimbot für CS zu schreiben (insofern diese erlaubt sind). Dafür habe ich allerdings gar keine Herangehensweise. Ich habe mal in einem anderen Forum danach gefragt und meinten nur, ich solle mir ein Hirn kaufen ,o. Ä. Fieses.

Bis morgen Früh!

Gut, jetzt wird es langsam wirklich lächerlich.

Erstmal zu allen anderen : schon teilweise echt sinnvolle vorschläge und herangehensweisen, aber soweit ich TO verstanden habe geht es nicht darum von Java aus Daten in den anderen Prozess reinzudrücken wofür man z.B. AutoIt oder den Event-Bus nutzen könnte, sondern darum Daten aus dem Fremd-Prozess wieder auszulesen. Ich gehe mal von aus dass das mit dem “Text-Feld” von TO nur als vereinfachte analogie genutzt wurde, z.B. für den Log-Output des Schachprogrammes.

Soweit mir bekannt, und da lasse ich mich auch gerne berichtigen, ist es ja bei Interprozess-Kommunikation wichtig das beide Prozesse über eine definierte Schnittstelle arbeiten. Was bringt es mir denn sonst wenn ich einen anderen Prozess mit Daten vollschütte wenn dieser darauf garnicht reagiert ? Das solche Dinge wie AutoIt funktionieren liegt doch nur daran das diese sich direkt in den “normalen” Event-Bus einklinken und so z.B. User-Input zusätzlich “gefaked” erzeugen können. Wie das aber genau funktioniert das AutoIt z.B. einzelne Input-Fields oder Buttons direkt finden kann, würde behaupten hat was mit der Win-API und dem DWM zu tun, aber keine wirkliche Ahnung.

Und wenn man sich nun von einem Programm in ein x-beliebiges anderes einklinken möchte was in dem sinne keine öffentliche Schnittstelle bereitstellt an die man andocken könnte, dann muss man sich eben irgendeinen “gewaltsamen Weg” suchen in einen anderen Prozess “einzudringen” (wie falsch das einfach nur klingt). Aber wie gesagt : ich lass mich gerne eines besseren belehren.

— OFF-TOPIC —
Zum Thema DLL-Injection : ist richtig das hier jede gute Software-Firewall Alarm geben sollte, aber welche macht es denn schon überhaupt noch ?
Konkretes Beispiel : WarCraft 3 und VisualAutoKick
VCA klinkt sich über DLL-Injection in WC3 ein, und gibt dies über einen Hinweis-Text sogar noch genau so bezeichnet an wenn es erfolgreich war. Zumindest mein Kaspersky ist es völlig egal, und Testweise auch Avira (ist eh ziemlicher Schrott mitlerweile). Das einzige System was mir bekannt ist und drauf anspringt wäre Zone, aber auch nur rein informativ das es passiert ist. Ob es jetzt bei mir an gewissen Einstellungen liegt oder es viele der bekannten “Großen” schlicht nicht interessiert bzw. diese keine Möglichkeit haben es zu verhindern kann ich jetzt nicht beantworten. Ich kann es lediglich nur als mir bekanntes Beispiel geben.
Und wenn ich mir so die Einstellungsmöglichkeiten von Kaspersky ansehe kann ich auch sagen warum kein Muks kommt : sämtliche Einstellungen bezüglich des Punktes “Zugriff auf andere Prozesse” wurden über das KSN (irgend so n Community-Krams) automatisch auf “erlauben” festgelegt. Scheint also das wenn man wollte man den Zugriff blockieren könnte, aber es kommt auch leider beim Erst-Start eines solchen Programmes keine Abfrage. Kann ja bloß ne Einstellungssache bei mir sein.

Ein anderes Beispiel wäre Cheat-Engine. Die Idee dahinter ist ebenso simpel wie auch mächtig : kompletter Zugriff auf den Speicher anderer Prozesse. Sollte ja eigentlich mit Speicherschutz und der gleichen nicht möglich sein, wie wir an Cheat-Engine sehen über Prozess-Injection geht sowas durchaus. Und ob man sowas jetzt nutzt um in irgendeinem Spiel irgendwelche Werte zu verändern oder es mal sinnvoll nutzt und nur ne Log-Ausgabe mit abgreift, jedem das seine.
— OFF-TOPIC —

@TO
Das mit dem Screen-Capture könnte man vielleicht noch anwenden wenn nur eine Instanz deines Schach-Programmes gleichzeitig läuft bzw du nur eine Instanz überwachst wenn du sowas lokal zu testen laufen lässt. Wobei in diesem speziellen Fall wäre ein Blick unter die Haube interessant um rauszubekommen wie diese beiden Instanzen mit einander kommunizieren. Wenn es eine Netzwerk-Verbindung ist kannst du dich entweder direkt dazwischen hängen, Man-in-the-Middle-mäßig, oder zumindest mit einem Paket-Filter wie libpcap und nem passenden Java-Binding (Jpcap) die Daten mitlesen. Wäre jetzt aber nur für diesen speziellen Fall eine “etwas elegantere” Lösung.
Zu dem was du eingangs erwähnt hast bezüglich z.B. Flash oder ähnlichem wirst du damit wohl keine Chance haben, und ohne passende Schnittstelle wirst du um DLL-Injection nicht rumkommen da du letzten Endes irgendwie an die Daten des Prozesses rankommen musst.

Bezüglich des Aim-Bots : ich würde dir von dieser Idee aus einem (eigentlich zwei) recht einfachen Grund abraten : dir fehlt es an Wissen und Erfahrung dafür (und wie gesagt : mit Java schon mal garnicht).

Wenn du also sowas wirklich umsetzen willst geh lieber in Richtung C und dessen Ableger, mit Java wirst du nicht weit kommen da auch hier an irgendeinem Punkt eine Native-Lib nötig wird, die dann selbst auch wieder in C geschrieben sein muss. Und Java so als Drum-Rum für ne Native-Lib zu nutzen ist auch nicht im Sinne des Erfinders.

Kurz und Knapp : nicht ganz so tolle Idee in definitiv falschem Forum gestellt.