1

我是逆向工程apk文件,我发现theres AlertDialog is cancelable false

invoke-virtual {v0, v4}, Landroid/app/AlertDialog$Builder;->setCancelable(Z)Landroid/app/AlertDialog$Builder;

(在 java 代码中它显示可取消的错误)

所以我在我的另一个应用程序中尝试了这段代码并编译了它

.setCancelable(true)

但它的 smali 代码行保持不变

invoke-virtual {v2, v3}, Landroid/app/AlertDialog$Builder;->setCancelable(Z)Landroid/app/AlertDialog$Builder;

那么如何在 smali 文件中将 cancelable 更改为 true。

4

2 回答 2

2

阅读:http ://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

如果你这样做,你可以看到它使用了常量池。您需要编辑常量池并使用添加到常量池中的值创建一个新的 invokevirtual。

由于您可能对整个事情不熟悉,而不是我对 BCEL 或 ASM 的正常建议,我将为您提供 JBE 的链接,http: //set.ee/jbe/

于 2014-12-14T05:53:56.283 回答
0

invoke-virtual是用于调用对象的虚拟方法的 Java 命令的助记符(非常明显)。它使用从 1 到多个“参数”(或严格来说是寄存器)来执行实际调用。第一个是指向您正在调用的方法的对象的指针,其余的用于定义该方法参数的值。在您最初的示例中v0,并且v4是指向寄存器的指针(您可以将它们视为局部变量)。v0指向类对象的指针也是如此android.app.AlertDialog.Builder。该v4寄存器保存 setCancelable 参数的值。从这段代码中无法判断您是否调用->setCancelable(True)or ->setCancelable(False),这部分的 smali-code 对于它们两者都是相同的。方法参数的实际值设置为v4在这行代码之前的某个地方注册。所以你可能会在上面看到类似const/4 v4, 0x0几行的内容。这定义False了参数的值。将其更改为 0x1,您就可以使用 apktool-it 回到 apk。

一些阅读需要考虑: http: //pallergabor.uw.hu/androidblog/dalvik_opcodes.html https://code.google.com/p/smali/wiki/Registers

于 2014-12-22T19:06:20.410 回答