吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7918|回复: 5
收起左侧

[Android 原创] DEX文件解析---2、Dex文件checksum(校验和)解析

  [复制链接]
windy_ll 发表于 2019-12-8 21:55
本帖最后由 windy_ll 于 2022-3-29 21:51 编辑

一、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

        同系列文章链接:
                 DEX文件解析---1、dex文件头解析
            DEX文件解析--3、dex文件字符串解析
            DEX文件解析--4、dex类的类型解析
            DEX文件解析--5、dex方法原型解析
            DEX文件解析--6、dex文件字段和方法定义解析
             DEX文件解析--7、类及其类数据解析(完结篇)

    免费评分

    参与人数 8威望 +1 吾爱币 +19 热心值 +8 收起 理由
    罗轩 + 1 + 1 我很赞同!
    小小莱 + 1 + 1 谢谢@Thanks!
    dreamlivemeng + 1 + 1 用心讨论,共获提升!
    qtfreet00 + 1 + 12 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
    659525 + 1 + 1 热心回复!
    光头鸠摩智 + 1 + 1 热心回复!
    ping170 + 1 + 1 用心讨论,共获提升!
    风绕柳絮轻敲雪 + 1 + 1 我很赞同!

    查看全部评分

    发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

    letdown_nn 发表于 2019-12-9 09:54
    每天来学习 一点一点进步
    西枫游戏 发表于 2019-12-9 16:21
    he305461055 发表于 2019-12-20 15:10
    夜步城 发表于 2020-4-8 21:25
    来学了啦,谢谢楼主
    BUG606 发表于 2020-7-25 21:46
    好好学习,天天向上
    您需要登录后才可以回帖 登录 | 注册[Register]

    本版积分规则

    返回列表

    RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

    GMT+8, 2024-11-15 14:43

    Powered by Discuz!

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表