Smali
2024年11月21日约 391 字大约 1 分钟
Smali
Smali是Android虚拟机的反汇编语言。比汇编代码简单。
Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。
dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。
掌握Smali有哪些好处
- 动态调试APK,通常静态分析APK是不够的,如果需要彻底分析APK的执行逻辑,需要通过动态调试来进行。
- 修改APK运行逻辑,通过修改Smali代码,再重新编译打包成新的APK,是Android逆向的基本操作。
JEB 对 APK 的反编译
反编译的重要产出物是 Bytecode 文件。在jeb中是把所有的 smali 文件全部合并到 Bytecode 中。
jeb 的 Bytecode 中,右键反编译(Decomplie) 会出现反编译的Java类。对于smali不熟悉的可以借用此方式快速查看。
JEB 中增加断点
选中某一行, Windows Ctrl+B, MacOS 中 Command+B。
代码选读
# init 一般是将要实例化一个对象, 一般指调用了new关键字。
00000000 invoke-direct Object-><init>()V, p0
# invoke-virtual 一般是调用方法,在这个例子中调用的方法为 getPackageManager()
0000004A invoke-virtual Context->getPackageManager()PackageManager, v0
# 调用的方法为 getApplicationInfo(String, I)。括号内味参数的列表。v0, v1, v2 是指寄存器的列表。
00000058 invoke-virtual PackageManager->getApplicationInfo(String, I)ApplicationInfo, v0, v1, v2
# const 定义一个变量
00000080 const-string v1, "prepareInit"