没有合适的资源?快使用搜索试试~ 我知道了~
对Android中的Dex文件格式进行详细分析,通过一个简单的例子可以更好的分析Dex的格式。
资源推荐
资源详情
资源评论
实例分析.dex 文件格式 -- 以 hello.dex 为例
月蓝
2014.03.23
前言
最近在学习 Android 平台 Dalvik 虚拟机的可以执行文件 .dex 的文件格式,参考阅读的是《Android 软件
安全与逆向分析》里第四章 dex 文件格式的章节内容 。
分析文件格式的过程尽量不去翻书,尽量模拟原生的分析过程。一些结构的定义,多有参考 Android Open
Source Project 上的在线文档。
参考的官网文档:
Dalvik Executable Format : http://source.android.com/devices/tech/dalvik/dex-format.html
一方面反刍作者在书中描述的东西,一方面把分析的过程里记录的东西整理出来。最初看书的时候,方便理
解作者的思路,是用笔在纸上画出数据的逻辑结构,后来在电脑上整理使用 office 表格做标记 。
内容的目录结构如下 :
第一部分:创造一个可供分析的 Hello.dex
1. 测试环境
2. java 源码和编译方法
3. 使用 ADB 运行测试
4. 重要说明
第二部分:分析过程
1. dex 整个文件的布局
2. header
3. string_ids
4. type_ids
5. proto_ids
6. field_ids
7. method_ids
8. class_defs
8.1 class_def_item
8.2 class_def_item --> class_data_item
8.3 class_def_item --> class_data_item --> code_item
8.4 分析 main method 的执行代码并与 smali 反编译的结果比较
Table of Contents
前言............................................................................................................................................................2
第一部分:创造一个可供分析的 Hello.dex...........................................................................................4
1. 测试环境 ..........................................................................................................................................4
2. java 源码和编译方法.......................................................................................................................4
3. 使用 ADB 运行测试 .......................................................................................................................5
4. 重要说明 ..........................................................................................................................................5
第二部分:分析过程................................................................................................................................6
1. dex 整个文件的布局........................................................................................................................6
2. header................................................................................................................................................6
3. string_ids.........................................................................................................................................11
4. type_ids...........................................................................................................................................13
5. proto_ids.........................................................................................................................................13
6. field_ids...........................................................................................................................................14
7. method_ids......................................................................................................................................15
8. class_defs.........................................................................................................................................16
8.1 class_def_item..........................................................................................................................16
8.2 class_def_item --> class_data_item.........................................................................................18
8.3 class_def_item --> class_data_item --> code_item..................................................................19
8.4 分析 main method 的执行代码并与 smali 反编译的结果比较............................................21
Version History........................................................................................................................................24
第一部分:创造一个可供分析的 Hello.dex
Windows 操作系统也有五花八门的应用 ,可是想当年学习编程语言的第一个程序,却是在 Turbo C 蓝漆
漆的界面里笨拙地敲一个 Hello World 程序 ,然后又在黑漆漆的命令行里打印出的一行输出结果 ,“Hello
World”。
Android 上也能实现类似的效果 ,可以使用 dalvikvm 执行一个运行于命令行的 Hello World 。
简要的过程如下:
写代码 Hello.java
编译成 Android Dalvik Virtual Machine 的可执行文件 Hello.dex
使用 ADB 运行测试
内容主要参考 Android 4.4 源码里 dalvik / docs / hello-world.html 文件 。
1. 测试环境
Ubuntu 12.04 64-bit
JDK 1.6
安装 Android SDK,并安装 Android SDK build_tools , 最新版是 19.0.1
具有 Root 权限的 ADB shell
2. java 源码和编译方法
创建 java 源文件 ,内容如下
代码:
public class Hello
{
public static void main(String[] argc)
{
System.out.println("Hello, Android!\n");
}
}
在当前工作路径下 , 编译方法如下 :
(1)编译成 java class 文件
执行命令 : javac Hello.java
编译完成后 ,目录下生成 Hello.class 文件 。可以使用命令 java Hello 来测试下 ,会输出代码中的 “
Hello, Android!” 的字符串 。
(2) 编译成 dex 文件
编译工具在 Android SDK 的路径如下 ,其中 19.0.1 是 Android SDK build_tools 的版本 ,请按照在本
地安装的 build_tools 版本来 。建议该路径加载到 PATH 路径下 ,否则引用 dx 工具时需要使用绝对路径 。
./build-tools/19.0.1/dx
执行命令 : dx --dex --output=Hello.dex Hello.class
编译正常会生成 Hello.dex 文件 。
3. 使用 ADB 运行测试
测试命令和输出结果如下 :
$ adb root
$ adb push Hello.dex /sdcard/
$ adb shell
root@maguro:/ # dalvikvm -cp /sdcard/Hello.dex Hello
Hello, Android!
4. 重要说明
(1)测试环境使用真机和 Android 虚拟机都可以的 。核心的命令是
dalvikvm -cp /sdcard/Hello.dex Hello
-cp 是 class path 的缩写 ,后面的 Hello 是要运行的 Class 的名称 。网上有描述说输入 dalvikvm --help
可以看到 dalvikvm 的帮助文档 ,但是在 Android4.4 的官方模拟器和自己的手机上测试都提示找不到
Class 路径 ,在 Android 老的版本 ( 4.3 ) 上测试还是有输出的 。
(2)因为命令在执行时 , dalvikvm 会在 /data/dalvik-cache/ 目录下创建 .dex 文件 ,因此要求 ADB 的
执行 Shell 对目录 /data/dalvik-cache/ 有读、写和执行的权限 ,否则无法达到预期效果 。
// added stop
对于生成的 Hello.dex 在 linux 下使用 vi -b Hello.dex 命令打开它,此命令必须添加-b 选项,否则在输入下
一个命令时,会有丢失行信息的提示。
然后在命令模式下输入 :%!xxd 命令就可以转化为 2 进制的表示方式。
剩余23页未读,继续阅读
资源评论
携墨
- 粉丝: 36
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功