Dalvik指令分析(三) dex文件的结构

一篇文章带你搞懂DEX文件的结构 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文地址:一篇文章带你搞懂DEX文件的结构 DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了。下面,开练! 建议:不要只看,跟着我做。看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道。泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比... 阅读详情

     以上一篇文章生成的dex文件为例,讲解dex文件结构,这个dex文件结构非常简单,只有一个HelloWorld.java

文件,dex文件的基本格式请参考官方文档,对照dex文件的各个组成部分,我们可以将dex的内容进行分解。

1、文件头

header header_item the header
上述dex文件header部分的内容如下:

64 65 78 0A 30 33 35 00 52 5B 33 08 D6 16 D3 44
F7 27 50 E9 D6 16 9A 3E 6D 53 EF F9 92 28 70 FA
98 02 00 00 70 00 00 00 78 56 34 12 00 00 00 00
00 00 00 00 04 02 00 00 0C 00 00 00 70 00 00 00
06 00 00 00 A0 00 00 00 02 00 00 00 B8 00 00 00
01 00 00 00 D0 00 00 00 04 00 00 00 D8 00 00 00
01 00 00 00 F8 00 00 00 80 01 00 00 18 01 00 00
现在开始分解header部分的内容:

64 65 78 0A 30 33 35 00
这部分是dex_magic的值对应的ASCII码值为:dex 035

52 5B 33 08

这部分是checksum,计算checksum的逻辑如下面的代码:

private static void calcChecksum(byte bytes[]) {
		Adler32 a32 = new Adler32();
		a32.update(bytes, 12, bytes.length - 12);
		int sum = (int) a32.getValue();
		checksum[0] = (byte) sum;
		checksum[1] = (byte) (sum >> 8);
		checksum[2] = (byte) (sum >> 16);
		checksum[3] = (byte) (sum >> 24);

		try {
			String decoded = new String(checksum, "UTF-8");
			System.out.println(decoded);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		bytes[8] = (byte) sum;
		bytes[9] = (byte) (sum >> 8);
		bytes[10] = (byte) (sum >> 16);
		bytes[11] = (byte) (sum >> 24);
	}

其中,参数bytes[]为dex文件的字节流,计算出来的值写入bytes数组中,下标为8-11

D6 16 D3 44 F7 27 50 E9 D6 16 9A 3E 6D 53 EF F9
92 28 70 FA
这部分是sha1的签名,计算signature的逻辑如下:

private static void calcSignature(byte bytes[]) {
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException ex) {
			throw new RuntimeException(ex);
		}
		md.update(bytes, 32, bytes.length - 32);
		try {
			int amt = md.digest(bytes, 12, 20);
			if (amt != 20)
				throw new RuntimeException((new StringBuilder())
						.append("unexpected digest write:").append(amt)
						.append("bytes").toString());
		} catch (DigestException ex) {
			throw new RuntimeException(ex);
		}
	}

98 02 00 00
这部分是文件大小:即0x0298=664bytes

70 00 00 00
这部分是头的大小,112bytes

78 56 34 12
这部分是大小端的标志,dex文件缺省是小端的,这个dex文件是小端的,因为对应的值为0x12345678,系统

里的定义如下:

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

00 00 00 00 00 00 00 00
这全0的八字节是link_size和link_off字段,主要用在文件的静态链接上,该dex不是静态链接文件,所有为0

04 02 00 00

这部分为map_off字段,值为0x204,即516,这个值是map_list所在位置相对文件起始位置的偏移量。map_list

是对整个dex文件的描述,分不同的类型,包括头、字符串、类型、函数原型、类、代码等等,其实和header的

信息有一些冗余,主要是在dex文件生成后对文件做一些校验工作,dx进程在生成dex文件后,会根据map_list的

内容对dex做一些校验工作,这个在后面介绍dx进程的时候会描述。

0C 00 00 00 70 00 00 00
这部分内容为string_ids_size和string_ids_off,各占四字节

和map_list类似,string也有一个string_list,上面的两个值就是用来标识有多少个字符串,以及string_list

