import zlib import struct import argparse import itertools parser = argparse.ArgumentParser() parser.add_argument("-f", type=str, default=None, required=True, help="MeowMeow.png") args = parser.parse_args() bin_data = open(args.f, 'rb').read() crc32key = zlib.crc32(bin_data[12:29]) # 计算crc original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc if crc32key == original_crc32: # 计算crc对比原始crc print('宽高没有问题!') else: input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):") if input_ not in ["Y", "y", ""]: exit() else: for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度 data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29] crc32 = zlib.crc32(data) if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定 print(f"\nCRC32: {hex(original_crc32)}") print(f"宽度: {i}, hex: {hex(i)}") print(f"高度: {j}, hex: {hex(j)}") exit(0)
时间: 2024-02-04 15:02:57 浏览: 97
zlib-1.2.7-21.el7_9.x86_64.rpm
这是一段 Python 代码,用于对 PNG 图片进行 CRC 校验,检测图片的宽度和高度是否被修改过。程序通过打开指定的 PNG 文件,读取其中的二进制数据,计算出 CRC 校验值与原始的 CRC 校验值进行比较,如果相同则说明图片的宽度和高度没有被修改过,否则进行 CRC 爆破,通过枚举不同的宽度和高度组合来计算 CRC 校验值,直到找到与原始 CRC 校验值相同的组合为止,从而确定图片的宽度和高度。
如果你需要使用这段代码,需要先安装 Python 3 环境,并通过 pip 安装 argparse 和 itertools 两个库。然后将代码保存为 CRC.py 文件,通过命令行参数指定要进行 CRC 校验的 PNG 文件,例如:
```
python CRC.py -f MeowMeow.png
```
其中 MeowMeow.png 是你要进行 CRC 校验的 PNG 文件路径。执行程序后,如果图片的宽度和高度没有被修改过,则程序会输出宽高没有问题!否则会提示你是否进行 CRC 爆破,如果选择进行 CRC 爆破,则程序会枚举不同的宽度和高度组合,计算出 CRC 校验值,并与原始 CRC 校验值进行比较,直到找到与原始 CRC 校验值相同的组合为止,从而确定图片的宽度和高度。
阅读全文