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

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

2014-2-20 09:22
31459
最近在学习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 反编译的结果比较

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

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

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