50

我将学习一点关于 Dalvik VM、dex 和 Smali 的知识。

我读过关于 smali 的文章,但仍然无法清楚地理解它在编译器链中的位置。以及它的目的是什么。
这里有一些问题:

  1. 据我所知,dalvik 作为其他虚拟机运行字节码,在 Android 的情况下它是 dex 字节码。
  2. 什么是smali?Android OS 或 Dalvik Vm 是否直接使用它,或者它只是相同的 dex 字节码但对人类来说更具可读性?
  3. 它是否类似于 Windows 的反汇编程序(如 OllyDbg)程序可执行文件由不同的机器代码(例如 D3、5F)组成,并且每个机器代码都有适当的汇编命令,但 Dalvik Vm 也是软件,所以 smali 是字节码的可读表示
  4. 有新的艺术环境。它仍然使用字节码还是直接执行本机代码?

先感谢您。

4

2 回答 2

72

创建应用程序代码时,apk 文件包含一个 .dex 文件,其中包含二进制 Dalvik 字节码。这是平台实际理解的格式。但是,读取或修改二进制代码并不容易,因此有一些工具可以与人类可读的表示进行转换。最常见的人类可读格式称为 Smali。这与您提到的反汇编程序基本相同。

例如,假设您有执行类似操作的 Java 代码

int x = 42

假设这是第一个变量,那么该方法的 dex 代码很可能包含十六进制序列

13 00 2A 00

如果你在上面运行 baksmali,你会得到一个包含该行的文本文件

const/16 v0, 42

这显然比二进制代码更具可读性。但是该平台对 smali 一无所知,它只是一个让使用字节码变得更容易的工具。

Dalvik 和 ART 都采用包含 dalvik 字节码的 .dex 文件。它对应用程序开发人员完全透明,唯一的区别是应用程序安装和运行时在幕后发生的事情。

于 2015-06-15T05:17:22.017 回答
1

高级语言编程包括额外的工具,使编程更容易并为程序员节省时间。编译程序后,如果要反编译,回到原始源代码需要大量的代码分析,以确定程序代码的结构和流程,很可能不止 1 次 pass/parse。然后,反编译器必须根据编译代码的编译器的特性、版本或编译器以及编译它的操作系统来构建源代码。如果涉及操作系统特定的功能或框架或解析器或外部库,例如 .net 或 dome.dll,以及它们的版本等

下一个最好的结果是输出整个程序流程,就好像源代码写在一个大文件中一样,即。没有单独的对象、库、依赖项、继承、类或 api。这是反编译器会吐出代码的地方,这些代码在编译时会导致错误,因为无法访问其他文件/依赖项的源代码和结构。请参见此处的示例

第三个也是最好的选择是根据程序指令遵循操作系统正在执行的操作,这将是机器代码或 dex(在 Android 的情况下)。除非您坐在由 Morpheus 领导的尼布甲尼撒号,并且没有时间解码处理器正在运行的架构的指令集中的每个操作码,否则您会想要比在您监视时在屏幕上滚动的 unicode 字符更具可读性程序流程/执行。 执行在监视器中查看的机器代码 这就是汇编代码的不同之处。它几乎是机器代码的直接翻译,以人类可读的格式。我说“几乎”直接是因为微处理器有微码、流水线的多线程和硬件加速器等助手,以提供更好的用户体验

如果您有源代码,您将使用编写代码的语言进行编辑。同样,如果您没有源代码,而您正在编辑已编译的应用程序,您仍将使用编写代码的语言进行编辑;在这种情况下,它是机器代码,或者是下一个最好的东西:smali

这是一个图表来说明“Dalvik VM、dex 和 Smali”以及“它在编译器链中的位置”。 来自java的dex

于 2021-08-29T17:07:07.590 回答