首页
社区
课程
招聘
[原创]分析一个简单的 .dex 文件 —— Hello.dex
发表于: 2014-2-20 09:22 32559

[原创]分析一个简单的 .dex 文件 —— Hello.dex

2014-2-20 09:22
32559

最近在学习dex的文件格式,阅读非虫大大的《Android软件安全与逆向分析》里dex的章节内容,其实信息量蛮大的。读过一遍后,觉得对dex的文件格式的学习还少点什么。下一章odex内容看了几行后,这种不安全的感觉愈发变得强烈起来,会想起“空中楼阁”的寓言。决定自己写一个可执行的小程序,编译成.dex格式,分析过一遍后再往下进行书的内容。觉得这东西总归是基础功,属于必须熟悉的那一类。

分析的过程尽量不去翻书 ,尽量模拟原生的分析过程 。一些结构的定义 ,多有参考 Android Open Source Project 上的在线文档 。

参考的官网文档 :
Dalvik Executable Format

一方面反刍已经学到的东西,一方面把分析的过程里记录的东西整理出来。感觉信息量巨大,不记录下来用脑袋肯定记忆不住。最初看书的时候是用笔在纸上写写画画的,后来借助了office表格做标记,所以也有些图表出来。

****************edited 2014.02.20 ********************

结束的时候,把文字、代码和表格 ,所有东西整理出来以后,发现有 19 页纸张的大小 。若发帖子的话 ,长度肯定会比李咏的脸都长,这发帖后怎么阅读啊。最后决定整理成文档做附件。.dex 格式的数据结构和描述知识 Android Open Source Project 都公开出来了,分析思路非虫大大书里面描述的也很详细,没有新添加的东西。按照自己对 .dex 格式和官方对应文档的理解,推理汇整了一下,作为学习.dex格式的一个小结。
文档的目录如下 :

第一部分:创造一个可供分析的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 反编译的结果比较

    1. 测试环境
    2. java 源码和编译方法
    3. 使用 ADB 运行测试
    4. 重要说明

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 427
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
和Android软件安全与逆向分析里面说的有什么具体区别呢
2014-2-20 09:31
0
雪    币: 90
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
因为 .dex 的文件格式没有变化 ,所以跟书里面的描述的对象是一个东西 。
记录下来的最主要的目的是为个梳理下学到的东西 ,加上了对 dex 文件格式自己的理解 。如果把书中的分析当作数学教材上上“例题”, 本篇帖子就是一道“练习题”,为了强化例题所表达的分析方法和知识点 。

差别在
(1).dex 文件是自己编译的 ,分析的对象略有差异 。
(2)对于 .dex 的文件格式 ,非虫大大的参考资料有 Android 4.1 系统源码里 dalvik/doc/ 目录下的文档 ,和 dalvik 的实现源码 ;本次分析主要是根据 AOSP 里dalvik 的在线文档描述 。
(3).dex 里具体数据结构,非虫大大的描述的侧重点,从源码里 .dex 的实现代码分析而得的;我就对照着 dalvik 文档里 dex 格式说明来解析的,是基于文档而非基于代码的,相对“浅”一些。
2014-2-20 13:51
0
雪    币: 761
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
赞一个,顺便问一下,楼主研究这个花了多长时间呢?
2014-2-25 17:55
0
雪    币: 90
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
业余时间,从看非虫大大的书到最后整理出来 ,一周多。
2014-2-26 08:42
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对于楼主这样默默奉献的人,我只能顶了。
2014-9-29 16:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常不错,顶了
2014-9-30 17:50
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
精读中 ,备份一下
1:string表的序号从0开始编号可以方便后面的对比。
2:关于string_data_item
     a) leb128表示的是字符串的长度,而不是字符串数据的长度,即leb128=len(str),在中文里,这个差别就看出来了
     b)str是utf8格式编码的,以0字符结束。
3)proto_id_item的第二个item的short_string应该是'VL'不是'V'
2014-10-17 09:59
0
雪    币: 8
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很好的东西多谢分享
2015-3-9 10:51
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看不懂啊!!!!!!!!!
2015-3-9 19:16
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
LZ辛苦了,使用010Editor 的 dex模板看起来更直观
http://www.sweetscape.com/010editor/templates/
2015-3-10 16:41
0
雪    币: 7
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
顶一个  分析的很不错
2016-3-17 15:15
0
雪    币: 76
活跃值: (59)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
有一个问题。源码里对于DexClassDataHeader的staticFieldsSize字段等,定义的类型是u4,而官方文档和具体解析的时候都是uleb128。我不太确定这个含义,意思是Dex存储的时候用uleb128,但是读到内存的时候,还是恢复到u4?
2016-5-25 09:45
0
雪    币: 2904
活跃值: (1337)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
14
非常不错 感谢贡献
2016-5-26 11:47
0
雪    币: 52
活跃值: (31)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
感谢楼主分享,多实操
2016-8-2 15:03
0
雪    币: 48
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
很不错,学习啦
2016-9-8 15:33
0
游客
登录 | 注册 方可回帖
返回
//