### Smali学习笔记 #### 1. Dalvik与Smali ##### 1.1 Dalvik虚拟机概述 Google推出的Dalvik虚拟机(Dalvik Virtual Machine, DVM)首次亮相是在2007年底,随着Android SDK的发布而一同进入公众视线。这款虚拟机是由Dan Bornstein开发的,他将自己的作品命名为Dalvik,这个名字源自他祖先居住过的一个名为Dalvik的小渔村。Dalvik虚拟机是Android平台的核心组件之一,具备以下特点: 1. **体积小巧**:相较于其他虚拟机,Dalvik虚拟机占用较少的内存空间。 2. **专有DEX格式**:支持专有的DEX文件格式,这种格式使得文件体积更小且执行效率更高。 3. **快速寻址**:常量池采用32位索引值,能够快速寻址到类、方法名、字段名及常量。 4. **基于寄存器架构**:Dalvik虚拟机采用了寄存器架构,并配备了一套完整的指令系统。 5. **全面的功能支持**:提供对象生命周期管理、堆栈管理、线程管理、安全与异常管理以及垃圾回收等功能。 6. **每个应用对应独立的虚拟机实例**:所有Android应用程序都在各自的Android系统进程中运行,每个进程都拥有自己的Dalvik虚拟机实例。 ##### 1.2 Dalvik虚拟机与Java虚拟机的区别 尽管Dalvik虚拟机与传统的Java虚拟机(JVM)都属于虚拟机范畴,但二者之间存在明显的区别,具体体现在: 1. **字节码格式**:Java虚拟机运行Java字节码,而Dalvik虚拟机则运行Dalvik字节码。 2. **文件大小**:Dalvik可执行文件通常比Java字节码文件更小。 3. **架构差异**:Java虚拟机基于栈架构,而Dalvik虚拟机则是基于寄存器架构。 这些差异导致了两者之间的不兼容性。 ##### 1.3 Smali概述 Smali是一种针对Dalvik虚拟机字节码的汇编语言。由于Dalvik虚拟机的特殊性,它使用了专有的DEX文件格式而非标准的Java字节码格式。Smali和baksmali分别是用于DEX文件的汇编器和反汇编器,它们将DEX文件转换为.smali文件,该文件包含了易于人类阅读的Smali代码。Smali语言并不是由Google官方定义的,而是由一个名为Jesus Freke的开发者基于Dalvik字节码进行翻译创造的。Smali和baksmali的名称源于冰岛语中的“汇编器”和“反汇编器”。 Smali项目的开源性质使其成为了一种流行的选择,特别是在应用程序逆向工程、广告植入、汉化或破解等领域。它不仅能够反汇编DEX文件,还可以将修改后的Smali代码重新编译成DEX文件。 #### 2. 反编译、编译、打包 ##### 2.1 使用smali和baksmali Smali和baksmali是一组用于处理DEX文件的强大工具。通过baksmali可以将DEX文件反编译为.smali文件,而smali则可以将.smali文件编译回DEX文件。这一过程对于理解和修改Android应用程序非常有用。 ##### 2.2 使用apktool Apktool是一个强大的Android APK文件反编译和重构工具。 ###### 2.2.1 APK组成 APK文件主要包括以下组成部分: - **资源文件**:如图片、音频等多媒体文件。 - **Manifest文件**:包含应用程序的基本信息。 - **Dex文件**:包含应用程序的Dalvik字节码。 - **Libraries**:第三方库文件。 ###### 2.2.2 使用方法 使用Apktool进行反编译的基本步骤如下: 1. 下载并安装Apktool。 2. 将需要反编译的APK文件放置在一个合适的目录下。 3. 执行命令`apktool d <apk_file>`进行反编译。 完成反编译后,可以在生成的文件夹中找到反编译后的资源文件和.smali文件。 ###### 2.2.3 反编译、编译过程 反编译过程包括以下步骤: 1. 解压缩APK文件。 2. 使用baksmali反编译DEX文件。 3. 反编译资源文件。 4. 生成XML配置文件和其他相关文件。 编译过程则与之相反: 1. 使用smali编译.smali文件回DEX格式。 2. 编译资源文件。 3. 将所有文件打包成一个新的APK文件。 ##### 2.3 deodex Deodex是一个工具,用于将已优化的DEX文件转换回原始的未优化状态。这一步骤对于某些类型的逆向工程工作可能是必要的,因为它可以帮助恢复某些在优化过程中丢失的信息。 #### 3. Smali语法规范与格式 ##### 3.1 Dalvik虚拟机字节码指令格式 Dalvik虚拟机字节码指令具有一定的格式,其中包括: - **指令名称**:如`invoke-virtual`。 - **参数**:可能包含寄存器列表、常量值等。 - **操作码**:每个指令都有一个唯一的操作码。 ##### 3.2 Dalvik虚拟机字节码的类型、方法和字段的表示方法 Dalvik字节码中,类型、方法和字段的表示方式如下: ###### 3.2.1 类型 类型表示一般形式为`L<包名>/<类名>;`,例如`Ljava/lang/String;`。 ###### 3.2.2 方法 方法的表示形式为`<方法名>(<参数类型列表>)<返回类型>`,例如`toString()Ljava/lang/String;`。 ###### 3.2.3 字段 字段表示为`<字段名>:<字段类型>`,例如`name:Ljava/lang/String;`。 ##### 3.3 Dalvik虚拟机字节码指令解析 Dalvik字节码指令包括多种类型,例如: - **寄存器表示法**:有两种不同的表示方法,分别适用于不同的情况。 - **空指令**:不执行任何操作。 - **数据操作指令**:如赋值、加减等。 - **返回指令**:结束方法执行并返回结果。 - **数据定义指令**:定义变量等。 - **锁指令**:实现同步操作。 - **实例操作指令**:与对象实例相关。 - **数组操作指令**:处理数组数据。 - **异常指令**:处理异常情况。 - **跳转指令**:控制程序流程。 - **比较指令**:进行数值比较。 - **字段操作指令**:读写字段。 - **方法调用指令**:调用其他方法。 - **数据转换**:不同类型的数据之间的转换。 - **数据运算**:执行数学运算。 ##### 3.4 Smali格式结构 Smali代码具有特定的格式结构,主要包括: ###### 3.4.1 文件格式 每个Smali文件对应一个类,通常以`.smali`为扩展名。文件中包含了类声明、字段声明、方法声明以及字节码指令等内容。 ``` .class public Lcom/example/MyClass; .super Ljava/lang/Object; .field public static final TAG:Ljava/lang/String; = "MyClass" .method public constructor <init>()V ... .end method ``` 其中,`.class`用于声明类信息,`.field`声明字段,`.method`声明方法。 ###### 3.4.2 类的结构 类的结构包括类声明、超类声明、接口声明、字段声明、方法声明等部分。 ``` .class public Lcom/example/MyClass; .super Ljava/lang/Object; .implements Landroid/app/Activity; .field public static final TAG:Ljava/lang/String; = "MyClass" .method public constructor <init>()V ... .end method .method public onCreate(Landroid/os/Bundle;)V ... .end method ``` #### 4. 如何分析和修改Smali代码 分析和修改Smali代码是逆向工程的关键环节。 ##### 4.1 定位分析的方法 分析Smali代码时,可以通过以下方法定位关键信息: ###### 4.1.1 关键信息查找法 通过搜索关键字或模式来查找相关的代码段。 ###### 4.1.2 代码动态调试法 使用调试工具在运行时观察程序行为,帮助理解代码逻辑。 ##### 4.2 代码修改方法 修改Smali代码时,需要注意以下几点: - **保持格式一致性**:确保修改后的代码仍然符合Smali语言的语法规范。 - **测试验证**:修改后应重新编译并测试,确保程序功能正确无误。 #### 5. 参考资料 - [Smali官方GitHub项目](https://github.com/JesusFreke/smali) - [Android官方文档](https://developer.android.com/) - [Dalvik虚拟机技术文档](https://source.android.com/devices/tech/dalvik/) - [Apktool项目主页](https://ibotpeaches.github.io/Apktool/) - [Dex文件格式文档](https://source.android.com/devices/tech/dalvik/dex-format) 通过对上述知识点的学习,读者可以深入了解Dalvik虚拟机的工作原理以及Smali语言的基础知识,这对于从事Android应用开发、逆向工程或安全研究等工作的人来说都是非常有价值的。
剩余44页未读,继续阅读
- prahs2014-10-01非常好,正找这个呢,文档格式也不错~
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助