dex文件结构

0x00013f80 |                                     64 65 78 0A             <---
0x00013f90 | 30 33 35 00 EE 46 38 DD 46 FF 89 0D BE CA CD BD
0x00013fa0 | 63 CB 13 87 01 1C DC 87 53 DB 34 35 D8 2C 2C 00
0x00013fb0 | 70 00 00 00 78 56 34 12 00 00 00 00 00 00 00 00
0x00013fc0 | 08 2C 2C 00 5F 5C 00 00 70 00 00 00 E9 08 00 00      Header
0x00013fd0 | EC 71 01 00 16 11 00 00 90 95 01 00 6E 1F 00 00
0x00013fe0 | 98 62 02 00 26 55 00 00 08 5E 03 00 56 08 00 00
0x00013ff0 | 38 07 06 00 E0 1A 25 00 F8 11 07 00 AE 80 1C 00 -----------><---
0x00014000 | B0 80 1C 00 B4 80 1C 00 B7 80 1C 00 BE 80 1C 00
0x00014010 | C4 80 1C 00 CB 80 1C 00 D9 80 1C 00 F0 80 1C 00
...                                                              StringIds
0x0002b140 | CE 3D 23 00 DD 3D 23 00 EA 3D 23 00 FA 3D 23 00
0x0002b150 | 02 3E 23 00 05 3E 23 00 09 3E 23 00 1E 3E 23 00
0x0002b160 | 34 3E 23 00 38 3E 23 00 48 3E 23 00 4B 3E 23 00
0x0002b170 | 4E 3E 23 00 53 3E 23 00 2C 06 00 00 F1 06 00 00 -------><-------
0x0002b180 | EE 08 00 00 DD 0B 00 00 96 0D 00 00 5C 0F 00 00
0x0002b190 | E3 10 00 00 E4 10 00 00 E5 10 00 00 E6 10 00 00
0x0002b1a0 | E7 10 00 00 E8 10 00 00 E9 10 00 00 EA 10 00 00      TypeIds
...
0x0002d500 | 89 29 00 00 8A 29 00 00 8B 29 00 00 8C 29 00 00
0x0002d510 | 8D 29 00 00 8E 29 00 00 8F 29 00 00 2C 06 00 00 -----------><---
0x0002d520 | 00 00 00 00 00 00 00 00 3A 06 00 00 00 00 00 00
0x0002d530 | B8 2B 1C 00 3E 06 00 00 00 00 00 00 C0 2B 1C 00
0x0002d540 | 4D 06 00 00 00 00 00 00 C8 2B 1C 00 4E 06 00 00
0x0002d550 | 00 00 00 00 D0 2B 1C 00 50 06 00 00 00 00 00 00     ProtoIds
0x0002d560 | D8 2B 1C 00 57 06 00 00 00 00 00 00 E0 2B 1C 00
...
0x0003a200 | 74 10 00 00 E4 08 00 00 88 2F 1C 00 70 10 00 00
0x0003a210 | E5 08 00 00 E8 2B 1C 00 70 10 00 00 E5 08 00 00
0x0003a220 | 44 39 1C 00 06 00 04 00 C5 35 00 00 06 00 60 01 ---><-----------
0x0003a230 | 3E 38 00 00 07 00 04 00 C9 35 00 00 07 00 60 01
0x0003a240 | 3E 38 00 00 09 00 04 00 14 05 00 00 09 00 04 00
...                                                              FieldIds
0x00049d70 | CC 35 00 00 5A 08 56 08 DC 4C 00 00 5A 08 60 01
0x00049d80 | EA 56 00 00 5B 08 5B 08 B9 24 00 00 5B 08 5B 08
0x00049d90 | B8 57 00 00 06 00 17 0B B4 04 00 00 06 00 20 0B ---><-----------
0x00049da0 | B4 04 00 00 06 00 17 03 A9 3B 00 00 06 00 FC 01
0x00049db0 | 9C 50 00 00 06 00 79 04 9D 50 00 00 07 00 17 0B
0x00049dc0 | B4 04 00 00 07 00 20 0B B4 04 00 00 07 00 EC 03    MethodIds
...
0x000746a0 | 4C 30 00 00 D9 08 9C 02 4C 30 00 00 DA 08 9C 02
0x000746b0 | 4C 30 00 00 DC 08 9C 02 4C 30 00 00 DD 08 9C 02
0x000746c0 | 4C 30 00 00 42 01 00 00 01 00 00 00 FF FF FF FF ---><-----------
0x000746d0 | 00 00 00 00 B1 1F 00 00 34 DA 1A 00 1F 0A 2A 00
0x000746e0 | 00 00 00 00 E7 00 00 00 01 06 00 00 42 01 00 00
0x000746f0 | 00 00 00 00 8D 23 00 00 00 00 00 00 00 00 00 00
0x00074700 | 00 00 00 00 73 01 00 00 01 00 00 00 42 01 00 00
0x00074710 | 9C 23 1C 00 56 25 00 00 7C DA 1A 00 6A 0A 2A 00
0x00074720 | 08 E4 29 00 20 01 00 00 01 00 00 00 73 01 00 00
0x00074730 | 00 00 00 00 A6 0B 00 00 00 00 00 00 04 0B 2A 00    ClassDefs
0x00074740 | 12 E4 29 00 06 00 00 00 11 00 00 00 20 01 00 00
...
0x00085130 | 00 00 00 00 82 28 00 00 CC 22 1C 00 51 2A 2C 00
0x00085140 | 05 0A 2A 00 5A 08 00 00 01 00 00 00 42 01 00 00
0x00085150 | AC 2B 1C 00 4D 0A 00 00 24 23 1C 00 AD 2A 2C 00
0x00085160 | 09 0A 2A 00 5B 08 00 00 11 00 00 00 42 01 00 00
0x00085170 | 00 00 00 00 AA 26 00 00 84 23 1C 00 7B 2B 2C 00
0x00085180 | 00 00 00 00 01 00 00 00 87 28 29 00 01 00 00 00 ---><-----------
0x00085190 | 95 28 29 00 02 00 00 00 A0 28 29 00 AB 28 29 00
0x000851a0 | 01 00 00 00 B7 28 29 00 01 00 00 00 C8 28 29 00
0x000851b0 | 01 00 00 00 D3 28 29 00 01 00 00 00 E7 28 29 00
0x000851c0 | 01 00 00 00 F1 28 29 00 01 00 00 00 FE 28 29 00
0x000851d0 | 01 00 00 00 09 29 29 00 01 00 00 00 14 29 29 00       data
...
0x002d6c30 | 58 3E 23 00 04 20 00 00 55 0A 00 00 87 28 29 00
0x002d6c40 | 05 20 00 00 7C 02 00 00 08 E4 29 00 00 20 00 00
0x002d6c50 | 15 08 00 00 1F 0A 2A 00 00 10 00 00 01 00 00 00
0x002d6c60 | 08 2C 2C 00 64 65 78 0A 30 33 35 00 11 E1 2D 3F ---><-----------
0x002d6c70 | 23 F7 28 15 B0 A3 2C A4 34 0F 06 39 E4 5C D1 13
0x002d6c80 | 4E 66 79 6A 90 1E 04 00 70 00 00 00 78 56 34 12
0x002d6c90 | 00 00 00 00 00 00 00 00 C0 1D 04 00 DD 0C 00 00      Header
0x002d6ca0 | 70 00 00 00 BF 01 00 00 E4 33 00 00 3B 02 00 00
...

 

