这是一个小型的Python程序,可以完成您所描述的内容。
#!/usr/bin/env python3
from hashlib import sha1
with open('binaryfile', 'rb') as bin:
binary = bin.read()
base = 0x0078
# ... is not valid Python; add more sequences, or take it out (or see below)
for seq in [[0xCA, 0xC5, 0xC5, 0x8A], [0xCB, 0xC5, 0xC5, 0x8A], ...]:
copy = binary[0:base]
copy += bytes(seq)
copy += binary[base+len(seq):]
if sha1(copy).hexdigest() == '9968733ce3ff0893bbb0a19e75faaf2fb0000e19':
print('success with bytes {0}'.format(seq))
break
else:
print('no success')
联合国只是简单测试; 如果你发现错别字,请打电话给我。
在base
指定要尝试应用四个字节,长字符串'996873
...是预期的SHA1的十六进制表示。行for seq in
...定义要尝试的字节; 当然要替换'binaryfile'
为您要尝试抢救的文件的路径。
您可以替换文字列表[[0xCA, 0xC5,
... ]]
用实际循环覆盖所有可能值的东西,但它基本上只是一个占位符,用于更有用的东西,因为我不确定您到底想要什么。
类似的东西for seq in itertools.product(range(256), repeat=4)):
会循环遍历从0到2 32 -1的所有可能值。(你需要import itertools
在顶部附近添加。)或者你可以简单地添加一个偏移; 更新脚本以用for seq in
以下内容替换当前(在import
主程序之前需要再次进行);
import struct
for n in range(2**32):
val=(n+0x8AC5C5CA) % 2**32 # notice reverse order
seq=list(reversed(struct.pack(">I", val)))
copy = ...
我颠倒了字节的顺序,以便它自然地从0x8AC5C5CA递增到0x8AC5C5CB,但接下来的增量将是0x8AC5C5CC等。struct
神奇的是将其转换为字节序列(必须从https:// stackoverflow查找它)。 com / a / 26920983/874188)。这将从0x8AC5C5CA开始并转到0xFFFFFFFF,然后回绕到0x00000000并向上爬回到0x8AC5C5C9。
如果您有多个候选范围,您希望按特定顺序检查,可能是类似的
for rge in [(0x8AC5C5CA, 0x8AFFFFFF), (0x00C6C58A, 0x00FFFFFF),
(0x00000000, 0x00C6C589), (0x01000000, 0x8AC5C5C9)]:
for val in range(*rge):
seq=list(reversed(struct.pack(">I", val)))
copy = ...
但是你需要确保自己(开始,结束)对rge
覆盖0x00000000和0xFFFFFFFF之间的所有空间,如果你真的想要检查它的全部。(再次注意,范围会增加最后一个字节seq
,并根据您的规定要求反向应用值的字节。)
如果你想使用两个不同的base
地址,你很快就会遇到蛮力的生活中可行的极限; 但是,例如,您可以将4字节数字拆分为两个2字节的部分,并应用不同的偏移量。
base1 = 0x1234
base2 = 0x2345
for seq in range(whatever):
copy = binary[0:base1]
copy += bytes(seq[0:1])
copy += binary[base1+2:base1+base2]
copy += bytes(seq[2:3])
copy += binary[base2+2:]