Boolean von ein anderem Java Programm während der Laufzeit ändern

DasDirt

Mitglied
Hi leute,
ich hoffe das ihr mir helfen könnt ich will einen boolean aus einen anderen Java Programm während es läuft ändern dabei weiß ich in welcher klasse der boolean ist und wie er heißt außerdem ist der boolean auf public static gesetzt
ich weiß nicht ob sowas überhaut geht wenn ja würde ich gerne wissen wie.
Übrigens würde es mir auch reichen wenn mir jemand schreiben kann, wie ich einen boolean in einer class datei ändere
 
Ich würde mir einfach eine Klasse schreiben, deren main-Methode die originale main-Methode aufruft und davor das boolean ändert. Wenn es zur Laufzeit sein muss, musst Du Dir natürlich eine Möglichkeit zur Kommunikation überlegen und einbauen.

Übrigens würde es mir auch reichen wenn mir jemand schreiben kann, wie ich einen boolean in einer class datei ändere
Keine Ahnung, ob es einfacher geht, aber es scheint mir gangbar zu sein, das Ding durch einen Decompiler zu jagen, das boolean zu ändern und neu zu übersetzen.
 
Ich würde mir einfach eine Klasse schreiben, deren main-Methode die originale main-Methode aufruft und davor das boolean ändert. Wenn es zur Laufzeit sein muss, musst Du Dir natürlich eine Möglichkeit zur Kommunikation überlegen und einbauen.


Keine Ahnung, ob es einfacher geht, aber es scheint mir gangbar zu sein, das Ding durch einen Decompiler zu jagen, das boolean zu ändern und neu zu übersetzen.
Erstmal danke für deine Antwort,
Aber wie sage ich dem Programm welche Main Methode es benutzen soll. Und gibt es nicht eine Möglichkeit über ASM oder javaAssist
 
Aber wie sage ich dem Programm welche Main Methode es benutzen soll
Wie startest Du denn das Programm? Wenn es per "java -cp" gestartet wird, dann ist die Hauptklasse ja direkt angegeben. Wenn es ein "ausführbares" Jar ist, dann gibt es darin eine Datei /META-INF/MANIFEST.MF mit einem Main-Class-Eintrag.

Und gibt es nicht eine Möglichkeit über ASM oder javaAssist
Natürlich kann man sich ein Programm schreiben, das den Bytecode ändert oder einen Bytecode-Editor verwenden. Was gefällt Dir denn an den o. g. Ansätzen nicht?
 
Ich habe das Problem auch noch nicht verstanden.

@DasDirt Du hast ein Programm A und ein Programm B. Du startest Programm A. Programm B enthält ein Boolean, das steuert ob Programm A versucht, Programm B herunterzuladen. Das funktioniert nicht, daher crasht Programm A.

Falls das soweit richtig ist, kannst Du doch die betreffende Klasse von Programm B dekompilieren, das Boolean ändern, neu kompilieren. Dann hast Du ein Programm B', das Programm B ersetzt, so dass Programm A den Download nicht mehr versucht.

Sollte es so sein, dass Programm A das Boolean enthält, dann kannst Du die Klasse aus A dekompilieren/kompilieren oder auch eine neue main-Methode schreiben, die die ursprüngliche main-Methode aufruft, zuvor aber das Boolean setzt.
 
Ich habe das Problem auch noch nicht verstanden.

@DasDirt Du hast ein Programm A und ein Programm B. Du startest Programm A. Programm B enthält ein Boolean, das steuert ob Programm A versucht, Programm B herunterzuladen. Das funktioniert nicht, daher crasht Programm A.

Falls das soweit richtig ist, kannst Du doch die betreffende Klasse von Programm B dekompilieren, das Boolean ändern, neu kompilieren. Dann hast Du ein Programm B', das Programm B ersetzt, so dass Programm A den Download nicht mehr versucht.

Sollte es so sein, dass Programm A das Boolean enthält, dann kannst Du die Klasse aus A dekompilieren/kompilieren oder auch eine neue main-Methode schreiben, die die ursprüngliche main-Methode aufruft, zuvor aber das Boolean setzt.
Ich habe Programm A das Programm B von einen Server herunterlädt dann startet. Programm B überprüft auf einen anderen Server ob es ein Update gibt da der Server aber down ist crasht Programm B weil es sich nicht mit den Server verbinden kann.
Ich habe keine Möglichkeit den Code von Programm B zu ändern
 
ich hoffe das ihr mir helfen könnt ich will einen boolean aus einen anderen Java Programm während es läuft ändern dabei weiß ich in welcher klasse der boolean ist und wie er heißt außerdem ist der boolean auf public static gesetzt
Also: es gibt ein statisches Feld bzw. eine Klassenvariable, die du ändern möchtest? Wichtiges Detail: Ist dieses Feld zusätzlich zu static auch noch final und ist es wirklich auf einen literalen Wert gesetzt, also true oder false, oder wird das Feld per Ausdruck/Methodenaufruf initialisiert?
 
Also: es gibt ein statisches Feld bzw. eine Klassenvariable, die du ändern möchtest? Wichtiges Detail: Ist dieses Feld zusätzlich zu static auch noch final und ist es wirklich auf einen literalen Wert gesetzt, also true oder false, oder wird das Feld per Ausdruck/Methodenaufruf initialisiert?
Das Feld ist nur auf Public static gesetzt und direkt initialisiert
 
Übrigens würde es mir auch reichen wenn mir jemand schreiben kann, wie ich einen boolean in einer class datei ändere
Das Programm wir von einen anderen Programm ausgeführt und jedes Mal neu heruntergeladen daher wird es etwas schwieriger die Datei zu modifizieren
Ich habe keine Möglichkeit den Code von Programm B zu ändern
Ich bin verwirrt: Hast du denn nun die Möglichkeit, den Bytecode der entsprechenden Klasse zu ändern, oder nicht?
Falls ja, suchst du nach dem Hex-Muster 0x04, 0xB3. Das entspricht iconst_1, putstatic. Wenn du Glück hast, enthält die Klasse nur eine solche Zuweisung auf ein static Feld. Die 0x04 dann nur abändern zu 0x03 (iconst_0). Wenn du es umfangreicher/sicherer haben willst, würde ich ASM vorschlagen. Wie @mihe7 vorschlägt, entweder per statischer oder dynamischer Instrumentierung.
 
Läuft Programm B zu dem Zeitpunkt, wo A etwas daran ändern soll? Dann stell einen Befehl für z.B. einen DCOM-Server (oder was imemr die lieber ist) bereit, der die Variable ändert.
Wird B von A aufgerufen? Dann verwende einen Kommandozeilenparameter oder eine Systemvariable.
Was spricht dagegen, eine externe Datei zu verwenden, aus welcher der Wert der Variable geladen wird?
 
Läuft Programm B zu dem Zeitpunkt, wo A etwas daran ändern soll? Dann stell einen Befehl für z.B. einen DCOM-Server (oder was imemr die lieber ist) bereit, der die Variable ändert.
Wird B von A aufgerufen? Dann verwende einen Kommandozeilenparameter oder eine Systemvariable.
Was spricht dagegen, eine externe Datei zu verwenden, aus welcher der Wert der Variable geladen wird?
Dürfte beides nicht klappen, wenn das nicht von Anfang an vorgesehen ist. Er sagte ja schon, dass er weder die Sourcen hat, noch dekompilieren kann, sonst wäre ja auch ein einfaches ändern der Konstante möglich gewesen :/
 

Neue Themen


Zurück
Oben