在smali中设置cancelable true

时间:2014-12-14 05:47:16

标签: java android smali

我是逆向工程apk文件,我发现theres AlertDialog是可取消的假

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

(在java代码中显示为cancelable false)

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

.setCancelable(true)

但它的小代码行保持不变

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

invoke-virtual是用于调用对象的虚方法的Java命令的mnemo代码(非常明显)。它使用1到多个“参数”(或严格来说是寄存器)来执行实际调用。第一个是指向您正在调用的方法的对象的指针,其余的用于定义该方法参数的值。 在您的初始示例中,v0v4是指向寄存器的指针(您可以将它们视为局部变量)。所以v0是指向android.app.AlertDialog.Builder类对象的指针。 v4寄存器保存setCancelable参数的值。从这段代码中不可能说你是在调用->setCancelable(True)还是->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