smali - 复制双参数时出错
smali - error copying double parameter
我对 smali 的使用相当了解,如果这是初学者的问题,我深表歉意。
我正在使用 Apktool 将 apk 文件转换为 smali,目的是将日志记录调用插入到代码中。
为此,我将 .locals 递增了一个(以添加一个新寄存器),然后尝试将所有寄存器移回其原始位置。
我在尝试移动使用两个寄存器(long 和 double)的参数时遇到问题。如果我包含移动它们的代码,apk 会重新编译但不会在模拟器上打开。我在移动其他类型时没有遇到这个问题。
例如,下面的工作正常。如果我在第 68 行添加 move-wide/from16 v6, p1
,应用程序将不再打开(下面是在我将 .locals 从 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
感谢您的帮助!
Long 和 double 值仅使用其第一个寄存器进行引用。因此,当您在第 66 行执行 move-object/from16 v5, p0
时,它会将整个双精度值从 p0、p1 移动到 v5、v6。
不允许引用 64 位值的后半部分,因此当您尝试执行 move-wide/from16 v6, p1
时,它会发现 p1 是 p0 中值的后半部分,并且变得脾气暴躁你:)
我对 smali 的使用相当了解,如果这是初学者的问题,我深表歉意。
我正在使用 Apktool 将 apk 文件转换为 smali,目的是将日志记录调用插入到代码中。
为此,我将 .locals 递增了一个(以添加一个新寄存器),然后尝试将所有寄存器移回其原始位置。
我在尝试移动使用两个寄存器(long 和 double)的参数时遇到问题。如果我包含移动它们的代码,apk 会重新编译但不会在模拟器上打开。我在移动其他类型时没有遇到这个问题。
例如,下面的工作正常。如果我在第 68 行添加 move-wide/from16 v6, p1
,应用程序将不再打开(下面是在我将 .locals 从 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
感谢您的帮助!
Long 和 double 值仅使用其第一个寄存器进行引用。因此,当您在第 66 行执行 move-object/from16 v5, p0
时,它会将整个双精度值从 p0、p1 移动到 v5、v6。
不允许引用 64 位值的后半部分,因此当您尝试执行 move-wide/from16 v6, p1
时,它会发现 p1 是 p0 中值的后半部分,并且变得脾气暴躁你:)