Вот небольшая программа на 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 '.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:]