的偏移的。

header部分余下的都是各个list的长度和对应的偏移量,如type_ids_size和type_ids_off,指向type_list,

还有proto_list,field_list,method_list,code_item_list, class_def_item_list,data_list。这些list包含了

程序里的字符串信息、函数原型、字段、函数描述、类描述信息,这些也就组成了所有的程序内容。

dex header部分的分析基本完成了,header部分是整个dex文件的描述,也是文件各部分内容的索引,

掌握了header部分就可以继续分析其他部分内容,比如method_list,比如code_item_list。

在分析的过程中,要经常参考android源码,主要是数据结构的定义,因为涉及到数据元素的大小以及

成员,所以还是很费时间和精力的,但是这些都很有意义,让您在理解了一个可执行文件的结构的同时,

也熟悉android的源码。如果您在分析其他部分时,碰到问题可以联系我,在时间允许的情况下我会帮

您一起分析、解答问题。










Android dex2oat 编译线程简析 名称说明要求 post_bootcomplete 为false要求 for_restore 为 true,备份prop 为 dalvik.vm.dex2oat-threads要求 background_job_compile,备份prop 为 dalvik.vm.dex2oat-threads通常作为备份的prop,上述prop 没有配置时,会使用这个备份prop。 阅读详情

相关推荐

从DEX到JAR:使用dex2jar工具进行Android应用分析

DEX(Dalvik Executable)文件格式是Android平台上的应用程序执行文件格式。它的设计目的是让Android应用能够高效地运行于资源受限的设备上,如手机和平板电脑。DEX文件包含编译后的代码和应用运行所需的所有内容,例如类的定义、方法和字段等。在Android应用的开发过程中,开发者往往会遇到需要分析、调试已编译的APK文件的情况。

weixin_35238815的博客 1813

XML 解析器:深入解析与高效应用

XML解析器是一种用于分析和处理XML文档的软件工具,它能够识别XML文档中的元素、属性和内容,并将其转换为应用程序可以理解和操作的数据结构。验证XML文档的结构和语法。提取XML文档中的数据。转换XML文档为其他格式,如HTML或JSON。XML解析器是处理XML数据的关键工具,选择合适的解析方法和优化策略可以提高应用程序的性能和效率。随着技术的发展,XML解析器也在不断地发展和完善,为开发者提供更强大的功能和更便捷的使用方式。

lly202406的博客 1万+

深入解析Android Dex文件与Dex2Jar逆向转换实战资源包

