【问题标题】:Smali syntax for DalvikVM opcodesDalvikVM 操作码的 Smali 语法
【发布时间】:2012-07-26 14:28:16
【问题描述】:

序幕

我正在尝试学习使用 Smali/Baksmali 汇编器/反汇编器处理 dex 文件的 DalvikVM 指令。

问题

来自这个 java 文件

package gd;

class Hello {
    public static void main(String[] args)
    {
      System.out.println("Hello!");
    }
}

我已经生成了以下 smali 汇编文件:

.class Lgd/Hello;
.super Ljava/lang/Object;
.source "Hello.java"


# direct methods
.method constructor <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 3
    .parameter

    .prologue
    .line 6
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "Hello!"

    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 7
    return-void
.end method

我的问题是关于以下行。

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

据我了解,这会将java.lang.System 类的静态对象PrintStream 加载到v0 寄存器中。现在,out: 是什么意思?

【问题讨论】:

    标签: java android dalvik smali


    【解决方案1】:

    PrintStream 实际上是正在加载的事物的类型。您正在加载的对象可能称为java.lang.System.out,其中java.lang 是包,System 是类,out 是要加载的成员(静态字段)。

    您可以在 invoke-virtual 中看到相同的模式:java.io 是包,PrintStream 是类,println 是成员(在本例中为实例方法)。在这两种情况下,成员前面都带有-&gt;。我不知道这种模式在整个 Smali 中是否一致。

    当我在玩 dalvik 的东西时,我发现 http://source.android.com/tech/dalvik/dalvik-bytecode.html 非常宝贵,尽管在这种情况下它的贡献只是确定 sget-object 只接受两个参数。这告诉我-&gt;out: 业务必须是静态字段引用的一部分。

    【讨论】:

    【解决方案2】:

    实际上它读取了java.Lang.System. The (expected) type of that field isjava.io.PrintStream`类的名为out的静态字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多