Aqui está um pequeno programa em Python que faz o que você parece estar descrevendo.
#!/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')
Un Apenas brevemente testado; por favor ping me se você encontrar erros de digitação.
O base
especifica onde tentar aplicar os quatro bytes e a longa string '996873
... é a representação hexadecimal do SHA1 esperado. A linha for seq in
... define os bytes para tentar; e, é claro, substitua 'binaryfile'
pelo caminho para o arquivo que você deseja tentar salvar.
Você pode substituir a lista literal [[0xCA, 0xC5,
... ]]
por alguma coisa para realmente fazer o loop de todos os valores possíveis, mas é basicamente apenas um espaço reservado para algo mais útil, porque não sei exatamente o que você quer lá.
Algo como for seq in itertools.product(range(256), repeat=4)):
apresentará todos os valores possíveis de 0 a 2 32 -1. (Você precisará adicionar import itertools
próximo ao topo.) Ou talvez você possa simplesmente adicionar um deslocamento; atualize o script para substituir o atual for seq in
pelo seguinte (onde novamente o import
precisa ir antes do programa principal);
import struct
for n in range(2**32):
val=(n+0x8AC5C5CA) % 2**32 # notice reverse order
seq=list(reversed(struct.pack(">I", val)))
copy = ...
Eu inverti a ordem dos bytes para que ela incremente naturalmente de 0x8AC5C5CA para 0x8AC5C5CB, mas o próximo incremento será 0x8AC5C5CC etc. A struct
magic é converter isso em uma seqüência de bytes (tive que procurá-la a partir de link ). Isso iniciará em 0x8AC5C5CA e irá para 0xFFFFFFFF, então, contorna 0x00000000 e volta para 0x8AC5C5C9.
Se você tiver vários intervalos de candidatos que gostaria de examinar em uma ordem específica, talvez algo como
for rge in [(0x8AC5C5CA, 0x8AFFFFFF), (0x00C6C58A, 0x00FFFFFF),
(0x00000000, 0x00C6C589), (0x01000000, 0x8AC5C5C9)]:
for val in range(*rge):
seq=list(reversed(struct.pack(">I", val)))
copy = ...
mas você precisará certificar-se de que os pares (início, fim) em rge
cobrem todo o espaço entre 0x00000000 e 0xFFFFFFFF se você realmente quiser examinar tudo isso . (E, novamente, observe que o intervalo incrementa o byte último e que seq
aplica os bytes do valor em ordem inversa, de acordo com seus requisitos declarados.)
Se você quisesse usar dois endereços base
diferentes, você rapidamente se depararia com os limites do que é viável fazer em sua vida com força bruta; mas você poderia, por exemplo, dividir o número de 4 bytes em duas partes de 2 bytes e aplicá-las em diferentes deslocamentos.
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:]