zoukankan      html  css  js  c++  java
  • 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. 重复步骤2,直到字节数组全部读取完毕,得到最终varAvarB两个变量的结果。
        4. 根据第三步得到的varAvarB两个变量,可得到最终校验和checksum =(varB << 16)+ varA

        下面是官方WIKI给的例子:
    4.png


    三、python实现Adler-32算法

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

        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

  • 相关阅读:
    ActiveReports打印的问题
    HTML高级应用
    一些常用的asp.net技巧焦点篇
    数据库操作
    [ASP.NET]在后台引用JavaScript
    点击TextBox复制其中内容
    VB.Net基本语句(推荐)
    ADO 对象
    控件不获得焦点
    32款网站优化工具
  • 原文地址:https://www.cnblogs.com/aWxvdmVseXc0/p/12008146.html
Copyright © 2011-2022 走看看