type name value
uint8_t[8] magic_ "dex.035"
uint32_t checksum_
0xdd3846ee

uint8_t[20] signature_
46 FF 89 0D BE CA CD BD 63 CB 13 87 01 1C DC 87 53 DB 34 35
uint32_t file_size_
0x002c2cd8
uint32_t header_size_
0x00000070
uint32_t endian_tag_
0x12345678

uint32_t link_size_
0x00000000
uint32_t link_off_
0x00000000
uint32_t map_off_
0x002c2c08
uint32_t string_ids_size_
0x00005c5f
uint32_t string_ids_off_
0x00000070
uint32_t type_ids_size_
0x000008e9
uint32_t type_ids_off_
0x000171ec
uint32_t proto_ids_size_
0x00001116
uint32_t proto_ids_off_
0x00019590
uint32_t field_ids_size_
0x00001f6e
uint32_t field_ids_off_
0x00026298 
uint32_t method_ids_size_
0x00005526

uint32_t method_ids_off_
0x00035e08

uint32_t class_defs_size_
0x00000856

uint32_t class_defs_off_
0x00060738

uint32_t data_size_
0x00251ae0

uint32_t data_off_
0x000711f8


StringId[]:
// offset in bytes from the base address
uint32_t string_data_off_;

string_ids
0x001c80ae0x001c80b00x001c80b40x001c80b70x001c80be0x001c80c4...0x00233e1e0x00233e340x00233e380x00233e480x00233e4b0x00233e4e0x00233e53
TypeId[]:

