2015-08-05 1 views
1

Je suis assez connu pour utiliser smali, alors excuses si c'est une question pour débutants. J'utilise Apktool pour transformer un fichier apk en smali, dans le but d'insérer des appels de consignation dans le code.smali - erreur copie double paramètre

Pour ce faire, j'ai incrémenté .locals par un (pour ajouter un nouveau registre) alors j'essaye de remettre tout le registre à leurs positions originales.

J'ai des problèmes lorsque je tente de déplacer des paramètres utilisant deux registres (longs et doubles). Si j'inclue du code pour les déplacer, l'apk recompile mais ne s'ouvre pas sur un émulateur. Je n'ai pas ce problème en déplaçant d'autres types.

Par exemple, ce qui suit fonctionne correctement. Si j'ajoute move-wide/from16 v6, p1 à la ligne 68, l'application ne s'ouvrira plus (la suivante est après que j'ai incrémenté les .locals de 5).

.method public breakerTheSecond(JLjava/lang/String;)V 
59  .locals 6 
60  .param p1, "pk" # J 
61  .param p3, "ab" # Ljava/lang/String; 
62 
63  .prologue 
64  move-object/from16 v8, p3 
65 
66  move-object/from16 v5, p0 
67 
68  
69 
70  .line 56 
71  const/4 v0, 0x1 
72 
73  .local v0, "a":I 
74  const/4 v1, 0x2 
75 
76  .line 58 
77  .local v1, "b":I 
78  invoke-virtual {v5}, Lcom/test/bbutton 
    /MyActivity;->getApplicationContext()Landroid/content/Context; 
79 
80  move-result-object v2 
81 
82  const-string v3, "test" 
83 
84  const/4 v4, 0x0 
85 
86  invoke-static {v2, v3, v4}, Landroid/widget  
     /Toast;->makeText(Landroid/content/Context;Ljava 
    /lang/CharSequence;I)Landroid/widg et/Toast; 
87 
88  move-result-object v2 
89 
90  .line 59 
91  invoke-virtual {v2}, Landroid/widget/Toast;->show()V 
92 
93  .line 61 
94  return-void 
95 .end method 

Merci pour votre aide!

+0

Bonne question! Continuez :) – JesusFreke

Répondre

0

Les valeurs longues et doubles sont référencées en utilisant uniquement leur premier registre. Donc, quand vous faites le move-object/from16 v5, p0 sur la ligne 66, il déplace la valeur double entière de p0, p1 à v5, v6.

Référencer la seconde moitié d'une valeur 64 bits n'est pas autorisé, alors quand vous essayez de faire move-wide/from16 v6, p1, il voit que p1 est la seconde moitié de la valeur p0 et obtient grincheux avec vous :)

+0

Merci pour la réponse. Cela n'a pas résolu mon problème, mais m'a mis sur la voie de la solution. Mon problème était que p1 a été stocké dans v7 et v8 à l'origine. En raison de l'ordre de mes déclarations, la v8 a été écrasée avant que j'aie déplacé p1 (ligne 64). Pour résoudre ce problème, je viens de déplacer 'move-object/from16 v8, p3' après l'instruction move-wide/from 16. – westie