# JavaFX & Obfuscator ProGuard



## cheat.008 (26. Jul 2018)

Guten Abend,

ich benötige mal eure professionelle Hilfe, denn ich verzweifle langsam daran.

Ich möchte eine .jar (GUI) "obfuscaten" mit ProGuard, jedoch startet diese nach dem obfuscaten nicht mehr.

Jedenfalls hat die GUI-Anwendung drei Klassen, deren Klassennamen durch den ProGuard nicht verändern werden beim verschleiern, was auch funktioniert hat (lt. jadx-gui Decompiler).

Ich bräuchte denke ich zunächst mal Hilfe, beim interpretieren der Kommandozeilenausgabe beim Ausführen der obfuscateten .jar (s. Anhang).

Er wirft unter anderem zunächst mal eine java.fx.fxml.LoadException in Bezug auf die ui.fxml Zeile 20:


```
<MenuItem fx:id="menuItemOpenFile" mnemonicParsing="false" onAction="#menuItemOpenFile" text="Open File" />
```

Wenn ihr weitere Infos braucht, bitte einfach schreiben. Ich bin froh wenn ich das irgendwie zum Laufen bekomme.

Danke schonmal


----------



## mihe7 (26. Jul 2018)

Evtl. hilft https://dzone.com/articles/obfuscate-your-javafx


----------



## cheat.008 (26. Jul 2018)

Danke, mit dem Tutorial hab ichs versucht ;-)
Daher habe ich auch den Tipp mit dem Ausschluß der Klassennamen und @FXML Attribut Änderungen.


----------



## mihe7 (26. Jul 2018)

Das hast Du berücksichtigt?

Both controls and action handler methods are connected via the annotation AND their name. Therefore you also want to keep the names of those, which can be achieved with the -keepclassmembernames option that is applied to everything that is annotated with @javafx.fxml.FXML


----------



## cheat.008 (26. Jul 2018)

Ja genau. Ich arbeite ja mit der GUI von ProGuard und da kann man die Konfigurationsdatei exportieren, ändern und beim nächsten obfuscaten vorab wieder laden.
Also habe ich in der config folgendes eingefügt:


```
-keepclassmembernames class * {
   @javafx.fxml.FXML *;
}
```

Was aber leider dazu geführt hat, dass ProGuard die Konfigurationsdatei nicht mehr parsen konnte. Vlt. ein veralteter Befehl!?
Denn in der gesicherten Konfigurationsdatei raus aus ProGuard gibt es die
"keepclassmembernames" Anweisung gar nicht.


----------



## mrBrown (26. Jul 2018)

Wie sieht denn der Controller zu obigem FXML aus?


----------



## cheat.008 (26. Jul 2018)

Ich wollte mal versuchen die Control/Event Methoden über die GUI von ProGuard ausblenden zu lassen.
Bin mir aber nicht sicher wie es richtig ist. Habe schon versucht durch "FXML"-Annotationen und den direkten Namen der Methoden etwas zu bewirken, leider ohne Erfolg.

Edit: bei Annotation sollte eigentlich noch "@FXML" stehen.


----------



## mrBrown (26. Jul 2018)

mrBrown hat gesagt.:


> Wie sieht denn der Controller zu obigem FXML aus?


----------



## cheat.008 (28. Jul 2018)

Sorry, dass ich jetzt erst anworte. 

Hier der gestrippte Controller ( zu Testzwecken laufen nur ein paar unnötige setText() auf Labels)


```
.
. imports
.


public class Controller {

   
   
   public void initialize() throws MalformedURLException
   {
           
   }
   
   
   @FXML static public BorderPane borderPane;
       
   
    @FXML private Menu menuOpenFile;

    @FXML
    private Button buttonExecute;

    @FXML
    private TextArea textArea;

    @FXML
    void buttonExecute(ActionEvent event)
    {
       textArea.setText("TestText");   
    }
   
    @FXML   private MenuItem menuItemOpenFile;   
   @FXML void menuItemOpenFile() throws IOException
    {
               
    }
    @FXML private Button buttonCopyToClipboard;
    @FXML private ToggleButton toggleButtonSwitchView;
   
    @FXML void toggleButtonSwitchView(ActionEvent event)
    {
                       
    }
   
    @FXML void buttonCopyToClipboard(ActionEvent event)
    {
       
    }
   
    @FXML
    void menuOpenFile(ActionEvent event)
    {
       
    }

    @FXML
    private Label labelCopyright;
   
    @FXML private TableView<SourceCode> tableView;
   
    @FXML void tableView(ActionEvent event)
    {
       
    }
   

}
```

Ich bekomme einfach diese ActionHandler und Controls nicht ausgeblendet beim obfuscaten. 
Daher noch immer die Exception bei dem MenuItem.


----------



## mihe7 (28. Jul 2018)

Im unteren Block steht "Keep additional class names and class member names". Sollte da nicht @javafx.fxml.FXML auftauchen?


----------



## cheat.008 (28. Jul 2018)

Ich bin mir nicht sicher. ProGuard scheint es an der Stelle nicht nötig zu haben, da die JavaFX lib
zusammen mit der JRE eingebunden und ausgelassen wird.
Füge ich es ein, antwortet er mir mit folgendem:


