DEX文件解析---2、Dex文件checksum(校验和)解析

一、checksum介绍

    checksum(校验和)是DEX位于文件头部的一个信息,用来判断DEX文件是否损坏或者被篡改,它位于头部的0x08偏移地址处,占用4个字节,采用小端序存储。
    在DEX文件中,采用Adler-32校验算法计算出校验和,将DEX文件从0x0C处开始读取到文件结束,将读取到的字节数组使用Adler-32校验算法计算出结果即是校验和即checksum字段!!!


二、Adler-32算法

    Adler-32算法如下步骤实现:
    1. 定义两个变量varAvarB,其中varA初始化为1,varB初始化为0。
    2. 读取字节数组的一个字节(假设该字节变量名为byte),计算varA = (varA + byte) mod 65521,然后可以计算出varB = (varA + varB) mod 65521
    3. 重复步骤,直到字节数组全部读取完毕,得到最终varAvarB两个变量的结果。
    4. 根据第三步得到的varAvarB两个变量,可得到最终校验和checksum =(varB << 16)+ varA

    下面是官方WIKI给的例子:


三、python实现Adler-32算法

    先给出Dex文件头部信息以及代码跑出的结果

    python代码实现如下(python 3.6版本)(ps:markdown的代码真的是难受,需要跑代码的把下面相应注释提升处的缩进删除即可):

import binascii  #删除缩进(Tab)

def CalculationVar(srcByte,vara,varb):#删除缩进(Tab)
varA = vara
varB = varb
icount = 0
listAB = []

while icount < len(srcByte):
	varA = (varA + srcByte[icount]) % 65521
	varB = (varB + varA) % 65521
	icount += 1

listAB.append(varA)
listAB.append(varB)

return listAB

def getCheckSum(varA,varB): #删除缩进(Tab)
Output = (varB << 16) + varA
return Output

if __name__ == '__main__':#删除缩进(Tab)
filename = 'C:/Users/admin/Desktop/android_nx/Hello.dex'
f = open(filename, 'rb', True)
f.seek(0x0c)
VarA = 1
VarB = 0
flag = 0
CheckSum = 0
while True:
	srcBytes = []
	for i in range(1024):               #一次只读1024个字节,防止内存占用过大
		ch = f.read(1)
		if not ch:                      #如果读取到末尾,设置标识符,然后退出读取循环
			flag = 1
			break
		else:
			ch = binascii.b2a_hex(ch)              #将字节转为int类型,然后添加到数组中
			ch = str(ch,encoding='utf-8')
			ch = int(ch,16)
			srcBytes.append(ch)
	varList = CalculationVar(srcBytes,VarA,VarB)
	VarA = varList[0]
	VarB = varList[1]
	if flag == 1:
		CheckSum = getCheckSum(VarA,VarB)
		break
print(f'[*] DEX FILENAME: {filename}')
print(f'[+] CheckSum = {hex(CheckSum)}')

    PS:DEX样本文件下载链接:(提取码:xrfa)https://pan.baidu.com/s/1wJhL3HUW72JWo-l3dLrm_Q

posted @   windy_ll  阅读(1091)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示