【问题标题】:Modifying existing methods in Smali修改 Smali 中的现有方法
【发布时间】:2013-08-26 22:52:33
【问题描述】:

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

目前,Java 中的方法是:

public static boolean isEnabled(){
    return com.example.test.isEnabled();
}

在 smali 中是:

.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 return false; 的操作?据我所知,0x0 是错误的,但只是在编译 smali 时返回导致问题(期待 REGISTER?)所以我想知道我到底需要做什么。

我们将不胜感激解决方案和解释!没什么特别的,我就是喜欢看这个东西。

【问题讨论】:

标签: java android dalvik smali


【解决方案1】:

您可以自己编写一个快速的 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

【讨论】:

  • 哦,所以你可以用 0 表示 false 吗?并感谢您的命令。另外,那行参考不需要在那里吗?
  • 是的,在字节码级别没有特定的“布尔”类型,只有 0 和 1。我不肯定,但我不认为你可以使用一个任意的非零值为真,我认为它必须是 1。
  • 行号只是调试信息。它们用于在异常跟踪中添加行号,并在调试时映射回原始源位置。但是您可以安全地删除它们,而不会影响程序的实际功能。
  • Dalvik 中的字节码验证器比其他流行 VM 中的验证器更挑剔。不应接受 0 或 1 以外的值作为布尔值。
  • @Zackehh9lives:要明确:0 为假,1 为真。 0x0 是 0。0 也可以是空引用,并且数字为零。 Dalvik 的字节码验证器会跟踪数字的“最宽”,并试图阻止您将任意 ints 视为 booleanbyteshort 等。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多