一. 初识Apk、Dalvik字节码以及Smali
Dalvik(Android操作系统的虚拟机)
Dalvik VM是基于寄存器的,而JVM是基于栈的。 Dalvik有专属的文件执行格式dex(dalvik executable),而JVM执行的则是Java字节码,Dalvik VM比JVM速度更快,占用空间更少。
通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这时需要借助如ApkTool或dex2jar+jd-gui工具来查看。但是,最终我们修改Apk需要操作的文件是 .smali文件,而不是导出来的Java文件重新编译。
Smali–破解的重中之重
Smali、Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种 .dex 格式文件的汇编器、反汇编器。其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了 .dex格式所有功能(注解、调试信息、线路信息等)。
当我们对Apk文件反编译后,便会生成此类的文件。在Dalvik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用两个寄存器表示;Dalvik字节码有两种类型:原始类型、引用类型(包括对象和数组)。
二. 初识Apk、Dalvik字节码以及Smali
1. 原始类型:
B- - -byte
C- - -char
D- - - double
F- - - float
I- - -int
J- - -long
S- - - short
V- - -void
Z- - -boolean
XXX- - -array
Lxxx/yyy- - -object
最后两项:数组的表示方式是:在基本类型前加上前中括号“[”,例如int数组和float数组分别表示为:[I、[F;对象的表示则以L作为开头,格式是LpackageName/objectName;(注意必须有个分号跟在最后),例如String对象在smali中为:Ljava/lang/String;,其中java/lang对应java.lang包,String就说定义在该包中的一个对象。
类里面的内部类又如何在smali中引用呢?答案是LpackageName/objectName s u b O b j e c t N a m e ; 。 也 就 是 在 内 部 类 前 加 “ subObjectName;。也就是在内部类前加“ subObjectName;。也就是