Java 修改Smali中的现有方法

Java 修改Smali中的现有方法,java,android,dalvik,smali,Java,Android,Dalvik,Smali,我一直在研究smali中的一个简单方法(来自这里的Android),我想知道如何对它做一些简单的事情,比如returnfalse。我一直试图通过与Java对应的一些示例进行比较来理解它,我想我了解了它的大部分工作原理,但我所做的任何更改似乎都不顺利 目前,在Java中,该方法是: public static boolean isEnabled(){ return com.example.test.isEnabled(); } 在斯马里,它是: .method public static

我一直在研究smali中的一个简单方法(来自这里的Android),我想知道如何对它做一些简单的事情,比如returnfalse。我一直试图通过与Java对应的一些示例进行比较来理解它,我想我了解了它的大部分工作原理,但我所做的任何更改似乎都不顺利

目前,在Java中,该方法是:

public static boolean isEnabled(){
    return com.example.test.isEnabled();
}
在斯马里,它是:

.method public static isEnabled()Z
    .registers 1

    .prologue
    .line 3714
    invoke-static {}, Lcom/example/test;->isEnabled()Z

    move-result v0

    return v0
.end method
在上面的上下文中,我将如何修改该方法,使其只执行Java
returnfalse的等效操作?从我所看到的,
0x0
为false,但在编译smali(预期的寄存器?)时返回该问题,所以我想知道我到底需要做什么


如能提供解决方案和解释,将不胜感激!这不是什么特别的东西,我只是想看看这些东西。

你可以通过编写一个快速的java程序,编译它,dx'ing它,然后反汇编它来回答这个问题

public class EnabledTest {
    public static boolean isEnabled() {
        return false;
    }
}
然后编译/dx/反汇编它

javac EnabledTest.java
dx --dex --output=EnabledTest.dex EnabledTest.class
baksmali EnabledTest.dex
你最终会得到这样的结果

.method public static isEnabled()Z
    .registers 1
    const v0, 0
    return v0
.end method

移动结果
只接受一个寄存器。您可以使用
const/4v0,0
将零加载到寄存器v0中。请参阅(或,但格式设置不太容易处理)。哦,那么您可以使用0表示false?谢谢你的命令。另外,行引用是否不需要存在?是的,字节码级别没有特定的“boolean”类型,只有0和1。我不是正数,但我不认为可以使用任意非零值作为真值,我认为它必须是1。行号只是调试信息。它们用于在异常跟踪中添加行号,并在调试时映射回原始源位置。但是您可以安全地删除它们,而不会影响程序的实际功能。Dalvik中的字节码验证器比其他流行VM中的验证器更挑剔。不应接受0或1以外的值作为布尔值。@Zackehhh9Lives:要澄清的是:0为false,1为true。0x0是0。0也可以是空引用,数字为零。Dalvik的字节码验证器跟踪一个数字可以达到的“最宽”,并试图防止您将任意的
int
s视为
boolean
byte
short
,等等。