参考 Dalvik 或 Java 虚拟机?

Posted

技术标签:

【中文标题】参考 Dalvik 或 Java 虚拟机?【英文标题】:Reference on Dalvik or Java Virtual Machines? 【发布时间】:2011-06-17 21:13:20 【问题描述】:

我目前正在研究 Dalvik 字节码,但由于我缺乏编译器背景,我发现掌握设计有点困难。我很确定没有人写过一本关于 Dalvik 的书(或者我可能是错的)所以有人可以建议我参考 Java VM,其中包含一些动手示例吗?具体来说,我感兴趣的是:

了解如何解释生成的字节码 使用 VM 规范(Dalvik 或 Java)将字节码反编译为中间表示,然后将其编译回来

简而言之,可能我正在寻找的是学习逆向工程字节码,以便我可以分析它的漏洞。有什么建议吗?

【问题讨论】:

对于普通的 java .class 文件,有反编译器可以生成可读性很强的 java 源代码。 @CodeInChaos:是的。我可以找到几个反编译器,但我正在尝试学习如何编写一个简单的反编译器来了解它是如何工作的。 @CodeInChaos 普通 .class 文件的反编译器对 android 的 Dalvik VM 没有多大帮助,因为它使用完全不同的虚拟机架构和完全不同的字节码。 【参考方案1】:

对于参考资料,没有什么比 dalvik 文档更好的了。您可以在 AOSP 的 dalvik 子项目中找到这些内容,或者现在可以通过 http://s.android.com/tech/dalvik/index.html 在线获取它们

Bytecode format(或 dalvik 项目中的 dalvik-bytecode.html)可能是您最感兴趣的。.Dex Format(dex-format.html)也很有用,Instruction Formats(指令格式.html)

有关字节码的更多一般信息,请查看http://code.google.com/p/smali/wiki/Registers 和http://code.google.com/p/smali/wiki/TypesMethodsAndFields

您肯定需要一些工具。我自然很喜欢smali/baksmali,这是目前唯一可用的汇编器/反汇编器对。还有一个名为 dedexer 的反汇编程序(但没有汇编程序)和 dexdump,它与 AOSP 代码库一起提供并提供 dex 文件的低级转储 - 不仅是字节码,还有所有 dex 结构(baksmali 有类似的输出,带有 -D 选项)。

您可能还对apktool 感兴趣,它使用 smali/baksmali,但也能够反转 apk 中“已编译”的 xml 文件。

有几个工具可以将 dalvik 字节码转换回 java 字节码,尽管我认为它们还不是 100% - undx 和 dex2jar

【讨论】:

【参考方案2】:

已经有用于逆向工程 .dex 文件的工具来生成人类可读的字节码表示。最受欢迎的一种是 baksmali,您可以在这里找到:http://code.google.com/p/smali/。

可以通过谷歌搜索轻松找到字节码本身的描述。这是第三个结果:http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html。

如果您是逆向工程布局,您还需要一个 binary-xml-to-xml 转换器。还有另一个堆栈溢出问题提到了一些工具:Parse versionCode from android apk files

【讨论】:

以上是关于参考 Dalvik 或 Java 虚拟机?的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JAVA虚拟机原理之Dalvik虚拟机

android -------- java虚拟机和Dalvik虚拟机

Java虚拟机和Dalvik虚拟机的区别

什么是 Dalvik 和 dalvik-cache?

Dalvik虚拟机和Art虚拟机

安卓移动逆向-Android Dalvik虚拟机