如何从二进制文件中提取资源?

问题描述 投票:0回答:1

从二进制文件中提取资产:某些资产已损坏

我正在开发一个项目,需要从二进制文件中提取资源(图像、音频、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]

标题现在似乎是正确的,但我仍然面临一些资产损坏的问题。关于可能出现问题或如何解决此问题的任何想法,以及您推荐我使用什么工具或阅读文章?

python file-io binary hex extract
1个回答
0
投票

如何解决这个问题,您推荐我使用什么工具

第一步是确定您的

.bin
文件的真实性质。许多文件格式在开头都有特定的“签名”。您可能会读到例如其中一个文件的 32 个第一个字节(假设它名为 file.bin)并按照以下方式以十六进制形式显示它们
import binascii
with open("file.bin", "rb") as f:
    signature = f.read(32)
print(binascii.hexlify(signature, sep=" "))

然后将其与
文件签名列表

进行比较,如果存在匹配(请注意,某些签名较短,因此您应该确定任何显示的签名是否是显示字节的前缀),然后您知道文件格式,并且可能能够找到用于处理所述格式的工具。

© www.soinside.com 2019 - 2024. All rights reserved.