2010-12-04 6 views
4

Je suis actuellement en train de faire quelques recherches sur smali/"code obfuscator" et j'essaie de me familiariser avec les codes sources décompilés pour le moment. Pour cela j'ai créé une application simple et je l'ai décompilée par smali. J'essaie de comprendre le code source décompilé maintenant pour améliorer et comparer la sécurité (contre la décompilation) après l'utilisation d'un obfuscator de code plus tard. Tandis que la plupart du code source de smali n'est pas si difficile, j'ai toujours quelques problèmes avec la conversion de format des figures.Android smali question

Pouvez-vous m'expliquer, p. la ligne suivante. Je suppose que cela devrait avoir une valeur de cinq, mais je ne suis pas sûr, quel genre de format binaire c'est. Comment le calculer 0x4014 = 5 ???

const-wide/high16 v0, 0x4014  // 100000000010100  (5 = 101) 

Attached sont les sources java complet et le code Smali de cette fonction de test:

source de Java:

boolean test(int a, double d) { 
     if (a < 5 && d < 5) 
      return true; 
     else 
      return false; 
    } 

source de Smali:

.method test(ID)Z 
    .locals 2 
    .parameter "a" 
    .parameter "d" 

    .prologue 
    .line 28 
    const/4 v0, 0x5 

    if-ge p1, v0, :cond_0 

    const-wide/high16 v0, 0x4014 

    cmpg-double v0, p2, v0 

    if-gez v0, :cond_0 

    .line 29 
    const/4 v0, 0x1 

    .line 31 
    :goto_0 
    return v0 

    :cond_0 
    const/4 v0, 0x0 

    goto :goto_0 
.end method 
+0

dois-je utiliser le code source décompilé pour exécuter à nouveau dans le développement android? –

+0

Rétrospective Modification par une tierce partie qui était en grande partie incompatible avec la question posée - il ne s'agit pas (encore) d'une question d'obfuscation et concerne la représentation à virgule flottante dans smali. –

Répondre

11

Malheureusement, le bytecode dalvik ne fait aucune distinction entre les types entiers (short/integer/long/etc.) Et les types à virgule flottante (float/double). Donc baksmali ne peut pas savoir s'il faut afficher une constante comme celle-ci en tant que virgule flottante ou nombre entier, donc il vaut simplement par défaut entier.

Ceci est encore compliqué par l'existence d'instructions comme celle que vous avez mentionnée. From the dalvik-bytecode page from the dalvik documentation:

"Déplace la valeur littérale donnée (étendue à zéro à 64 bits) dans la paire de registres spécifiée.". Donc, cette instruction chargera la valeur 0x4014000000000000 dans les registres v0 et v1. Il s'agit d'une représentation en virgule flottante standard IEEE-754 de 64 bits. Le premier bit (le plus significatif) est le bit de signe, les 11 bits suivants sont l'exposant (base 2) et les 52 derniers bits sont la mantisse. Dans ce cas, nous avons une représentation binaire de

0100000000010100000000000000000000000000000000000000000000000000 
SEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM 

Pour le bit de signe, 0 est positif et 1 est négatif.

Pour l'exposant, vous prenez la valeur entière des 11 bits (dans ce cas, 1025), et soustrayez 1023, pour un exposant de 2.

Et pour la mantisse, il y a un sous-entendu « 1 "à l'avant, à l'endroit 2^0, avec les chiffres suivants étant les habituels 2^-1, 2^-2, etc. Donc dans ce cas, nous avons le nombre binaire 1.01, ou 1 * 2^0 + 1 * 2^-2, ou 1,25.

La forme générale du calcul utilisée pour la valeur est

-1^(2 + S) * M * 2^E

Où S, M et E sont le signe, mantisse et l'exposant .

Dans ce cas, nous avons^-1 (2 + 0) * 1,25 * 2^2 = 1 * 1,25 * 4 = 5

Si vous ne voulez pas faire ce calcul manuellement chaque fois , il existe diverses calculatrices en ligne qui peuvent le faire pour vous. http://babbage.cs.qc.edu/IEEE-754/64bit.html semble être l'un des meilleurs.

+0

Excellente réponse! –

+0

merci beaucoup :)! – Nils

+0

En fait, j'ai une autre question de nos jours. Comment savez-vous que v0 et v1 sont utilisés (cf const-wide/high16 v0, 0x4014)? Il n'y a pas de v0 dans cette commande, n'est-ce pas? – Nils

0

Il est apparemment le binaire approprié encodage de "5" en double, pour comparaison avec votre deuxième paramètre de ce type en virgule flottante .

+0

Savez-vous comment le calculer? Je ne suis pas sûr comment convertir 0x4014 à la valeur de 5. Y at-il peut-être une documentation sur ce sujet quelque part? – Nils

1

que je fais cela de mémoire, mais pour autant que je me souvienne, les nombres à virgule flottante sont généralement stockés comme ceci:

100000000010100 
smmmmmmmmmmmmee 

s = signe, m = mantisse, e = exposant. Donc, dans votre cas, le signe doit être 1 ou positif, la mantisse est 5, et l'exposant est égal à zéro:

5 x 2^0 = 5

Voir l'article de Wikipédia sur floating point pour plus d'informations. Apparemment, votre encodage utilise 15 bits, ce qui n'est pas beaucoup pour un nombre à virgule flottante, en particulier avec seulement 2 bits pour l'exposant, donc cela peut être quelque chose d'entièrement différent. Ceci est juste ma supposition éclairée. Vous pourriez essayer d'ajouter d'autres nombres et d'examiner le code décompilé pour en savoir plus.