什么是 Smali 代码 Android

What is Smali Code Android

我打算稍微学习一下 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. 有新的 ART 环境。它仍然使用字节码还是直接执行本机代码?

提前致谢。

当您创建应用程序代码时,apk 文件包含一个 .dex 文件,其中包含二进制 Dalvik 字节码。这是平台实际理解的格式。然而,读取或修改二进制代码并不容易,因此有一些工具可以将二进制代码与人类可读的表示形式相互转换。最常见的人类可读格式称为 Smali。这个和你说的dissembler本质上是一样的

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

的操作
int x = 42

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

13 00 2A 00

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

const/16 v0, 42

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

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

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

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

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

如果您拥有源代码,您将使用编写代码的语言进行编辑。同样,如果您没有源代码,并且您正在编辑已编译的应用程序,您仍然会使用编写代码的语言进行编辑;在这种情况下,它是机器代码,或者次之:smali.

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