我正在玩一个smali and baksmali在我写的一个小型Hello World Android应用程序上。我的源代码是:了解反汇编Dalvik代码?
package com.hello;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
,然后将其分解到:
.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 10
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 11
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/hello/Main;->setContentView(I)V
.line 12
return-void
.end method
我明白,这是某种中间表示的,但我不知道它是什么。据我所知,必须有一些关于如何理解这种表示的规范,但无法弄清楚如何搜索它。因此给定一个apk文件,有人可以用通俗的话来解释Dalvik opcode specification是如何用于表示的吗?我现在的理解是这样的:
- 给定一个APK,我可以在一个二进制XML格式 提取 AndroidManifest.xml中,并使用一个工具,如 axml2xml.pl得到一个“文本” 版本清单的那是不是 完成或我可以使用 apktool获得更具可读性的 表单。但我仍然不确定他们使用的 规范将 转换成文本的二进制XML。
- 的 反编译器莫名其妙利用 的Dalvil码规范 读取DEX文件和 转换成上述表示。
上述两个步骤中的任何信息(或许有一些简单的例子)都会帮助我更好地理解概念。
更新1(贴从克里斯的答复后):
所以基本上,我会做以下以在Dalvik字节码到:
- 采取的APK并提取它来获得classes.dex文件。
然后反汇编器读取classes.dex文件并确定apk中存在的所有类。你能向我提供一些关于如何完成的信息吗?它是否以十六进制模式解析文件并查找Dalvik规范,然后进行适当的解析?或者是其他事情发生?举例来说,当我用classes.dex hexdump都可以,它给了我这样的事情:
64 65 78 0A 30 33 ...
难道这些现在被用来操作码查找?
- 假设工具是能够进入的字节码转换为单独的类分离,则它继续扫描从classes.dex文件中的十六进制代码,并使用Davlik规范输出来自表中的适当操作码的名字?
其实,总之,我很想知道所有这些“魔法”是如何完成的。例如,如果我要学习编写这个工具,我应该遵循什么样的高层路线图?
这看起来像一个更完整的页面。谢谢! IDAPro似乎很棒,但商业化:(看起来只有旧版本免费提供) – Legend 2011-01-27 18:59:31
netmite.com上的任何内容都不是“官方”的,官方版本位于Android源代码树中,例如http://android.git。 kernel.org/?p=platform/dalvik.git;a=tree;f=docs;h=7045c2e00b823918a8387187ca171d4c68936080;hb=HEAD。(OTOH,netmite副本比git存储库中的更容易阅读,因为CSS页面) – fadden 2011-01-29 01:23:59