Italian Dubbi sull'offuscamento

zamb

Active Member
Licensed User
Carissimi, eccomi ancora a voi per un dubbio che mi ritrovo relativo all'offuscamento del codice.
A parte che non so quanto efficace sia la sola rinomina delle stringhe della Process Global non mi è affatto chiaro di come avvenga la decodifica runtime.
Per prima cosa dubito che, in caso di pubblicazione dell'app offuscata, debba essere caricato anche il file ObfuscatorMap.txt (che contiene in chiaro le chiavi di decodifica e che potrebbe essere utile ai fini di un debug in caso di comportamenti anomali) è giusto?
Ma comunque il sistema deve essere informato in qualche modo di queste chiavi onde poter effettuare la decodifica runtime o sbaglio?. A questo punto, sia nella improbabile presenza in chiaro delle chiavi estraendole dal file txt eventualmente presente, sia nel caso della estrazione di queste chiavi in qualche modo integrate nell'app, che fine farebbe l'oscuramento?

In attesa di vostri lumi, colgo l'occasione per augurare a tutti voi buone vacanze in questo disgraziato anno nella speranza che resti una eccezione....
 

LucaMs

Expert
Licensed User
Ma comunque il sistema deve essere informato in qualche modo di queste chiavi onde poter effettuare la decodifica runtime o sbaglio?
Non c'è decodifica a runtime; in fase di compilazione verranno usati nomi di variabili "anonimi" (esempio: vvv5) anziché gli originali.

La mappa potrebbe servirti in alcuni (rari) casi, ad esempio se vai a leggere il codice java generato, nel quale non troverai la tua variabile di nome MiaVariabile ma la corrispondente generata in fase di compilazione e associata nella map (ObfuscatorMap.txt).
 
Last edited:

MarcoRome

Expert
Licensed User
Scendendo un poco + nel dettaglio...
Come detto da Luca il file Obfuscator lo puoi anche dimenticare, solo in casi speciali ( molto speciali :) , praticamente mai) utilizzerai lo stesso.
La cosa che ti deve essere chiara è la seguente.
Tutto ciò che inserisci nel Process_Global se compilato in "Release obfuscated" viene "offuscato" secondo un algoritmo By Erel. Lo stesso offusca sicuramente il contenuto delle variabili e in alcuni casi il nome delle variabili stesse. In runtime "automaticamente" vengono riportato allo stato "originale"
Per essere chiari:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim variabile1 As String = "vediamo"
    Dim var_uno As String = "cinquantotto"
    Dim var_due as int = 34
    Dim var_tre as int = "34"
End Sub

Dim variabile1 As String = "vediamo"
Se hai questo codice la variabile dal nome "variabile1" verrà rinominata in vvv_etc..... ( insomma con un nome diverso ). Il contenuto verrà offuscato come dicevo secondo un algoritmo e quindi non sarà riconoscibile, quindi la variabile che hai inserito come vediamo, verrà tradotta nel caso qualcuno decompili la tua apk in qualcosa di simile:
_v5 = vvv13(new byte[]{(byte) 35, (byte) 38, (byte) 21, (byte) 66, (byte) 57, (byte) 38, (byte) 6}, 269367);