// index into string_ids
uint32_t descriptor_idx_;

type_ids
0x0000062c0x000006f10x000008ee0x00000bdd0x00000d96 0x00000f5c0x000010e30x000010e4...0x000029890x0000298a0x0000298b0x0000298c0x0000298d0x0000298e0x0000298f

ProtoId[]:
// index into string_ids array for shorty descriptor
uint32_t shorty_idx_;
// index into type_ids array for return type
uint16_t return_type_idx_;
// padding = 0
uint16_t pad_;
// file offset to type_list for parameter types
uint32_t parameters_off_;

proto_ids
{    0x0000062c,    0x0000,    0x0000,    0x00000000 },{     0x0000063a,    0x0000,    0x0000,    0x001c2bb8 },{    0x0000063e,    0x0000,    0x0000,    0x001c2bc0}, {...},{    0x00001070,    0x08e5,    0x0000,    0x001c2be8},{    0x00001070,    0x08e5,    0x0000,    0x001c3944}

FieldId[]:
// index into type_ids_ array for defining class
uint16_t class_idx_;
// index into type_ids_ array for field type
uint16_t type_idx_;
// index into string_ids_ array for field name
uint32_t name_idx_;

field_ids
{    0x0006,    0x0004,    0x000035c5},{    0x0007,    0x0004,    0x000035c9},{    0x0007,    0x0160,    0x0000383e},{...},{    0x085b,    0x085b,    0x000024b9},{    0x085b,    0x085b,    0x000057b8}

MethodId[]:
// index into type_ids_ array for defining class
uint16_t class_idx_;
// index into proto_ids_ array for method prototype
uint16_t proto_idx_;
// index into string_ids_ array for method name
uint32_t name_idx_;

method_ids
{    0x0006,    0x0b17,    0x000004b4},{    0x0006,    0x0b20,    0x000004b4},{    0x0006,    0x0317,    0x00003ba9},{    0x0006,    0x01fc,    0x0000509c},{    0x0006,    0x0479,    0x0000509d},{    0x0007,    0x0b17,    0x000004b4},{...},{    0x08dc,    0x029c,    0x0000304c},{    0x08dd,    0x029c,    0x0000304c}
ClassDef[]:
// index into type_ids_ array for this class
uint16_t class_idx_; 
// padding = 0
uint16_t pad1_; 
uint32_t access_flags_;
// index into type_ids_ array for superclass
uint16_t superclass_idx_;
// padding = 0
uint16_t pad2_;
// file offset to TypeList
uint32_t interfaces_off_;
// index into string_ids_ for source file name
uint32_t source_file_idx_;
// file offset to annotations_directory_item
uint32_t annotations_off_;
// file offset to class_data_item
uint32_t class_data_off_;
// file offset to EncodedArray
uint32_t static_values_off_;
class_defs
{    0x0142,    0x0000,    0x00000001,    0xffff,    0xffff,    0x00000000,    0x00001fb1,    0x001ada34,    0x002a0a1f,    0x00000000},{    0x00e7,    0x0000,    0x00000601,    0x0142,    0x0000,    0x00000000,    0x0000238d,    0x00000000,    0x00000000,    0x00000000},{    0x0173,    0x0000,    0x00000001,    0x0142,    0x0000,    0x001c239c,    0x00002556,    0x001ada7c,    0x002a0a6a,    0x0029e408 },{....},{    0x085a,    0x0000,    0x00000001,    0x0142,    0x0000,    0x001c2bac,    0x00000a4d,    0x001c2324,    0x002c2aad,    0x002a0a09},{    0x085b,    0x0000,    0x00000001,    0x0142,    0x0000,    0x00000000,    0x000026aa,    0x001c2384,    0x002c2b7b,    0x00000000}
uint32_t[] data
0x00000001,0x00292887,0x00000001,0x002928950x000000020x002928a00x002928ab...0x00000815,0x002a0a1f,0x00001000,0x00000001,0x002c2c08
时间: 2024-12-18 02:43:47

