#ifndef _DEX_FILE_HELPER_

#define _DEX_FILE_HELPER_

//此文件仅仅是起帮助作用,帮助不太了解DexFile结构的了解一下DexFile相关结构,想更具体的了解还须要參考相关源代码





//classes.dex 相应于一个结构 DexFile

//struct DexFile {

//    const DexOptHeader* pOptHeader;//opt 头结构指针

//    const DexHeader*    pHeader;//dex header结构指针

//    const DexStringId*  pStringIds;//全部字符串,类似于elf的字符串表,包括全部引用符号,函数、变量等

//    const DexTypeId*    pTypeIds;//类型比如Ljava/lang/String、I、[B等表明一种数据类型

//    const DexFieldId*   pFieldIds;//属性id,来自一个类内部属性,指向它的指针

//    const DexMethodId*  pMethodIds;//函数id,类似于函数指针概念

//    const DexProtoId*   pProtoIds;//函数原型,这个原型,包括指向字符串表的符号,包括传入參数类型,和返回值类型,比如VL

//    const DexClassDef*  pClassDefs;//指向class对象的指针,这个class的表现形式是一种结构,这个结构包括了类的訪问属性。接口、来自文件、指向ClassCode的指针等、一看smali文件你就明确了

//    const DexLink*      pLinkData;//链接库指针,临时为空

//    const DexClassLookup* pClassLookup;

//    const void*         pRegisterMapPool;//这个应该是系统提供的api级别的

//    const u1*           baseAddr;

//    int                 overhead;

//};



classdef是一个最外层的类结构体,就像房子(板楼(描写叙述),在北京昌平(文件名称位置),归昌平管(继承实现)),classdata就像房子真实样子(详细这个房子布局。几个房间。几个灯等等)。codedata就相当于详细房间了(不同方法有不同的code,房子里有非常多不同的房间),大致这么讲呵呵。

当中code_item 才是(包括)真正的dalvik解释的字节码。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWxjYW5nZWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

//解析Dex文件,能够从头解析。也能够从mapItem解析。两者有相对于的关系,而且当dex file 被填充好时,头部下面的结构也都指向相应位置

//DexFile 样例 通过dexdump获取的

//Processing 'classes.dex'...

//Opened 'classes.dex', DEX version '035'

//DEX file header:

//magic               : 'dex\n035\0'

//checksum            : c04ea208

//signature           : 8182...4329

//file_size           : 905352

//header_size         : 112

//link_size           : 0

//link_off            : 0 (0x000000)

//string_ids_size     : 6068

//string_ids_off      : 112 (0x000070)

//type_ids_size       : 852

//type_ids_off        : 24384 (0x005f40)

//field_ids_size      : 1352

//field_ids_off       : 40968 (0x00a008)

//method_ids_size     : 5309

//method_ids_off      : 51784 (0x00ca48)

//class_defs_size     : 517

//class_defs_off      : 94256 (0x017030)

//data_size           : 794492

//data_off            : 110860 (0x01b10c)





watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWxjYW5nZWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">





//完整的Class结构,这个类比較简单





//////////////////////////////////////////////////////////////////////////////////////////////////////

//Class #1 header:

//class_idx           : 9

//access_flags        : 9729 (0x2601)

//superclass_idx      : 766

//interfaces_off      : 116956 (0x01c8dc)

//source_file_idx     : 2232

//annotations_off     : 905336 (0x0dd078)

//class_data_off      : 123492 (0x01e264)

//static_fields_size  : 0

//instance_fields_size: 0

//direct_methods_size : 0

//virtual_methods_size: 1

//////////////////////////////////////////////////////////////////////////////////////////////////////////

//Class #1            -

//  Class descriptor  : 'Landroid/annotation/TargetApi;'

//  Access flags      : 0x2601 (PUBLIC INTERFACE ABSTRACT ANNOTATION)

//  Superclass        : 'Ljava/lang/Object;'

//  Interfaces        -

//    #0              : 'Ljava/lang/annotation/Annotation;'

//  Static fields     -