```
ProGuard, version 6.0.3
Reading program jar [C:\Users\Markus\Downloads\sc.jar]
Reading library jar [C:\Program Files\Java\jre1.8.0_181\lib\rt.jar]
Reading library jar [C:\Program Files\Java\jre1.8.0_181\lib\ext\jfxrt.jar]
Note: the configuration explicitly specifies 'javafx.fxml.FXML' to keep library class 'javafx.fxml.FXML'
Note: there were 1 library classes explicitly being kept.
      You don't need to keep library classes; they are already left unchanged.
      (http://proguard.sourceforge.net/manual/troubleshooting.html#libraryclass)
Preparing output jar [C:\Users\Markus\Downloads\sc_obf.jar]
  Copying resources from program jar [C:\Users\Markus\Downloads\sc.jar]
Processing completed successfully
```

Mir ist einfach nicht ganz schlüssig wie ich die Controls und Events umgehen kann beim obfuscaten (was ja augenscheinlich, nach Konsolenbild das Problem momentan ist).


----------



## mihe7 (28. Jul 2018)

Wie sieht die config in dem Fall aus? (die Datei, nicht das UI)


----------



## cheat.008 (28. Jul 2018)

s. Anhang
einmal ohne (links) und einmal mit (rechts) dem versuchten Ausblenden mit javafx.fxml.FXML


----------



## Xyz1 (28. Jul 2018)

ProGuard hinkt da manchmal etwas hinterher wenn es um neue Features geht....
Liegt nicht an Dir


----------



## Xyz1 (28. Jul 2018)

Achso in dem Fall ganz einfach Du hast einen kleingeschriebenen Klassennamen damit kann ProGuard nicht umgehen.
https://stackoverflow.com/a/29374932


----------



## cheat.008 (28. Jul 2018)

DerWissende hat gesagt.:


> Achso in dem Fall ganz einfach Du hast einen kleingeschriebenen Klassennamen damit kann ProGuard nicht umgehen.
> https://stackoverflow.com/a/29374932



Danke für den Hinweis, aber:
_



			"I have found the solution! The problem is that FXML cannot import classes that do not start with an upper case letter."
		
Zum Vergrößern anklicken....

 _Also die drei Klassennamen die ich einsetze fangen bei mir alle mit einem Großbuchstaben an.
Das bezieht sich ja wohl nicht auch noch auf den Packagenamen oder!?
Gleich mal testen...


----------



## mihe7 (28. Jul 2018)

Was anderes: ich habe mir den Spaß eben mal angetestet, d. h. mir eine config-Datei erstellt, dort 

```
-keepclassmembernames class * {
    @javafx.fxml.FXML *;
}
```
eingefügt und wieder geladen. Wird problemlos eingelesen und auch ausgeführt. Ob was sinnvolles dabei rauskommt, weiß ich nicht.


----------



## Xyz1 (28. Jul 2018)

DerWissende hat gesagt.:


> damit kann ProGuard FX nicht umgehen


fix

@cheat.008 Gib mal diese Liste mit einzusetzenden Klassennamen an...


----------



## cheat.008 (28. Jul 2018)

mihe7 hat gesagt.:


> Was anderes: ich habe mir den Spaß eben mal angetestet, d. h. mir eine config-Datei erstellt, dort
> ...
> eingefügt und wieder geladen. Wird problemlos eingelesen und auch ausgeführt. Ob was sinnvolles dabei rauskommt, weiß ich nicht.



Ok danke fürs Testen, hat damals bei mir Probleme verursacht, aber kann es gerne nochmals versuchen.


----------



## cheat.008 (28. Jul 2018)

DerWissende hat gesagt.:


> fix
> 
> @cheat.008 Gib mal diese Liste mit einzusetzenden Klassennamen an...



Ah ich verstehe, denke ich. ProGuard erstellt beim verschleiern kleine Anfangsbuchstaben im Klassenname und das kann JFX nicht mehr ausführen.
Sprich die verschleierte Anwendung dekompilieren um nachzusehen welche Klassennamen von ProGuard erstellt wurden und diese dann jeweils händisch in einer Datei zusammenfassen und ProGuard erneut übergeben?


----------



## Xyz1 (28. Jul 2018)

cheat.008 hat gesagt.:


> Ah ich verstehe, denke ich.


ja



cheat.008 hat gesagt.:


> Sprich die verschleierte Anwendung dekompilieren um nachzusehen welche


nein

Diese Option mitgeben `-classobfuscationdictionary obfuscationClassNames.txt`

und in obfuscationClassNames.txt dann schreiben:
A
B
C
D
usw.


----------



## Xyz1 (28. Jul 2018)

haste? Ich möchte jetzt wissen ob ich eine gute Tat vollbracht habe  wieder jemandem geholfen


----------



## cheat.008 (28. Jul 2018)

Einwandfrei, das hat geholfen.
Herzlichen Dank für den Tipp, da wäre ich niemals drauf gekommen! Muss ich mir merken.

Die Anwendung startet jetzt, jedoch wird kein Tabelleninhalt einer TableView angezeigt. Aber das ist dann wohl eine andere Baustelle - außer es hat noch jemand einen Tipp .-)


----------



## Xyz1 (28. Jul 2018)

cheat.008 hat gesagt.:


> Herzlichen Dank für den Tipp


büdde


----------