dex文件结构的相关文章

Android学习心得(16) --- Dex文件结构实例解析(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下通过一个实例来分析dex文件结构和组成. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 参考baksmali工具使用Android学习心得(4) --- MAC下smali文件编写与运行 1.编译 我们通过一个例子来分析dex文件的构成 创建一个Hello.java文

Android学习心得(15) --- Dex文件结构解析(1)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下Android可执行文件dex的结构解析. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 1.Dex背景 Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,在编译时使用JDK将Java源程序编程成标准的Java字节码文件. 而

Android: samil语法指令集-基于dex文件结构的寄存器虚拟机

Smali文件结构解   Smali文件与java中的类是一一对应的,包括内部类和匿名内部类也会生成对应的smali文件(典型的比如实现某个接口的匿名内部类),所以你会看到.smali文件比.java文件更多. smali文件是由Dalvik指令组成的,它有自己的一套规则,它的指令都是以“.”开头,常用的指令如下: 指令  说明 .class  包名+类名 .super  父类类名 .source  源文件名称 .implements  接口实现 .field  定义字段 .method/.en

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static

Android 热修复方案分析

绝大部分的APP项目其实都需要一个动态化方案,来应对线上紧急bug修复发新版本的高成本.之前有利用加壳,分拆两个dex结合DexClassLoader实现了一套全量更新的热更方案.实现原理在Android 基于Proxy/Delegate 实现bug热修复这篇博客中有分解.因为这套方案是在Java端实现,并且是全量更新所以兼容性较好,成功率较高.但是在线上跑了几个月之后就碰到了瓶颈,因为随着业务的增长分拆过之后的dex文件方法数也超过65535个,更换拆包方案的话维护成本太高.同时由于没有做差异

【转】 Apk文件及其编译过程

Apk文件概述 Android系统中的应用程序安装包都是以apk为后缀名,其实apk是Android Package的缩写,即android安装包. 注:apk包文件其实就是标准的zip文件,可以直接用解压缩软件解开.Apk包中的内容 解压缩一个apk文件后,目录结构一般如下: *.apk ├-res │ ├+layout │ └+drawable ├-META-INF │ ├-MANIFEST.MF │ ├-CERT.SF │ └-CERT.RSA ├-resources.arsc ├-cla

理解Android虚拟机体系结构

1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行.dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统.Google对其进行了特定的优化,使得Dalvik具有高效.简洁.节省资源的特点.从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层. 2 Dalvik虚拟机的功能

APK脱壳的一点小总结

目前在安全加固与脱壳破解的攻防中,破解者处在了优势的位置,个人认为在虚拟机保护出现之前,也会一直这样. 对于Android DEX文件的脱壳,一般分2种情况: 一种是dex会完整出现在内存当中,大部分免费版加固,某些企业版加固都是这样的,通常IDA调试断在dvmDexFileOpenPartial.dexFileParse等这些函数上面,直接内存dump就可以.但有些加固会有反调试,处理起来比较麻烦,因此直接hook这些函数更为简单,substrate.adbi这些框架可以帮助我们节省开发成本.

Android应用程序通用自动脱壳方法研究

Author: @爱博才会赢 本文为乌云峰会上<Android应用程序通用自动脱壳方法研究>的扩展延伸版. 0x00 背景及意义 Android应用程序相比传统PC应用程序更容易被逆向,因为被逆向后能够完整的还原出Java代码或者smali中间语言,两者都具有很丰富的高层语义信息,理解起来更为容易,让程序逻辑轻易暴露给技术能力甚至并不需要很高门槛的攻击者面前.因此Android应用程序加固保护服务随之应运而生.从一开始只有甲方公司提供服务到现在大型互联网公司都有自己的加固保护服务,同时与金钱相