没有合适的资源?快使用搜索试试~ 我知道了~
1,Dalvik 与 Smali 概述。2,反编译、编译的过程。3Smali的语法规范与格式(Dalvik虚拟机字节码指令解析,Smali格式结构)。4,分析和修改Smali代码。
资源推荐
资源详情
资源评论
Smali 学习笔记
目录
1 Dalvik 与 Smali .......................................................................................................................... 3
1.1 Dalvik 虚拟机概述 ........................................................................................................ 3
1.2 Dalvik 虚拟机与 Java 虚拟机的区别 ........................................................................... 3
1.3 Smali 概述 ..................................................................................................................... 3
2 反编译、编译、打包 ............................................................................................................... 3
2.1 使用 smali 和 baksmali ................................................................................................. 3
2.2 使用 apktool ................................................................................................................. 4
2.2.1 APK 组成 ........................................................................................................... 4
2.2.2 使用方法 ........................................................................................................... 4
2.2.3 反编译、编译过程 ........................................................................................... 5
2.3 deodex ........................................................................................................................... 6
3 Smali 语法规范与格式 ............................................................................................................. 7
3.1 Dalvik 虚拟机字节码指令格式 .................................................................................... 7
3.2 Dalvik 虚拟机字节码的类型、方法和字段的表示方法 .......................................... 31
3.2.1 类型 ................................................................................................................. 31
3.2.2 方法 ................................................................................................................. 32
3.2.3 字段 ................................................................................................................. 32
3.3 Dalvik 虚拟机字节码指令解析 .................................................................................. 32
3.3.1 两种不同的寄存器表示法 ............................................................................. 32
3.3.2 空指令 ............................................................................................................. 33
3.3.3 数据操作指令 ................................................................................................. 33
3.3.4 返回指令 ......................................................................................................... 33
3.3.5 数据定义指令 ................................................................................................. 34
3.3.6 锁指令 ............................................................................................................. 34
3.3.7 实例操作指令 ................................................................................................. 34
3.3.8 数组操作指令 ................................................................................................. 34
3.3.9 异常指令 ......................................................................................................... 35
3.3.10 跳转指令 ......................................................................................................... 35
3.3.11 比较指令 ......................................................................................................... 35
3.3.12 字段操作指令 ................................................................................................. 36
3.3.13 方法调用指令 ................................................................................................. 36
3.3.14 数据转换 ......................................................................................................... 37
3.3.15 数据运算 ......................................................................................................... 37
3.4 Smali 格式结构 ........................................................................................................... 37
3.4.1 文件格式 ......................................................................................................... 37
3.4.2 类的结构 ......................................................................................................... 40
4 如何分析和修改 Smali 代码 .................................................................................................. 42
4.1 定位分析的方法 ......................................................................................................... 42
4.1.1 关键信息查找法 ............................................................................................. 42
4.1.2 代码动态调试法 ............................................................................................. 42
4.2 代码修改方法 ............................................................................................................. 42
5 参考资料:............................................................................................................................. 45
文档修改记录
修改记录 提交人 版本
文档创建 吴志栩
V1.0
修订,完善 邹军华
V2.0
百度云 ROM 官方出品,如需使用,请注明来源
【Smali 学习笔记】
1 Dalvik 与 Smali
1.1 Dalvik 虚拟机概述
Google 于 2007 年底正式发布了 Android SDK,Dalvik 虚拟机也第一次进入了我们的视野。
它的作者是丹·伯恩斯坦(Dan Bornstein),名字来源于他的祖先曾经居住过的名叫 Dalvik
的小渔村。Dalvik 虚拟机作为 Android 平台的核心组件,拥有如下几个特点:
1) 体积小,占用内存空间小;
2) 专用的 DEX 可执行文件格式,体积更小,执行速度更快;
3) 常量池采用 32 位索引值,寻址类方法名,字段名,常量更快;
4) 基于寄存器架构,并拥有一套完整的指令系统;
5) 提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等
重要功能;
6) 所有的 Android 程序都运行在 Android 系统进程里,每个进程对应着一个 Dalvik 虚
拟机实例。
1.2 Dalvik 虚拟机与 Java 虚拟机的区别
Dalvik 虚拟机与传统的 Java 虚拟机有着许多不同点,两者并不兼容,它们显著的不同点
主要表现在以下几个方面:
1) Java 虚拟机运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码;
2) Dalvik 可执行文件体积更小;
3) Java 虚拟机基于栈架构,Dalvik 虚拟机基于寄存器架构。
1.3 Smali 概述
我们都知道,Dalvik 虚拟机(Dalvik VM)是 Google 专门为 Android 平台设计的一套虚拟
机。区别于标准 Java 虚拟机 JVM 的 class 文件格式,Dalvik VM 拥有专属的 DEX 可执行文件
格式和指令集代码。smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器,反
汇编后 DEX 文件会产生.smali 后缀的代码文件,smali 代码拥有特定的格式与语法,smali 语
言是对 Dalvik 虚拟机字节码的一种解释。
Smali 语言起初是由一个名叫 JesusFreke 的 hacker 对 Dalvik 字节码的翻译,并非一种官
方标准语言,因为 Dalvik 虚拟机名字来源于冰岛一个小渔村的名字,JesusFreke 便把 smali
和 baksmali 取自了冰岛语中的“汇编器”和“反编器”。目前 Smali 是在 Google Code 上的一
个开源项目。
虽然主流的 DEX 可执行文件反汇编工具不少,如 Dedexer、IDA Pro 和 dex2jar+jd-gui,
但 Smali 提供反汇编功能的同时,也提供了打包反汇编代码重新生成 dex 的功能,因此 Smali
被广泛地用于 APP 广告注入、汉化和破解,ROM 定制等方面。
2 反编译、编译、打包
2.1 使用 smali 和 baksmali
smali 和 baksmali 这两个工具汇编和反汇编 DEX 文件的使用非常简单,我们使用
baksmali.jar 反汇编 HelloWorld.dex 只需输入以下命令:
———————————————————————————————————————
java -jar baksmali.jar -o HelloWorldOut HelloWorld.dex
———————————————————————————————————————
命令执行成功后会在 HelloWorldOut 目录下生成相应 smali 文件,我们在修改完 smali
代码后,使用 smali.jar 重新汇编成 HelloWorld.dex,输入命令:
———————————————————————————————————————
java -jar smali.jar -o HelloWorld.dex HelloWoldOut
———————————————————————————————————————
我们只需把生成的 HelloWorld.dex 通过 adb 命令 push 到手机上,并使用 dalvikvm 命令
便可以运行这个 DEX 文件,执行的命令如下:
———————————————————————————————————————
adb push HelloWorld.dex /data/local/
adb shell dalvikvm -cp /data/local/HelloWorld.dex HelloWorld
———————————————————————————————————————
使用 smali 和 baksmali 工具只能用来汇编和反汇编 Android 的可执行文件,因此使用这
两个工具是无法完成 Android 安装包(APK)的反编译和打包的功能,好在一个名为
android-apktool 的 Google 开源工具可以完成这个事情。
2.2 使用 apktool
apktool 工具是在 smali 工具的基础上进行封装和改进的,除了对 DEX 文件的汇编和反
汇编功能外,还可以对 APK 中已编译成二进制的资源文件进行反编译和重新编译。同时也
支持给 smali 代码添加调试信息以支持断点调试。因此我们直接使用 apktool 工具来反编译
Android apps,而不是 smali 和 baksmali 工具。
2.2.1 APK 组成
在介绍 apktool 使用之前,我们先来看看一个 apk 包的组成。apk 文件其实是 zip 压缩包
格式,我们使用工具进行解压后可以其目录组成,以 HelloWorld.apk 为例:
———————————————————————————————————————
|-- HelloWorld/
|-- AndroidManifest.xml 被编译成二进制的配置文件
|-- class.dex Android 可执行文件
|-- resources.arsc 被编译成二进制的主资源文件
|-- assets/ 不需编译的原始资源文件目录
|-- res/ 资源文件目录
|-- lib/ 库文件目录
|-- META-INF/ APK 的签名信息
———————————————————————————————————————
2.2.2 使用方法
使用 apktool 反编译 HelloWorld.apk 文件到 out 目录的方法:
———————————————————————————————————————
java -jar apktool.jar d HelloWorld.apk out/
———————————————————————————————————————
apktool d 命令执行成功会在 out 目录下产生如下所示的一级目录结构:
———————————————————————————————————————
|-- out/
|-- AndroidManifest.xml 配置文件
|-- apktool.yml 反编译生成的文件,供 apktool 使用
|-- assets/ 不需反编译的资源文件目录
|-- lib/ 不需反编译的库文件目录
|-- res/ 反编译后的资源文件目录
|-- smali/ 反编译生成的 smali 源码文件目录
———————————————————————————————————————
在浏览各个子目录的结构后,我们可以发现其结构原始 APP 工程目录结构基本一致,
smali 目录结构对应着原始的 java 源码 src 目录,而 META-INF 目录已经不见了,因为反编译
会丢失签名信息。反编译后会多生成 apktool.yml 文件,这个文件记录着 apktool 版本和 Apk
文件名和是否 framework 文件等基本信息,在 apktool 重新编译时会使用到。
在修改完相应的 smali 代码和资源文件后,我们可以使用以下命令进行编译打包:
———————————————————————————————————————
java -jar apktool.jar b out/ HelloWorld.apk
———————————————————————————————————————
有时候我们在反编译系统 app 的时候会出错,提示无法找到资源,必须先加载合适的
framework 资源文件。这是因为 apktool 编译和反编译过程会依赖到 framework 中的代码和
资源,而这个 app 中使用了 framework-res.apk 之外扩展的 framework 资源文件。因此,我
们通常反编译前会把 system/framework/目录下所有资源文件 apk 都先加载在 apktool 工具中。
使用的命令如下:
———————————————————————————————————————
java -jar apktool.jar if framework-res.apk
———————————————————————————————————————
2.2.3 反编译、编译过程
我们执行 apktool d 命令可以看整个反编译过程的输出信息:
———————————————————————————————————————
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /home/wzx/apktool/framework/1.apk
I: Loaded.
I: Decoding file-resources...
I: Decoding values*/* XMLs...
I: Done.
I: Copying assets and libs...
剩余44页未读,继续阅读
资源评论
hua_csdn
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功