我是逆向工程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。
答案 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到多个“参数”(或严格来说是寄存器)来执行实际调用。第一个是指向您正在调用的方法的对象的指针,其余的用于定义该方法参数的值。
在您的初始示例中,v0
和v4
是指向寄存器的指针(您可以将它们视为局部变量)。所以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