2015-06-22 14 views
6

Oggi mi sono imbattuto in una classe offuscata (molte classi offuscate in un barattolo) e non ho idea di come questo tipo di offuscamento sia fatto.Come viene eseguita l'offuscamento in Java?

Un esempio:

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(); 
    } 
    } 

} 

Come vedete sopra, tutte le variabili dei parametri sono una snow-man. Come può essere annullato? Inoltre come è fatto in primo luogo; in che modo la JVM è in grado di "elaborarli" ed eseguire il codice senza problemi?

Per chiarire, non ho intenzione di utilizzare questo codice, è solo per scopi didattici. Sto seguendo il corso di Informatica a scuola, quindi stiamo imparando Java e parliamo di limitazioni come le decompilazioni. Sono interessato a saperne di più, quindi ho deciso di dare un'occhiata ai progetti più grandi, in particolare i server. Questo pezzo di codice viene estratto dal server Spigot per Minecraft (un gioco) che è un fork del server Bukkit per Minecraft che doveva essere open source.

+4

Questo è un carattere Unicode come qualsiasi altro carattere Unicode. Perché ti aspetti che non funzioni? – SLaks

+0

Beh, vedo il tuo punto, so che lo è ed è "\ u2603" in particolare, ma non capisco come può essere fatto, e annullato ...: -) Grazie. –

+1

È proprio come qualsiasi altro nome di variabile. Puoi nominare una variabile 'x', per esempio.Questa è solo una variabile il cui nome è '☃'. Non c'è "fatto" o "annullato", è solo che puoi scrivere un nome di variabile con qualsiasi carattere tu voglia. –

risposta

10

Prima di tutto, si dovrebbe notare che sono i parametri che hanno questo unicode e non i metodi. Perché questo è importante? I parametri non hanno bisogno di avere nomi specificati, in quanto sono per lo più indicizzati da un riferimento numerico. Tuttavia può essere specificato e presumo che la maggior parte dei runtime Java non in effetti controlli questo nome perché non è necessario per l'esecuzione. Al contrario, sono comunque necessari nomi di classi, nomi di metodi e nomi di campi.

A proposito di menzionare Spigot, Spigot è davvero open source. Tuttavia, molto probabilmente hai decompilato una classe che è originariamente dal server Mojang Minecraft originale, che non è open source ed è effettivamente offuscata.

Edit: Nel caso in cui si desidera indagare su queste classi, di recente ho trovato uno strumento chiamato Bytecode Viewer, di cui dispone https://github.com/Konloch/bytecode-viewer Questo strumento ha diverse decompilers così come alcune opzioni per visualizzare un più bytecode come la versione del file di classe. Un esempio di una funzione che ho trovato contiene i seguenti dati bytecode:

 <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> 

Infatti, come è visibile, il nome unicode è stato impostato lo stesso, ma non importa come alla fine degli indici (1,3 , 5) sono usati per fare riferimento a queste variabili.

+0

In effetti è da net.minecraft.server ma in passato la confusione era molto più frivola: - ( La risorsa fornita è ESATAMENTE quello di cui avevo bisogno! Grazie mille !!! la funzione era quella? Finora ho un po 'di tempo difficile leggere il codice perché appare come il valore unicode o come mostrato sopra ma è un litle corrotto: 3 Grazie: -) –

+1

Oof Non l'ho scritto Penso che sia stato un costruttore di una classe che inizia con Biome. Si noti che il programma ha opzioni per modificare la visualizzazione/decompilatore sotto Visualizza e quindi il riquadro 1-3. – user254948

+0

Abbiamo dato un'occhiata veloce. quella classe specifica era BiomeBaseSub. Si potrebbe provare Fernflower a vedere codice java leggibile e bytecode in un secondo riquadro. Inoltre ha un'opzione per non prendere nomi di variabili dalle informazioni di debug della classe. – user254948

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

Questo non è valido. Non puoi avere più parametri con lo stesso nome. Potrebbe essere che non stai leggendo il testo Unicode con il giusto formato di testo.

+1

Non puoi davvero compilarlo. Tuttavia è consentito in bytecode. – user254948

+0

Buon punto e buona risposta @ user254948 –

0

L'editor di testo mostra il valore del carattere unicode.

Ho appena testato su eclissi e i nomi con caratteri Unicode sono accettabili.

public String publicationXmlUrl(int \u9090currentPage) { 

Ma scrivere con i valori non sono:

public String publicationXmlUrl(int ♥currentPage) { 
Problemi correlati