2013-09-02 17 views
5

Sto provando a decodificare un apk con apktool d e lo smali che produce contiene istruzioni a blocchi che non comprendo completamente. Un metodo contiene:Come funziona lo switch packed su Android come smali prodotto da apktool?

packed-switch v0, :pswitch_data_0

seguito poi nel codice con etichette come :pswitch_X dove X è un numero e alla fine del metodo con:

:pswitch_data_0 
.packed-switch 0x7f060395 
    :pswitch_4 
    :pswitch_5 
    :pswitch_1 
.end packed-switch 

Che cosa fa questo? Sembra una lista di luoghi da cui saltare, ma a quali condizioni? Cosa fa con 0x7f060395?

risposta

8

Gli interruttori sono divisi in due parti, come notato. La seconda parte che hai elencato è la pseudo-istruzione del payload, che contiene tutti i casi di switch. La prima parte è un'istruzione a commutazione compressa che definisce il registro contenente il valore da verificare e fa riferimento a un'istruzione di carico utile che utilizza un'etichetta.

Per un interruttore imballato, i valori casi nel payload pseudo-istruzioni sono sequenziali, e solo il primo valore è effettivamente data (in questo caso, 0x7f060395)

Per esempio specifico, quando l'impaccato l'istruzione switch è eseguita, controllerà il valore del registro v0 rispetto ai 3 casi nel payload. Se il valore è 0x7f060395, passerà a: pswitch_4, se 0x7f060396, passerà a: pswitch_5, ecc.

Se il valore del registro non corrisponde a nessuno dei casi, l'esecuzione continuerà con il istruzione successiva dopo l'istruzione a commutazione compressa (quella con il registro e l'etichetta, non la pseudo-istruzione del carico utile).

L'istruzione sparse-switch è simile, ad eccezione del fatto che l'istruzione payload ha un valore esplicito associato a ciascun caso, anziché utilizzare valori di chiave sequenziali.

È possibile trovare tutti i dettagli nitty-grintosi nel documento dalvik-bytecode.

+0

Grazie, questo spiega tutto. –

+0

Spero non ti dispiaccia, ho riprodotto la tua risposta su [forum.xda-developers.com] (http://forum.xda-developers.com/showthread.php?p=45212756) come ho chiesto alla stessa domanda Là. Se questo ti offende, fammelo sapere e lo rimuoverò. –

+0

Nessun problema :). È divertente che sto postando indirettamente su xda ora, tramite te. (Ero abituato ad essere un abituale, indietro nei giorni g1). – JesusFreke