dex文件格式

所需积分/C币:50 2015-09-13 11:33:07 295KB PDF
收藏 收藏 16
举报

对Android中的Dex文件格式进行详细分析,通过一个简单的例子可以更好的分析Dex的格式。
Table of contents 前言. 第一部分:创造一个可供分析的Helo.dex… 1.测试环境 2.java源码和编译方法 4 3.使用ADB运行测试 4.重要说明. ·······:·····:·:·:··················:····· 第二部分:分析过程 1.dex整个文件的布局 2. header… :···· ···· 3. string_ids..........11 4.type_ids…………,,,…,,…,….,….,,…,…,…, 着非··音着音,非看非·鲁音非鲁音··鲁···鲁·。自·非着 3 5. proto ids 13 6. field id s 14 7. method ids..........,.,…..…....……15 8. class def 16 8.1classdefitem,wwwwwww.16 8. 2 class def item -- class data item 18 8. 3 class def item -- class data item -- code item 19 84分析 main method的执行代码并与smli反编译的结果比较.… 21 Version History....,…,,… 24 第一部分:创造一个可供分析的Hell.dex Windows操作系统也有五花八门的应用,可是想当年学习编程语言的第一个程序,却是在 Turbo c蓝漆 漆的界面里笨拙地敲一个 Hello worle程序,然后又在黑漆漆的命令行里打印出的-行输岀结果,“Ielo World> android上也能实现类似的效果,可以使用 dalvik执行一个运行于命令行的 Hello world 简要的过程如下 写代码Hell.java 编译成 Android dalvik virtual machine的可执行文件 Hello, dex 使用ADB运行测试 内容主要参考 Android4.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 2java源码和编译方法 创建java源文件,内容如下 代码: public class hello public static void main(Stringl] argc) System. out.printIn (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-0 utput= Hello. dex hello. class 编译正常会生成 Hello, dex文件。 3使用ADB运行测试 测试命令和输出结果如下 S adb root S adb push Hello. dex /sdcard/ S 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是要运行的Clas的名称。网上有描述说输入 dalvik-help 可以看到 dalvik的帮助文档,但是在 Android44的官方模拟器和自己的手机上测试都提示找不到 Class路径,在 android老的版本(4.3)上测试还是有输出的。 (2)因为命令在执行时, dalvik会在ldaa/ dalvik- cache/目录下创建dex文件,因此要求ADB的 执行She对目录/ data/dalvik- cache/有读、写和执行的权限,否则无法达到预期效果。 // added stop 对于牛成的 Hello,dex在 linux下使用ⅵi- b Hello.dex命令打开它,此命令必须添加-b选项,否则在输入下 一个命令时,会有丢失行信息的提示。 然后在命令模式下输入:%!Xxd命令就可以转化为2进制的表示方式 第二部分:分析过程 1.dex整个文件的布局 逻辑上,可以把deⅹ文件分成3个区,文件头、索引区和数据区。索引区的ids后缀为 identifiers的缩写, 意思是某件东西的识别码;该区的数据,多是指向数据区的指针。 文件头 header 文件头 string_ids 字符串的索引 type_ids 类型的索引 索引区 proto ids 方法原型的索引 field ids 域的索引 method ids 方法的索引 class defs 类的定义区 数据区 data 数据区 link data 链接数据区 2 header deⅹ文件里的 header。除了描述dex文件的文件信息外,还有文件里其它各个区域的索引。 header对应成 结构体类型,逻辑上的描述我用结构体 header item来理解它。先给出结构体里面用到的数据类型 byte和 uint的解释,然后再是结构体的描述,后面对各种结构描述的时候也是用的这种方法。 ubyte 8-bit unsinged int uint 32-bit unsigned int, little-endian struct header item mbyte[ 8 magic unit checksum mbyte[20 siganature uint file size: uint header size; unit endian_ tag uint link size uInt link off: uint map_off uint string_ids_size; uint string ids off uInt ype_las_size uint type_ ids_off uint proto ids size uint proto_ids_off uint method ids size. uint method ids off: uint class defs size uint class aets o f data size. uint data off 里面的元素里,除了蓝色字体标志的,都是一对一对以size和_off为后缀,size表示对应区块里 元素的个数或大小,off表示距离文件起始位置的煸移量,是 offset的略写。蓝色色字体标志的,多是描述 该dex文件信息的内容. Header的大小固定为0x70,偏移地址从0x00到0x70,提取信息如下 0000000:6465780a30333500175e36c1b501e2 db dex.035.^6 0000010:76354d971289c00830b1506a75124cbw5M.…0.pjuL 0000020:e4020000700000007856341200000000..xV4. 0000030:00000000440200000c00000070000000…D. 0000040:07000000a800000003000000c4000000… 0000050:01000000e800000004000000f0000000 0000060:0100000010010000b401000030010000 根据结构体描述和2进制信息,整理出 header item的內容如下 address name size byte value 0 Magic[8] 0X6465780a30333500 8 checksum oXc1365e17 ISignature[20] 0 20 file size 0XO2e4 24 header size 28 endan tag 84244444444444444 0x70 0x12345678 2C link size 0X00 30 link off 0x00 34 map_off O0244 38 string ids sIze Oe 3C string_ids_off 0X70 40 type ids size 0X07 44 type off Oxa8 48 proto_ids_ size 4 OXO3 4C oto ids off 0xC4 50 eld ids size 0X01 54 field ids off Oxen 58 method ids size 4 0X04 5C method ids off 4 60 class defs size 4 OXO 64 class defs off 0×0110 68 data size 4 0x01b4 6C data_off 4 O0130 里面一对一对以siZe和off为后缀的描述: data size是以Byte为单位描述data区的大小,其余的 size都是描述该区里元素的个数;off描述相对与文件起始位置的偏移量。其余的6个是描述.deX文件信 息的,各项说明如下 (1) magic value 这8个字节一般是常量,为了使.dex文件能够被识影出来,它必须出现在.dex文件的最开头的 位置。数组的值可以转换为一个字符串如下 {0x640X650x780x0a0x300x330X350x00} dexino35\0 中间是一个符号,后面035是Dex文件格式的版本 (2)checksum FA signature 文件校验码,使用 alder32算法校验文件除去 malgo, checksum外余下的所有文件区域,用于检 查文件错误 Signature,使用SHA-1算法hash除去 magIC, checksum和 Signature外余下的所有文件区域 用于唯一识别本文件 (3) file size Dcx文件的大小。 (4)header size header区域的大小,单位Byte,一般固定为0x70常量。 (5)endian_tag 大小端标签,标准.dex文件格式为小端,此项一般固定为0x12345678常量。 (6)map_off map item的偏移地址,该item属于data区里的内容,值要大于等于 data off的大小。结构如 ma p_list描述。 定义位置:data区 引用位置: header区 ushort 16-bit unsigned int, little-endian uint 32-bit unsigned int, little-endian struct maplist uint SIze map_item list [size struct map_Item ushort type ushort unuse uint size uint offset: map_list里先用一个uint描述后面有size个 map_Item,后续就是对应的size个 map_iten描述 map_itel结构有4个元素:type表示该 map_item的类型,本节能用到的描述如下,详细 Dalvik Executable format里 Type Code的定义;size表示再细分此item,该类型的个数; offset是第一个元 素的针对文件初始位置的偏移量;uuse是用对齐字节的,无实际用处 Item Type Constant Value Item Size In Bytes header item TYPE HEADER ITEM 0X0000 0X70 string_id_item TYPE_STRING_ID_ITEM 0X0001 O04 type id item TYPE_TYPE_D ITEM 0×00020×04 proto_id_item TYPE_PROTO_ID_ITEM 0X0003 field id item TYPE FIELD ID ITEM 0X0004 0X08 method id item TYPE METHOD ID ITEM 0x0005 0×08 class_def_item TYPE_CLASS_DEF_ITEM 0X0006 O20 map list TYPE MAP LIST 0X1000 4+(item size * 12 type_list TYPE TYPE凵ST 0X1001 14+(item size*2) annotation_set_refTYPE_ANNOTATION_SET_REFOX1002 4+(item size *4 annotation set iteTYPE ANNOTATION SET ITENOx1003 14+(item size*4) class data item TYPE CLASS DATA ITEM 0X2000 implicit; must parse code item TYPE CODE ITEM 0X2001 mplicit; must parse string_data item TYPE_STRING_DATA_ITEM 0X2002 implicit; must parse debug_ info_item TYPE_DEBUG_INFO_ITEM 0x2003 implicit; must parse annotation_item TYPE_ANNOTATION_ITEM 0x 2004 implicit; must parse encoded array iteTYPE ENCODED ARRAY ITENOX2005 implicit; must parse annotations directTYPE ANNOTATIONS DIRECT0X2006 implicit; must parse header->map_off=0x0244,偏移为0244的位置值为0x000d 每个 map_ item描述占用12Bye,整个 map list占用12*size+4个字节。所以整个 map list占用空 间为12*13+4=160=0x00a0,占用空间为0x0244~0x02E3。从文件内容上看,也是从0x0244 到文件结束的位置。 0000240:c80200000d0000000000000001000000 0000250:00000000010000000e00000070000000 0000260:0200000007000000a800000003000000 000270:03000000c40000000400000001000000 0000280:e80000000500000004000000f0000000…… 0000290:06000000010000001001000001200000 ··· 00002a0:02000000300100000110000002000000.0 00002b0:68010000022000000e00000076010000h..V. 00002c0:03200000020000002802000000200000.… 00002d0:01000000340200000010000001000000.4. 00002e0:44020000 D 地址0x0244的一个 uinit的值为0x00000d, map_list->size=0x0d=13,说明后续有13个 map _item。根据 map_ iten的结构描述在0x0248~0x02e3里的值,整理出这段二进制所表示的13个 map_item内容,汇成表格如下: offset name index address type sIZe offset types meaning in header in header 0x0248 0x00 0x01 0X00 YPE HEADER TEM 0x00 OX0254 0X0001 OXOe 0X70 YPE STRING D TEM 0X70 string ids off OX0260 0x0002 OXO 0x00a8 YPE TYPE D TEM Oxa8 type_ids_off 4 0x026C 0x0003 0x03 0×004 TYPE PROTO ID TEM 0xC4 proto ids off 5o×0278×00140×010×00e8 TYPE FIELD D ITEM e8 field_ ids_off 6 OX0284 0x0005 x0004 OxOOf0 TYPE METHOD ID ITEM Oxfo method ids off OX0290 0x0006 0X0001 0x0110TYPE_CLASS_DEF_ITEM 0x0110 class_defs_off 8 lO×O29C 02001 0002 0×0130 YPE CODE TEM 0X0130 data off 0X02A8 0x1001 0x0002 0X0168 TYPE TYPE LIST 10 OXO2B4 0X2002 o000e OX0176 YPE STRING DATA ITEM 11 0×O2CO020030×00020×0228 TYPE DEBUG INFO TEM 12 0xO2CC0x20000×00010x0234 TYPE CLASS DATA TEM 13 O02d8 0x1000 x0001 X0244 TYPE MAP LIST map_list-> map_item里的内容,有部分item跟 header里面相应item的 offset地址描述相同。但 map_list描述的更为全面些,又包括了 HEADER ITEM,TYPE_LIST, STRING_ DATA ITEM等, 最后还有它自己 TYPE MAP LIST。 至此, header部分描述完毕,它包括描述.dex文件的信息,其余各索引区和data区的偏移信息,一个 map_list结构。 map_list里除了对索引区和数据区的偏移地址又一次描述,也有其它诸如 HEAD ITEM, DEBUG_ INFO ITEM等信息

...展开详情
试读 24P dex文件格式
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    二流小宝 好好学习,天天向上
    2020-10-17
    回复
    ganzi01234 好资料,谢谢分享
    2019-12-06
    回复
    qq_29089633 谢谢分享,学习了。感谢
    2019-05-10
    回复
    LXZ135799123 有用,资源不错
    2019-04-26
    回复
    JackRo7 作为参考资料使用的
    2018-12-24
    回复
    lostinai 谢谢分享,学习了。
    2018-12-19
    回复
    nibinusm22b 挺不错的啊
    2018-10-30
    回复
    diane_xiong 感谢分享,还可以
    2018-10-15
    回复
    小小的坤 谢谢分享!
    2018-09-08
    回复
    irnhs9 有用,资源不错
    2018-07-28
    回复
    • 分享王者

      成功上传51个资源即可获取
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    dex文件格式 50积分/C币 立即下载
    1/24
    dex文件格式第1页
    dex文件格式第2页
    dex文件格式第3页
    dex文件格式第4页
    dex文件格式第5页
    dex文件格式第6页
    dex文件格式第7页
    dex文件格式第8页

    试读已结束,剩余16页未读...

    50积分/C币 立即下载 >