2015-06-22 22 views
6

Heute stieß ich auf eine verschleierte Klasse (auch viele verschleierten Klassen in einem Glas), und ich habe keine Ahnung, wie man diese Art von Verschleierung erfolgt.Wie wird die Verschleierung in Java getan?

Ein Beispiel:

protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 
    throws Exception 
    { 
    int ☃ = ☃.readableBytes(); 
    if (☃ < this.c) 
    { 
     ☃.b(0); 
     ☃.writeBytes(☃); 
    } 
    else 
    { 
     byte[] ☃ = new byte[☃]; 
     ☃.readBytes(☃); 

     ☃.b(☃.length); 

     this.b.setInput(☃, 0, ☃); 
     this.b.finish(); 
     while (!this.b.finished()) 
     { 
     int ☃ = this.b.deflate(this.a); 
     ☃.writeBytes(this.a, 0, ☃); 
     } 
     this.b.reset(); 
    } 
    } 

} 

Wie Sie oben sehen, werden alle Parameter-Variablen sind ein Schneemann. Wie kann dies rückgängig gemacht werden? Wie wird es überhaupt gemacht? Wie kann die JVM diese "verarbeiten" und den Code ohne Probleme ausführen?

Um zu verdeutlichen, werde ich diesen Code nicht verwenden, es ist nur für Bildungszwecke. Ich nehme den Computerwissenschaften-Kurs in der Schule, da wir Java lernen und über Einschränkungen wie Dekompilierungen sprechen. Ich bin daran interessiert, mehr zu lernen, also habe ich beschlossen, größere Projekte, insbesondere Server, zu betrachten. Dieses Stück Code wird aus dem Spigot Server für Minecraft (ein Spiel) gezogen, das ist eine Gabel von Bukkit Server für Minecraft, die Open Source sein sollte.

+4

Das ist ein Unicode-Zeichen wie jedes andere Unicode-Zeichen ist. Warum würdest du erwarten, dass es nicht funktioniert? – SLaks

+0

Nun, ich Ihren Punkt sehen, ich weiß, es ist, und es ist „\ u2603“ speziell, aber ich verstehe nicht, wie es getan werden kann, und wieder rückgängig gemacht ...: -) Dank. –

+1

Es ist wie jeder andere Variablenname. Sie können beispielsweise eine Variable "x" benennen.Dies ist nur eine Variable mit dem Namen '☃'. Es gibt keine "erledigt" oder "rückgängig gemacht", es ist nur, dass Sie einen Variablennamen mit beliebigen Zeichen schreiben können. –

Antwort

10

Zunächst sollten Sie beachten, dass es die Parameter sind, die diesen Unicode haben und nicht die Methoden. Warum ist das wichtig? Parameter brauchen keine Namen angegeben haben, da sie meist von mehreren Referenz indiziert sind. Allerdings kann angegeben werden, und ich nehme an, dass die meist Java-Runtimes in der Tat diesen Namen nicht überprüfen, da es nicht zur Ausführung benötigt wird. In der entgegengesetzten, Klassennamen, Methodennamen und Feldnamen sind jedoch erforderlich.

Über Sie Spigot zu erwähnen, ist Spigot in der Tat Open Source. Wie auch immer, Sie haben höchstwahrscheinlich eine Klasse dekompiliert, die ursprünglich vom ursprünglichen Mojang Minecraft Server stammt, der nicht Open Source ist und tatsächlich verschleiert ist.

Edit: Im Fall, dass Sie diese Klassen untersuchen wollen, fand ich vor kurzem ein Tool Bytecode-Viewer genannt, die bei https://github.com/Konloch/bytecode-viewer Dieses Tool zur Verfügung hat mehrere decompilers sowie einige Optionen eine Bytecode wie Version des anzuzeigen Klassendatei. Ein Beispiel für eine Funktion fand ich enthält folgende Bytecode Daten:

 <localVar:index=1 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=3 , name=☃ , desc=D, sig=null, start=L1, end=L2> 
    <localVar:index=5 , name=☃ , desc=D, sig=null, start=L1, end=L2> 

Tat wie zu sehen ist, haben die Unicode-Namen gleich eingestellt worden, aber es spielt keine Rolle, wie am Ende der Indizes (1,3 , 5) werden verwendet, um diese Variablen zu referenzieren.

+0

Tat es von net.minecraft.server ist aber in der Vergangenheit Verschleierung war viel frendlier: - ( Die bereitgestellte Ressource exacly ist, was ich Dank benötigt so viel !!! auch was! Funktion war das? Bis jetzt habe ich eine kleine harte Zeit, den Code zu lesen, weil es entweder als der Unicode-Wert oder wie oben gezeigt erscheint, aber es ist ein wenig korrupt: 3 Dank: -) –

+1

Oof ich notierte es nicht Ich denke, es war ein Konstruktor einer Klasse, die mit Biome anfing. Beachten Sie, dass das Programm über Optionen zum Ändern des Anzeige-/Dekompilierers unter Ansicht und dann Fenster 1-3 verfügt. – user254948

+0

Nahm einen kurzen Blick. Diese spezifische Klasse war BiomeBaseSub. Sie könnten versuchen, Fernflower in einem zweiten Fenster lesbaren Java-Code und Bytecode zu sehen. Es hat auch eine Option, keine Variablennamen von den Klassen-Debug-Informationen zu übernehmen. – user254948

1
protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃) 

Dies ist nicht gültig. Sie können nicht mehrere Parameter mit demselben Namen haben. Es könnte sein, dass Sie den Unicode-Text nicht mit dem richtigen Textformat lesen.

+1

Sie können es tatsächlich nicht kompilieren. Es ist jedoch in Bytecode erlaubt. – user254948

+0

Guter Punkt, und gute Antwort @ user254948 –

0

Ihr Texteditor zeigt den Wert des Unicode-Zeichens an.

Ich habe gerade auf Eclipse getestet und Namen mit Unicode-Zeichen sind akzeptabel.

public String publicationXmlUrl(int \u9090currentPage) { 

Aber mit Werten zu schreiben sind nicht:

public String publicationXmlUrl(int ♥currentPage) {