Android smali-复制双参数时出错
我很熟悉使用smali,如果这是初学者的问题,我深表歉意 我正在使用Apktool将apk文件转换为smali,目的是在代码中插入日志调用 为了做到这一点,我增加了一个本地变量(添加一个新的寄存器),然后尝试将所有寄存器移回它们原来的位置 我在尝试移动使用两个寄存器(long和double)的参数时遇到问题。如果我包含移动它们的代码,apk将重新编译,但不会在模拟器上打开。我在移动其他类型时没有这个问题 例如,下面的方法可以很好地工作。如果我在第68行中添加Android smali-复制双参数时出错,android,smali,apktool,Android,Smali,Apktool,我很熟悉使用smali,如果这是初学者的问题,我深表歉意 我正在使用Apktool将apk文件转换为smali,目的是在代码中插入日志调用 为了做到这一点,我增加了一个本地变量(添加一个新的寄存器),然后尝试将所有寄存器移回它们原来的位置 我在尝试移动使用两个寄存器(long和double)的参数时遇到问题。如果我包含移动它们的代码,apk将重新编译,但不会在模拟器上打开。我在移动其他类型时没有这个问题 例如,下面的方法可以很好地工作。如果我在第68行中添加move wide/from16 v6
move wide/from16 v6,p1
,应用程序将不再打开(下面是我将.locals从5递增后的结果)
谢谢你的帮助 Long和double值仅使用其第一个寄存器引用。因此,当您在第66行执行移动对象/from16v5,p0时,它将整个双精度值从p0,p1移动到v5,v6
不允许引用64位值的后半部分,因此,当您尝试从16 v6、p1进行宽移时,它会看到p1是p0中值的后半部分,并且会对您产生反感:)Long和double值仅使用其第一个寄存器进行引用。因此,当您在第66行执行移动对象/from16v5,p0时,它将整个双精度值从p0,p1移动到v5,v6
不允许引用64位值的后半部分,因此当您尝试从16 v6、p1向宽移动时,它会看到p1是p0中值的后半部分,并对您发脾气:)好问题!继续说:)好问题!继续说下去:)谢谢你的回复。它没有解决我的问题,但让我走上了解决问题的轨道。我的问题是p1最初存储在v7和v8中。由于语句的顺序,在我移动p1(第64行)之前,v8被覆盖。为了解决这个问题,我在move-wide/from-16语句之后移动了
move-object/from-16 v8,p3
。感谢您的回复。它没有解决我的问题,但让我走上了解决问题的轨道。我的问题是p1最初存储在v7和v8中。由于语句的顺序,在我移动p1(第64行)之前,v8被覆盖。为了解决这个问题,我在move-wide/from-16语句之后移动了move-object/from-16 v8,p3
。
.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