我正在开发一个项目,需要从二进制文件中提取资源(图像、音频、gif 等)。我编写了一个脚本来提取 PNG,但虽然某些图像提取成功,但其他图像已损坏。这是我的代码:
main.py:
import os
from src.bin2png import bin2png
for root, dirs, files in os.walk('.\\Bin'):
for file in files:
if not file.endswith('.bin'):
continue
print(f'Found file: {file}')
bin2png(os.path.join(root, file), './png')
print('DONE')
bin2png.py:
import os
import re
import binascii
def bin2png(file_path: str, save_path: str):
counter = 0
png_pattern = re.compile(r'89504E47.*?49454E44AE426082', re.IGNORECASE)
file_path = file_path.replace('\\', '/')
file_name = file_path.split('/')[-1][:-4]
save_path = os.path.join(save_path, file_name)
if not os.path.exists(save_path):
os.mkdir(save_path)
with open(file_path, 'rb') as file:
for match in png_pattern.findall(str(binascii.hexlify(file.read()))):
with open('{}/{}.png'.format(save_path, counter), 'wb+') as image:
image.write(binascii.unhexlify(match))
counter += 1
if counter != 0:
print('Successfully extracted {} PNGs from file {}'.format(counter, file_name))
else:
print('Failed to find PNGs in file {}'.format(file_name))
某些图像已成功提取,但其他图像已损坏。在检查二进制文件时,我发现了这个十六进制代码片段:
A9 70 6E 67 2D 2A 3A 2A 20 20 20 2D 69 68 64 72 20 20 20 5F 20 20 CD 5F 26 75 39 D4 8C EF B0 3E 34 AC C3 23 A9 A3 4D 1D A0 FA 5D F8 32 EF 60 76 75 18 E2 88 D4 24
它看起来像一个PNG文件头,但它偏离了0x20。我写了这段代码来修改十六进制字符串:
hex_modifier.py:
def modify_hex_string(hex_string):
hex_values = hex_string.split()
modified_values = []
for hex_value in hex_values:
int_value = int(hex_value, 16)
modified_value = abs(0x20 - int_value)
modified_value = max(0, min(modified_value, 0xFF))
modified_values.append(format(modified_value, '02X'))
result_string = ' '.join(modified_values)
return result_string
hex_string = "A9 70 6E 67 2D 2A 3A 2A 20 20 20 2D 69 68 64 72 20 20 20 5F 20 20 CD 5F 26 75 39 D4 8C EF B0 3E 34 AC C3 23 A9 A3 4D 1D A0 FA 5D F8 32 EF 60 76 75 18 E2 88 D4 24"
result = modify_hex_string(hex_string)
print(f"Result: [{result}]")
输出是:
Result: [89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 3F 00 00 AD 3F 06 55 19 B4 6C CF 90 1E 14 8C A3 03 89 83 2D 03 80 DA 3D D8 12 CF 40 56 55 08 C2 68 B4 04]
标题现在似乎是正确的,但我仍然面临一些资产损坏的问题。关于可能出现问题或如何解决此问题的任何想法,以及您推荐我使用什么工具或阅读文章?
如何解决这个问题,您推荐我使用什么工具
第一步是确定您的
.bin
文件的真实性质。许多文件格式在开头都有特定的“签名”。您可能会读到例如其中一个文件的 32 个第一个字节(假设它名为 file.bin
)并按照以下方式以十六进制形式显示它们import binascii
with open("file.bin", "rb") as f:
signature = f.read(32)
print(binascii.hexlify(signature, sep=" "))
然后将其与文件签名列表
进行比较,如果存在匹配(请注意,某些签名较短,因此您应该确定任何显示的签名是否是显示字节的前缀),然后您知道文件格式,并且可能能够找到用于处理所述格式的工具。