windy_ll 发表于 2019-12-8 21:55

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

本帖最后由 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. 定义两个变量`varA`、`varB`,其中`varA`初始化为1,`varB`初始化为0。**
    **2. 读取字节数组的一个字节(假设该字节变量名为`byte`),计算`varA = (varA + byte) mod 65521`,然后可以计算出`varB = (varA + varB) mod 65521`。**
    **3. 重复步骤,直到字节数组全部读取完毕,得到最终`varA`、`varB`两个变量的结果。**
&ensp;&ensp;&ensp;&ensp;**4. 根据第三步得到的`varA`、`varB`两个变量,可得到最终校验和`checksum =(varB << 16)+ varA`。**

**&ensp;&ensp;&ensp;&ensp;下面是官方WIKI给的例子:**
![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dex_checksum/4.png)

---

##三、python实现Adler-32算法
**&ensp;&ensp;&ensp;&ensp;先给出Dex文件头部信息以及代码跑出的结果**
![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dex_checksum/1.PNG)
![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dex_checksum/2.PNG)

**&ensp;&ensp;&ensp;&ensp;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) % 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
                VarB = varList
                if flag == 1:
                        CheckSum = getCheckSum(VarA,VarB)
                        break
        print(f'[*] DEX FILENAME: {filename}')
        print(f'[+] CheckSum = {hex(CheckSum)}')

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

**    同系列文章链接: **
**             (https://www.52pojie.cn/thread-1057245-1-1.html)**
**      (https://www.52pojie.cn/thread-1148568-1-1.html)**
**      (https://www.52pojie.cn/thread-1151528-1-1.html)**
**      (https://www.52pojie.cn/thread-1158006-1-1.html)**
**      (https://www.52pojie.cn/thread-1159847-1-1.html)**
**       (https://www.52pojie.cn/thread-1220562-1-1.html)**

letdown_nn 发表于 2019-12-9 09:54

每天来学习 一点一点进步{:1_893:}

西枫游戏 发表于 2019-12-9 16:21

每天逛一下论坛,每天学习,一起进步

he305461055 发表于 2019-12-20 15:10

DDDDDDDDDD

夜步城 发表于 2020-4-8 21:25

来学了啦,谢谢楼主

BUG606 发表于 2020-7-25 21:46

好好学习,天天向上:lol
页: [1]
查看完整版本: DEX文件解析---2、Dex文件checksum(校验和)解析