首页
社区
课程
招聘
[原创]android中Dex文件结构详解
发表于: 2015-8-17 23:34 25243

[原创]android中Dex文件结构详解

2015-8-17 23:34
25243

写太多文字我想大家看着也烦,我写着也累。

dex是什么? 简单说就是优化后的android版.exe。每个apk安装包里都有。
相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。

为何要研究dex格式?因为dex里面包含了所有app代码,利用反编译工具可以获取java源码。理解并修改dex文件,就能更好的apk破解和防破解。



几个注意点:
1. SHA-1签名字段中SHA是个啥?
SHA(Secure Hash Algorithm, 安全散列算法)是美国国家安全局设计,美国国家标准与技术研究院发布的一系列密码散列函数。SHA-1看起来和MD5算法很像,也许是Ron Rivest在SHA-1的设计中起了一定的作用。SHA-1的内部比MD5更强,其摘要比MD5的16字节长4个字节,这个算法成功经受了密码分析专家 的攻击,也因而受到密码学界的广泛推崇。这个算法在目前网络上的签名,BT软件里就有大量使用,比如在BT里要计算是否同一个种子时,就是利用文件的签名 来判断的。同一份8G的电影从几千BT用户那里下载,也不会出现错误的数据,导致电影不播放。

2.map基址干啥地?
map中描述包括了在dex文件里可能出现的所有类型。

map数据排列结构定义如下:
typedef struct DexMapList {
    u4 size; /* #of entries inlist */
    DexMapItem list[1]; /* entries */
}DexMapList;

每一个map项的结构定义如下:
typedef struct DexMapItem {
    u2 type; /* type code (seekDexType* above) */
    u2 unused;
    u4 size; /* count of items ofthe indicated type */
    u4 offset; /* file offset tothe start of data */
}DexMapItem;

DexMapItem结构定义如下:
enum{
    kDexTypeHeaderItem = 0x0000, //头文件
    kDexTypeStringIdItem = 0x0001,
    kDexTypeTypeIdItem = 0x0002,
    kDexTypeProtoIdItem = 0x0003,
    kDexTypeFieldIdItem = 0x0004,
    kDexTypeMethodIdItem = 0x0005, //方法
    kDexTypeClassDefItem = 0x0006, //类
    kDexTypeMapList = 0x1000, //Map
    kDexTypeTypeList = 0x1001,
    kDexTypeAnnotationSetRefList = 0x1002,
    kDexTypeAnnotationSetItem = 0x1003,
    kDexTypeClassDataItem = 0x2000,
    kDexTypeCodeItem = 0x2001,
    kDexTypeStringDataItem = 0x2002, //字符
    kDexTypeDebugInfoItem = 0x2003,
    kDexTypeAnnotationItem = 0x2004,
    kDexTypeEncodedArrayItem = 0x2005,
    kDexTypeAnnotationsDirectoryItem = 0x2006,
};

通过DexMapItem定义可以发现:这个定义的像类、字符串、方法等资源和dex文件头里定义的类型有很多是一样的。其实这个map的数据,就是头里类型的重复,完全是为了检验作用而存在的。当Android系统加载dex文件时,如果比较文件头类型个数与 map里类型不一致时,就会停止使用这个dex文件

3.dex文件有个天大的好处:它可以直接用DexClassLoader类加载,这叫动态加载。于是我们只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

因为是新手贴,这里只做到抛砖引玉,画图方便大家记忆并给出了几个关键性技术术语。技术拓展,还请自行在百度上顺藤摸瓜,按图索骥。


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

收藏
免费 9
支持
分享
最新回复 (24)
雪    币: 6
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主知道IntelliJ IDEA怎么调试smali文件么,我拖进去好像识别不了.smali后缀的文件
2015-8-18 01:01
0
雪    币: 87
活跃值: (88)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
不会。。IntelliJ IDEA我没用过,smali我都是用eclipse凑合调试的。
不过我帮你查了下:的确IntelliJ IDEA也能调试smali,貌似需要插件smalidea。
参考:13aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0l9#2x3e0p5J5i4K6u0W2j5$3!0E0i4K6u0r3j5h3&6I4N6h3q4F1i4K6u0r3N6$3I4Y4k6W2)9J5c8U0t1H3x3e0g2Q4x3V1j5H3y4K6t1J5i4K6u0r3x3U0V1H3x3o6y4Q4x3X3g2Z5N6r3#2D9
2015-8-18 14:50
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了~楼主辛苦
2015-8-19 17:25
0
雪    币: 180
活跃值: (604)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
"您查看的图片来自网易相册" 楼主,图片挂了
2015-8-21 08:20
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文,谢谢楼主!!
2015-8-21 13:51
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文,结构清晰呀。
2015-8-21 14:55
0
雪    币: 30
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以的 学习了
2015-8-23 12:25
0
雪    币: 87
活跃值: (88)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
多谢提醒,我又把图重新上传了下
2015-8-23 23:06
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
谢谢分享知识,看雪有你更精彩
2015-8-23 23:17
0
雪    币: 8
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很不错的贴子
2015-8-24 21:49
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
又领教了高招
2015-8-26 10:08
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
很好,资料不错
2015-8-26 12:29
0
雪    币: 144
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
图片看着方便多了,感谢楼主细心制作。
2015-8-31 00:17
0
雪    币: 7129
活跃值: (9949)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
15
leb128 处理起来 稍微有些蛋疼。
2015-8-31 14:47
0
雪    币: 501
活跃值: (5222)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
搞份Android Dex文件解析的代码,更给力。
2015-8-31 15:13
0
雪    币: 427
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个很给力,收藏
2015-8-31 15:18
0
雪    币: 158
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
apktool d -d 反编译apk,然后使用-d编译,新建Java项目,把smali作为src文件夹,ddms进程debug,idea挂上断点
2015-8-31 16:39
0
雪    币: 215
活跃值: (417)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
挺不错的.谢谢分享
2015-9-1 22:13
0
雪    币: 268
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
思路好清晰
2015-9-4 14:20
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
真棒,解决了我对Map数据项的疑惑,我之前不明白为什么MapItem要是DexHeader里数据的重复,原来是做校验的。

对了,请问楼主有看《Android软件安全与逆向分析》这本书吗,最近在看这本书,遇到了一些疑惑,想请教一下。
2015-9-5 01:17
0
雪    币: 44
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
擦囧,内容好像少了一点,少的惨不忍睹,不过最后那句话,直接用DexClassLoader类加载还不错,还有那张彩色的图片,总的来说辛苦了
2016-1-15 11:59
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
又学习了
2016-1-15 14:52
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
分析不错,好文,学习了
2016-1-20 10:27
0
雪    币: 548
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
谢谢
2023-3-21 11:46
0
游客
登录 | 注册 方可回帖
返回