Dim var_uno As String = "cinquantotto"
La seconda variabile , quella chiamata var_uno non verrà rinominata, ma il contenuto ovviamente verrà comunque offuscato e quindi ti troverai un codice del tipo:
_var_uno = vvv13(new byte[]{(byte) 48, (byte) 41, etc....etc..., 26627);
il fatto che le variabili se utilizzato _ non vengano modifiche come nome è importante in alcuni casi ( leggi https://www.b4x.com/android/forum/threads/code-obfuscation.13773/#content ).



Dim var_due as int = 34
La terza variabile non verrà offuscata.
Se decompili lo stesso ti ritroverai esattamente gli stessi valori, quindi se tante volte utilizzate un numero credendo che sia offuscato attenzione.
Ti ritroverai un codice del tipo:
_var_due = 34;


Dim var_tre as int = "34"
Se utilizzi questo piccolo trucco ( grazie al Cast & Family ) il risultato sarà offuscato.
Ti ritroverai un codice del tipo:
_var_tre = (int) Double.parseDouble(vvv13(new byte[]{(byte) 96, (etc...etc...}, 489435));


Quindi al tuo quesito:
A questo punto, sia nella improbabile presenza in chiaro delle chiavi estraendole dal file txt eventualmente presente, sia nel caso della estrazione di queste chiavi in qualche modo integrate nell'app, che fine farebbe l'oscuramento?
Che abbiano il nome della variabile, poco importa ( in molti casi, certo è meglio evitare di chiamare variabili come password_della_email :) ). L'importante E' IL CONTENUTO DELLE STESSE.
 
Last edited:

LucaMs

Expert
Licensed User
Tutto ciò che inserisci nel Process_Global se compilato in "Release obfuscated" viene "offuscato" secondo un algoritmo By Erel.
Non mi pare sia così.

A parte che sia la Process_Globals che la Globals dovrebbero essere usate solo per dichiarare variabili e niente altro (nemmeno assegnazione di valori alle variabili), solo stringhe nella Process_Globals vengono "offuscate" (oltre ai nomi di variabili, come detto in precedenza). Niente altro.
 

MarcoRome

Expert
Licensed User
Non mi pare sia così.

A parte che sia la Process_Globals che la Globals dovrebbero essere usate solo per dichiarare variabili e niente altro (nemmeno assegnazione di valori alle variabili), solo stringhe nella Process_Globals vengono "offuscate" (oltre ai nomi di variabili, come detto in precedenza). Niente altro.
In che senso Luca, scusa non ti ho capito puoi fare un esempio
 

MarcoRome

Expert
Licensed User
L'esempio riportato 3# è stato compilato in Obfuscated e decompilato con i risultati sopra riportati. Provare per credere :):)
 

LucaMs

Expert
Licensed User
Io pensavo che l'offuscamento avrebbe cambiato solo i nomi di variabili (e routine), per questo, dopo il tuo post, Marco, sono proprio andato a rileggere (dopo anni).

A quanto ho capito tutto ciò che avviene, oltre appunto alla "codifica" dei nomi di variabili - mappata - è proprio e solo il testo che assegni alle variabili stringa nella Process_Globals. Niente altro.
 

MarcoRome

Expert
Licensed User
Luca ti faccio un esempio chiaro chiaro...
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim variabile As String = "vediamo"
    Dim var_uno As String = "cinquantotto"
    Dim var_due As Int = 34
    Dim var_tre As Int = "34"
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")

    Log(variabile)
    Log(var_uno)
    Log(var_due)
    Log(var_tre)
    Log($"${var_tre * 5}"$)
End Sub
Compila lo stesso in Obfuscated....
Se dopo averlo compilato vai nella cartella Object\src...etc e prendi il file main.java avrai ( riporto solo parte del codice.... il seguente risultato )
public static String _v5 = "";
public static String _var_uno = "";
public static int _var_due = 0;
public static int _var_tre = 0;

'e alla fine del file

public static String _process_globals() throws Exception{
//BA.debugLineNum = 17;BA.debugLine="Sub Process_Globals";
//BA.debugLineNum = 20;BA.debugLine="Dim variabile As String = \"vediamo\"";
_v5 = main.vvv13 (new byte[] {37,42,-103,-96,53,40,-119}, 679900);
//BA.debugLineNum = 21;BA.debugLine="Dim var_uno As String = \"cinquantotto\"";
_var_uno = main.vvv13 (new byte[] {48,57,-116,23,33,59,-105,85,51,42,-117,87}, 825634);
//BA.debugLineNum = 22;BA.debugLine="Dim var_due As Int = 34";
_var_due = (int) (34);
//BA.debugLineNum = 23;BA.debugLine="Dim var_tre As Int = \"34\"";
_var_tre = (int)(Double.parseDouble(main.vvv13 (new byte[] {96,100}, 819050)));
//BA.debugLineNum = 24;BA.debugLine="End Sub";
return "";
}
 

MarcoRome

Expert
Licensed User
Prova già fatta non molti minuti fa e conferma quello che ho scritto nel post precedente.
Appunto... e cioè che sia il nome delle variabili ( se non utilizzato _ ) sia il contenuto delle variabili se dichiarato nella Process_Global viene offuscato.
 

MarcoRome

Expert
Licensed User
Cosa vuol dire e solo in quella routine ?
Di fatto e concludo se dichiari:

1. nella Process_Global Dim nome as string = "pluto"
2. compili in obfuscated
3. nel momento in cui qualcuno andrà a decompilare l'apk non vedrà ne "nome" ne "pluto".

Tutto qui
 

zamb

Active Member
Licensed User
Vedo che c'è dibattito :)
Comunque, dal tutorial https://www.b4x.com/android/forum/threads/code-obfuscation.13773/ si evince che un deoffuscamento runtime c'è.
Letteralmente:
Any string written in Process_Globals sub (and only in this sub) will be obfuscated, making it much harder to extract important keys. The strings are defuscated at runtime.
Note that several keys are used during obfuscation including the package name, version name and version code. Modifying these values with the manifest editor will break the defuscation process.
Da qui la mia perplessità.
 

MarcoRome

Expert
Licensed User
Voglio dire ciò che ho letto, ovvero che solo le assegnazioni (contenuti) di testi (ovviamente a variabili stringa) nella Process_Globals vengono "offuscate".
Questo non avviene nella Globals o nelle altre routine.
Esatto..hai visto Lu. Una quadra l'abbiamo trovata. Ciao e un abbraccione
 

MarcoRome

Expert
Licensed User
Vedo che c'è dibattito :)
Comunque, dal tutorial https://www.b4x.com/android/forum/threads/code-obfuscation.13773/ si evince che un deoffuscamento runtime c'è.
Letteralmente:
Any string written in Process_Globals sub (and only in this sub) will be obfuscated, making it much harder to extract important keys. The strings are defuscated at runtime.
Note that several keys are used during obfuscation including the package name, version name and version code. Modifying these values with the manifest editor will break the defuscation process.
Da qui la mia perplessità.
Non essere perplesso @zamb, spero che dopo questo dibattito mio e di Luca le cose ti siamo + chiare.
 

LucaMs

Expert
Licensed User
Penso sia un errore di Erel (ho bestemmiato? 😄

Il "deoffuscamento" (brutto termine) non avviene a runtime ma in fase di "trasformazione" da b4a a java.
 

MarcoRome

Expert
Licensed User
Penso sia un errore di Erel (ho bestemmiato? 😄

Il "deoffuscamento" (brutto termine) non avviene a runtime ma in fase di "trasformazione" da b4a a java.
No no è proprio in runtime, nel senso che, il codice che tu vedi in java ha già l'algoritmo contenente il codice offuscato. Dopo averlo compilato, in runtime passa i parametri in fondo al file e li riporta al valore originale.
 
Top