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

最新文章

  1. [翻译] Autoac 最佳实践和建议
  2. 求两条线段交点zz
  3. hdu 2583 permutation
  4. lintcode:单词切分
  5. phonegap 检查是否有网络
  6. jQuery 的选择器
  7. AIM Tech Round (Div. 2) B. Making a String 贪心
  8. C# 四舍五入
  9. Andorid-Fragment生命周期
  10. DTCMS自定义标签,tags分割
  11. 简单的jquery选择器的实现
  12. Dubbo源码学习--服务是如何发布的
  13. mvc页面中,显示自定义时间格式
  14. Android studio和Genymotion-VirtualBox的配合使用
  15. Thread类(线程)
  16. pip3 install pymysql
  17. Linux内核分析— —计算机是如何工作的(20135213林涵锦)
  18. ubuntu下msmtp+mutt的安装和配置
  19. jenkins 搭建过程中遇到的问题
  20. mysql sleep连接过多解决办法

热门文章

  1. arduino basic issue
  2. FireWall2
  3. SpringBoot 系列 - 自己写starter
  4. Spring Boot集成全局唯一ID生成器
  5. python使用geopandas和shapely处理shp文件
  6. Java子类和父类的初始化执行顺序
  7. Google的kaptcha验证码使用
  8. 常见40个常用的js页面效果图
  9. &lt;USACO06NOV&gt;玉米田Corn Fields
  10. 【XP系统下载U盘装系统】用电脑店超级U盘装XP系统详细图文教程