//  Instance fields   -

//  Direct methods    -

//  Virtual methods   -

//    #0              : (in Landroid/annotation/TargetApi;)

//      name          : 'value'

//      type          : '()I'

//      access        : 0x0401 (PUBLIC ABSTRACT)

//      code          : (none)

//  source_file_idx   : 2232 (TargetApi.java)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//class code data 就不拷贝了 太多

#endif

安卓dex 文件结构简要说明的更多相关文章

  1. 安卓 dex 通用脱壳技术研究(一)

    注:以下4篇博文中,部分图片引用自DexHunter作者zyqqyz在slide.pptx中的图片,版本归原作者所有: 0x01 背景介绍 安卓 APP 的保护一般分为下列几个方面: JAVA/C代码 ...

  2. 安卓Dex壳技术探讨(1)

    最近在研究安卓平台的加壳技术,以前以为只有原生层的代码才可以加壳,看了看网上的资料,才发现原来Java层也可以加壳,虽然与传统的壳有些区别,但就最终的效果来说,反静态分析的目的还是达到了的. 目前安卓 ...

  3. 安卓 dex 通用脱壳技术研究(二)

    0x03 DexHunter代码分析 DexHunter 实现中,只需要修改一处文件:dalvik\vm\native\dalvik_system_DexFile.cpp 下面是BeyondCompa ...

  4. 安卓 dex 通用脱壳技术研究(三)

    /*     此为DexHunter实现的主要功能,进行内存dump,将class_def_items中dump出classdef和extra部分 */ void* DumpClass(void *p ...

  5. 安卓 dex 通用脱壳技术研究(四)

    /*     当第一个类执行到此函数时,我们在dvmDefineClass执行之前,也就是第一个类加载之前     注入我们的dump代码:即DumpClass()函数 */ static void  ...

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

    Smali文件结构解   Smali文件与java中的类是一一对应的,包括内部类和匿名内部类也会生成对应的smali文件(典型的比如实现某个接口的匿名内部类),所以你会看到.smali文件比.java ...

  7. 看雪 安卓 dex文件

    http://bbs.pediy.com/showthread.php?t=177114

  8. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  9. 【腾讯优测干货分享】如何降低App的待机内存(五)——优化dex相关内存及本章总结

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/01Abwe0p1h3WLh28Tzg_Dw 1.5案例:优化dex相 ...

随机推荐

  1. Ubuntu-Python2.7安装 scipy,numpy,matplotlib

    sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matp ...

  2. CAD得到所有组名(网页版)

    主要用到函数说明: _DMxDrawX::GetAllGroupName 得到所有组名. js代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. CAD把控件图形变成二进制流输出(com接口VB语言)

    主要用到函数说明: _DMxDrawX::WriteBinStream 把控件图形变成二进制流输出,详细说明如下: 参数 说明 VARIANT* pVarBinArray 输出二进制数组.是个byte ...

  4. 以POST方式推送JSON数据,并接收返回的服务器消息

    private static string GetResult(string jsonString, string type) { string url = GetUrl(type); string ...

  5. nginx配置X-Forwarded-For 防止伪造ip

    网上常见nginx配置ip请求头 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 风险: 用于可以通过自己设置请求头来伪造ip ...

  6. react antD 日期选择

    <DatePicker disabledDate={disabledDate} onChange={this.onChange} /> //创建时间禁用大于当前时间 <moment( ...

  7. 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)

    Dijkstra+ 链式前向星+ 优先队列   Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...

  8. P1269 信号放大器

    P1269 信号放大器 给一棵有根树,树的边上有距离.根上有一个信号发射器,会发生强度为 h 的信号,信号会往所有的节点传播,然而每经过一条边强度就会削减距离的大小,当信号到达某点时小于 1,则信号传 ...

  9. C++字符串处理函数总结

    1.基础函数输入输出:cin,cout,getchar,gets,putchar,puts,printf,scanf格式化:sprintf,sprintf_s,wsprintf,wsprintf_s, ...

  10. UVA - 208 Firetruck(并查集+dfs)

    题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...