htmltable {th, td {th {pre {简介:“classes.dex.dex2jar.src.zip”是Android逆向工程中的关键资源压缩包,包含APK中核心的classes.dex文件经Dex2Jar工具转换为可读Java代码的中间产物及可能的源码脚本。Dex文件作为Android应用的字节码载体,存储编译后的Java类与方法,而Dex2Jar工具能将其转为标准Jar格式,便于使用JD-GUI等反编译工具查看原始逻辑。

weixin_35433448的博客 1687

IOS编程 之 XML解析

XML JSON 解析  XML JSON 本质上都是字符串 但有规定的格式 JSON 用于轻量级数据的传输 XML 是比较大型的数据传输 比如陌陌 (即时通讯)  XML 可扩展标记语言  .plist 本身是一个XML文件 可以做配置文件  数据结构的语法 一对尖括号代表一个节点或者标签  只有一个根节点  节点之间可以互相嵌套   没有子节点的节点称为叶子节点

Autorelease_的专栏 1万+

标准化降水指数介绍

Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。𝐻(𝑥)是Γ分布求得的概率,并当𝐻(𝑥)>0.5时,S=1;式中,𝛼是形状参数,𝛽是尺度参数,𝑥是当月降水量,𝛤(𝛼)是Gamma函数,用极大似然估计法计算最佳的𝛼和𝛽,即。

weixin_44259522的博客 2857

形位公差标注的常见误区与优化策略

本文深入解析机械设计中形位公差标注的常见误区与优化策略,特别针对NX2406用户提供实用技巧。从标注冗余、基准选择到公差值设定等五大误区入手,结合工程图实例展示如何提升标注精度与效率,帮助工程师避免常见错误,优化设计流程,确保零件功能实现与制造可行性。

info6的博客 245

xooooxxoooxxx在密码学中的实际应用案例

最近在研究一些基础的加密模式时,发现xooooxxoooxxx这种结构在密码学中有不少有趣的应用。它的核心思想是通过特定规则在原始信息中插入干扰字符(比如固定位置的'o'),使得原始信息被隐藏起来。这种模式虽然简单,但足以应对一些基础的加密需求。在实际使用中我发现,这种可视化展示加密过程的方式特别适合教学场景,能直观地看到每个字符是如何被转换的。对于想了解基础加密原理的新手来说,是个不错的入门案例。的一键部署功能,我把这个项目直接变成了可在线体验的网页应用。

GoldenleafLynx28的博客 28万+

差分运放电路输出电压偏置设计解析

差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。

weixin_35750747的博客 470

传统解码vsAI解码:xooooxxoooxxx处理效率对比

最近工作中遇到大量xooooxxoooxxx格式的编码需要解析,手动处理既耗时又容易出错。于是尝试开发了一个对比工具,验证AI技术是否能提升这类任务的效率。对于需要处理类似编码任务的开发者,这个方案能节省至少60%的处理时间。- AI自动解码:调用Kimi-K2模型智能识别编码模式。- 内置的Kimi-K2模型直接调用省去环境配置。- 中等复杂度编码(10-50字符)- 关键业务采用AI+人工双校验模式。- 高难度编码(50+字符含嵌套)- 常规任务直接使用AI自动解码。- 一键部署生成可访问的对比工具。

StarfallRaven13的博客 1万+

嵌入式工程师必看:BLDC电机驱动电路设计全流程(附MOS管选型指南)

本文为嵌入式工程师提供了BLDC电机驱动电路设计的全流程实战指南。文章深入解析了三相全桥逆变电路的核心原理,并重点阐述了功率MOSFET的选型关键参数,如Vds、Rds(on)和Qg。同时,详细介绍了栅极驱动设计、PCB布局布线要点及调试安全步骤,旨在帮助开发者构建稳定高效的BLDC驱动系统。

weixin_29194817的博客 588

【数据集8】全球人口数据WorldPop详解

全球人口数据WorldPop详解

WW、forever的博客 7880

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

From:https://blog.youkuaiyun.com/sinat_18268881/article/details/55832757 Dex文件格式详解:https://www.jianshu.com/p/f7f0a712ddfe dex文件解析(第三篇):https://blog.youkuaiyun.com/tabactivity/article/detai...

墨鱼菜鸡 4108

【C++】开源:cpp-httplib HTTP协议库配置与使用

cpp-httplib HTTP协议库配置与使用

DevFrank的博客 5541

【Android 逆向】Dalvik 函数抽取加壳 ① ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )

前言、 一、Dalvik 下的函数指令抽取与恢复、 二、dex 函数指令恢复时机点、 1、dex 函数指令恢复、 2、Android 源码中搜索 dexFindClass 函数、 3、类加载流程 : 加载、链接、初始化、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2661

手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机

在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。

MHD0815的博客 944

大模型算法岗常见面试题100道

LangChain是一个用于构建和运行大型语言模型应用的开源框架。它提供了一套工具和组件,帮助开发者将大型语言模型(如 GPT-3)与其他工具和API结合,以完成更复杂的任务。1、LangChain包含哪些核心概念?Components:可重用的模块,例如API调用、数据库查询等。Chains:将多个Components链接在一起以完成特定任务的流程。Prompt Templates: 用于指导语言模型生成输出的文本模板。Output Parsers:解析语言模型输出的工具。

具身机器人和通用AI 1959

【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )

一、打包 Jar 文件和 Dex 文件、 1、示例代码、 2、打包 Jar 文件、 3、打包 Dex 文件、 二、反编译 Dex 文件、 三、分析 Dex 文件、 1、Student 类相关信息、 2、User 类相关信息、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1737

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android逆向笔记(3)--- dex文件Dalvik指令的解析

这些日子看丰生强的《Android软件安全与逆向分析》 ,到4.3节看了好多遍,经验证终于对 7010 0400 0000 这块,A=1,G=0,op=70 这里看的差不多了...... 在4.3节的最后以如下指令:(80页) 7010  0400 0000 为例解释了如何将Dalvik指令解析成汇编代码。 要想看懂这段解释,得首先明白几个基本知识。(参考3.2.1

oBuYiSeng的博客 1348

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

dex文件格式介绍

前言dex(Dalvik Executable)是Android平台源代码文件(java,kotlin)经过编译、重构、重排、压缩、混淆后的字节码文件,是对传统的class 文件再处理。dex 更适合于资源有限的嵌入式设备使用,和class 文件比,dex 明显的优势主要表现在下面两个方面1)体积更小,dex 在class的基础上,将多个class 文件特征进行统一处...

内核工匠 9629

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

dex字节码介绍和二进制译码分析

对于dex字节码的详细介绍,官方提供了三篇文档对其进行比较详尽的介绍,分别是: Dalvik bytecode :主要介绍的是Dalvik字节码的总体设计理念,还提供了全部的字节码指令介绍。如果没有一点计算机系统相关知识,还是比较难懂的,有部分的描述也不是太清晰,可参考本人这篇文章的翻译:Dalvik bytecode的总体设计 Dalvik Executable instruction for...

chiefhsing的专栏 3911

Dalvik 分析之准备篇

前言:dalvik 是 Android 的重要组成部分,掌握其运行机制对理解整个Android系统有着相当之大的帮助。本文将从GDB单步调试和Dexdump工具入手来深入探索dalvik。 1. Dalvik 之编译为了能够更方便的调试dalvik,我们需要编译一个在X86上运行的dalvik和相关工具。编译步骤如下:首先进入到Android 源码根目录source build/envsetup.sh (不是网上有些文章写的只输入 build/envsetup.sh)lunch 2  在此之后可以看到TAR

VirtualPower的专栏 1万+

apk文件解压后产生.dex文件详解,重要组成部分与4个分析工具【一看就会】【OneGIS开发】

对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。- Tinker Dex Dump:可以迅速从APK中提取出所有DEX文件,列出类、方法、字段等元数据,并以清晰易读的形式展示,还可通过命令行参数选择要查看的具体信息。- Dexdump:Android SDK中提供的工具,可将DEX文件的内容以文本形式输出,方便查看其中包含的类、方法、字段等信息。- 文件头(Header):包含文件的基本信息,如版本号、文件大小、字节序等,帮助虚拟机识别和处理文件。

a_55523的博客 3560

Android的APK安装过程 JVM Dalvik和ART等虚拟机区别以及DEX文件ODEX文件OAT文件区别

APK apk全称是AndroidPackage,也就是Android安装包;APK的本质是一个zip压缩包,如果将后缀名改成.zip,就可以解压,APK 文件与 Zip 文件最大的一个不同是 APK 包含签名信息,用于保证安装包安全不被修改,解压后的目录有: res文件夹:用于存放Android资源文件的目录,里面有drawable图片资源,布局文件等,这里面的文件都是被编译过的(图片除外...

Mango先生的博客 5032

DEX文件解析

之前面试被问到DEX文件解析,由于时间太过于久远,忘得都有点差不多了,好记性不如烂笔头。特此记录一下。 DEX文件的生成 首先我们要知道,JVM是JAVA虚拟机,使用运行JAVA字节码程序。Dalvik是Google设计的用于Android平台的运行时环境,适合移动环境ART即Android Runtime,是Google为了替换Dalvik设计的新Android运行时环境,在Android 4.4及以上启动。ART比Dalvik的性能更好。Android程序一般使用Java语言开发,但是Dalvik虚拟机

re_psyche的博客 1999
上一篇: Dalvik指令分析(二) 从java文件到dex
下一篇: ARM INLINE HOOK (一)
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值