序曲
我正在尝试学习使用用于dex文件的Smali/Baksmali汇编/反汇编程序的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:是什么意思?
发布于 2012-07-26 22:46:49
PrintStream实际上是正在加载的对象的类型。您正在加载的对象可能称为java.lang.System.out,其中java.lang是包,System是类,out是要加载的成员(静态字段)。
您可以在invoke-virtual中看到相同的模式:java.io是包,PrintStream是类,println是成员(在本例中,是一个实例方法)。在这两种情况下,成员前面都有一个->。我不知道这种模式是否在整个Smali中都是一致的。
当我在使用dalvik的东西时,我发现http://source.android.com/tech/dalvik/dalvik-bytecode.html是非常有价值的,尽管在这种情况下,它的贡献只是识别出sget-object只有两个参数。这告诉我->out:业务必须是静态字段引用的一部分。
发布于 2012-07-26 22:48:34
实际上,它读取java.Lang.System. The (expected) type of that field isjava.io.PrintStream`类的名为out的静态字段。
https://stackoverflow.com/questions/11671545
复制相似问题