我将学习一些关于Dalvik,dex和Smali的知识。
我读过有关smali的文章,但仍然不清楚它在编译链中的位置。以及它的目的。
以下是一些问题:
提前谢谢你。
发布于 2015-06-15 05:17:22
创建应用程序代码时,apk文件包含一个.dex文件,其中包含二进制Dalvik字节码。这是平台真正理解的格式。但是,读取或修改二进制代码并不容易,因此有一些工具可以转换到人类可读的表示形式。最常见的人类可读的格式称为Smali。这基本上和你提到的那个装模作样的人是一样的。
例如,假设您有Java代码,它可以执行以下操作
int x = 42假设这是第一个变量,那么该方法的dex代码很可能包含十六进制序列。
13 00 2A 00如果您在上面运行baksmali,您将得到一个包含以下行的文本文件
const/16 v0, 42这显然比二进制代码可读性强得多。但是这个平台对smali一无所知,它只是一个让字节码更容易使用的工具。
Dalvik和ART都采用包含dalvik字节码的.dex文件。对于应用程序开发人员来说,它是完全透明的,唯一的区别是在安装和运行应用程序时幕后发生了什么。
发布于 2021-08-29 17:07:07
高级语言编程包括额外的工具,使编程更容易&为程序员节省时间。在编译程序之后,如果要对其进行反编译,返回到原始源代码需要进行大量的代码分析,以确定程序代码的结构和流程,很可能会有几个以上的传递/解析。然后,反编译程序必须根据编译代码的编译器、版本或编译器以及编译后的操作系统的特性来构造源代码。如果涉及到OS特定的特性、框架、解析器或外部库,例如.net或dome.dll,以及它们的版本等
其次,最好的结果是输出整个程序流,就好像源代码是在一个大文件(即。没有单独的对象、库、依赖项、继承、类或api。在这里,反编译程序会抛出代码,在编译时会导致错误,因为无法访问源代码&其他文件/依赖项的结构。参见示例这里。
第三种&最好的选择是根据程序指令遵循操作系统正在做的事情,这将是机器代码,或者dex (在Android的情况下)。除非你坐在莫斐斯领导的尼布甲尼撒里,没有时间去解码处理器正在运行的体系结构指令集中的每一个操作码,否则当你监视程序流/执行时,你会想要比屏幕上滚动的unicode字符更易读。

这就是组装代码产生不同之处的地方;它几乎是机器代码的直接转换,以人类可读的格式。我说“几乎”是直接的,因为微处理器有像微代码这样的助手,用于流水线和硬件加速器的多线程阅读器,以提供更好的用户体验。
如果您有的源代码,您将使用代码所用的语言进行编辑。类似地,如果您的没有源代码,并且正在编辑编译后的应用程序,那么您仍然在用代码所用的语言进行编辑;在本例中,它是机器代码,或者是次好的代码:斯马利。
这里有一个图表来说明"Dalvik,dex和Smali“和”它在编译器链中的位置“。

https://stackoverflow.com/questions/30837450
复制相似问题