Android 什么是Smali代码

Android 什么是Smali代码,android,dalvik,dex,vm-implementation,smali,Android,Dalvik,Dex,Vm Implementation,Smali,我将学习一点关于Dalvik VM、dex和Smali的知识 我读过关于smali的文章,但仍然不能清楚地理解它在编译器链中的位置。它的目的是什么。 这里有一些问题: 正如我所知,dalvik和其他虚拟机一样运行字节码,在Android中是dex字节码 什么是斯玛利?Android操作系统或Dalvik虚拟机是否直接使用它,或者它只是相同的dex字节码,但对人类来说更具可读性 它是否有点像Windows的Disassembler(如OllyDbg)程序可执行文件,由不同的机器代码组成(例如D3、

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

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

  • 正如我所知,dalvik和其他虚拟机一样运行字节码,在Android中是dex字节码
  • 什么是斯玛利?Android操作系统或Dalvik虚拟机是否直接使用它,或者它只是相同的dex字节码,但对人类来说更具可读性
  • 它是否有点像Windows的Disassembler(如OllyDbg)程序可执行文件,由不同的机器代码组成(例如D3、5F),每个机器代码都有相应的汇编命令,但Dalvik Vm也是软件,因此smali是字节码的可读表示形式
  • 有新的艺术环境。它仍然使用字节码还是直接执行本机代码
    提前感谢。

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

    例如,假设您有这样的Java代码

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

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

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


    Dalvik和ART都接受包含Dalvik字节码的.dex文件。对于应用程序开发人员来说,这是完全透明的,唯一的区别在于安装和运行应用程序时,幕后会发生什么。

    您能建议阅读一些内容来深入了解这一点吗?这对我来说非常有趣,因为smali无法映射到Java代码1:1,所以您可以在上看到dex格式的详细信息。反编译是有损的。只是澄清一下,反编译到Java是有损的(正如锑所提到的),这意味着代码可能足够好,可以获得它正在做的事情的要点,但不足以重新构建apk。使用apktool反编译为smali的apk可以修改(更改资源、注入代码、修改代码),然后重新构建到工作的apk中。@MehranTorki Java和Dalvik字节码都有goto指令。但是在Java语言级别上没有goto的等价物,这可能就是您的意思。字节码不是源语言的1:1映射。