1

我相当了解使用 smali,所以如果这是一个初学者的问题,我深表歉意。

我正在使用 Apktool 将 apk 文件转换为 smali,目的是将日志调用插入代码中。

为此,我将 .locals 加一(以添加新寄存器),然后尝试将所有寄存器移回其原始位置。

我在尝试移动使用两个寄存器(长整数和双精度数)的参数时遇到问题。如果我包含移动它们的代码,apk 会重新编译但不会在模拟器上打开。移动其他类型时我没有这个问题。

例如,下面的工作正常。如果我move-wide/from16 v6, p1在第 68 行添加,应用程序将不再打开(下面是在我从 5 增加 .locals 之后)。

.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

谢谢你的帮助!

4

1 回答 1

0

Long 和 double 值仅使用它们的第一个寄存器来引用。因此,当您执行第move-object/from16 v5, p066 行时,它将整个 double 值从 p0、p1 移动到 v5、v6。

不允许引用 64 位值的后半部分,因此当您尝试这样做时move-wide/from16 v6, p1,它会看到 p1 是 p0 中值的后半部分,并且对您很生气 :)

于 2015-08-05T21:03:55.197 回答