一、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给的例子:


三、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文件解析---2、Dex文件checksum(校验和)解析的更多相关文章

  1. DEX、ODEX、OAT文件&Dalvik和ART虚拟机

    https://www.jianshu.com/p/389911e2cdfb https://www.jianshu.com/p/a468e714aca7 ODEX是安卓上的应用程序apk中提取出来的 ...

  2. plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...

  3. C语言解析Ini格式文件

    引用别人的博文: http://www.open-open.com/lib/view/open1402278076447.html 可以解析 INI 格式的字符串.解析文件.保存到文件. 下面是头文件 ...

  4. Java使用正则表达式解析LRC歌词文件

    LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持. lrc歌词文本中含有两类标签: 1.标识标签(ID-tags) [ar:艺人名] [ti:曲名] [al:专辑名] [by:编者(指编辑LRC ...

  5. 全面解析Linux数字文件权限

    全面解析Linux数字文件权限 来源:   时间:2013-09-04 20:35:13   阅读数:11433 分享到:0 [导读] 在刚开始接触Linux时对于文件权限的理解并不是很透彻,这里详细 ...

  6. Json--Android中数据文件解析(Json解析--从服务器端获取数据并且解析,显示在客户端上面)

    前面学习过了使用SAX解析XML数据(点击进入:SAX解析XML数据),今天学习Json解析: 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Json数据 ...

  7. [转] 解析Qt资源文件使用

    解析Qt资源文件使用 转自:http://mobile.51cto.com/symbian-270121.htm 本文详细的介绍了Qt文件的使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系 ...

  8. SpringMVC文件上传 Excle文件 Poi解析 验证 去重 并批量导入 MYSQL数据库

    SpringMVC文件上传 Excle文件 Poi解析并批量导入 MYSQL数据库  /** * 业务需求说明: * 1 批量导入成员 并且 自主创建账号 * 2 校验数据格式 且 重复导入提示 已被 ...

  9. 使用DOM4J解析XMl文件与读取XML文件

    XML文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...

随机推荐

  1. bzoj 3450 Tyvj1952 Easy (概率dp)

    3450: Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败 ...

  2. Django实现注册,往邮箱发送验证链接

    由于最近要做个平台,在GitHub上下载了一个系统框架,想着为了安全,实现注册时往一个邮箱发送注册信息,由管理员来确认是否同意其注册. 感谢博主:https://blog.csdn.net/geek_ ...

  3. [LC] 47. Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  4. Iterator迭代器解决[为何禁止在foreach内增删]

    迭代器的应用场景: 1.对集合进行增加删除,禁止使用foreach,循环的动态操作2.倒序遍历3.遍历循环 步入正题:为何禁止在foreach内进行增删? 先看一下代码: /**         *  ...

  5. html,将元素水平,垂直居中的四种方式

    将元素垂直,水平居中分两种情况:一个是元素尺寸固定,二是元素尺寸不固定 一.尺寸固定 方法1:定位 ,50%,margin负距 .box{ width: 400px; height: 300px; b ...

  6. selenium元素定位(一)

    Selenium提供了8种定位方式. id name class name tag name link text partial link text xpath css selector 这8种定位方 ...

  7. A 小石的签到题

    题目链接:https://ac.nowcoder.com/acm/contest/949/A 思路: 这题明确的说了是个签到题,但是一直怀疑不是签到题,是唬我的,结果仔细想了想真是这么回事. 每个人必 ...

  8. hosts原理及作用

    https://blog.csdn.net/qq_41356488/article/details/82190372 手机也可以修改hosts,但是需要root权限,百度

  9. 查看python版本和django版本

    python --version 在python shell中: import sys sys.version import django django.VERSION

  10. Ubuntu12.10下安装Python3

    设置Python3.2为默认版本 ubuntu12.10下默认安装了Python2.7和Python3.2.3,并且设置了Python2.7为默认的版本,因此如果讨厌麻烦的话,可以直接将Python3 ...