Hier ist ein kleines Python-Programm, das das tut, was Sie zu beschreiben scheinen.
#!/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')
UnNur kurz getestet; Bitte klingeln Sie mich, wenn Sie Tippfehler finden.
Die base
Angabe, wo versucht werden soll, die vier Bytes anzuwenden, und der lange String '996873
... ist die Hex-Darstellung des erwarteten SHA1. Die Zeile for seq in
... definiert die zu versuchenden Bytes; und natürlich durch 'binaryfile'
den Pfad zu der Datei ersetzen, die Sie retten möchten.
Sie können die wörtliche Liste ersetzen [[0xCA, 0xC5,
... ]]
durch etwas, das tatsächlich alle möglichen Werte durchläuft, aber es ist im Grunde nur ein Platzhalter für etwas Nützlicheres, da ich nicht wirklich weiß, was genau Sie dort wollen.
So etwas for seq in itertools.product(range(256), repeat=4)):
wird alle möglichen Werte von 0 bis 2 32 -1 durchlaufen. (Sie müssen dann ganz oben hinzufügen import itertools
.) Oder Sie fügen einfach einen Versatz hinzu. Aktualisieren Sie das Skript, um den aktuellen Wert for seq in
durch Folgendes zu ersetzen (wobei erneut import
vor dem Hauptprogramm gesucht werden muss);
import struct for n in range(2**32): val=(n+0x8AC5C5CA) % 2**32 # notice reverse order seq=list(reversed(struct.pack(">I", val))) copy = ...
Ich habe die Reihenfolge der Bytes umgekehrt, so dass sie natürlich von 0x8AC5C5CA zu 0x8AC5C5CB inkrementiert, aber das nächste Inkrement ist dann 0x8AC5C5CC usw. Der struct
Zauber besteht darin, diese in eine Folge von Bytes umzuwandeln (musste von https: // stackoverflow nachschlagen. com / a / 26920983/874188 ). Dies wird bei 0x8AC5C5CA beginnen und zu 0xFFFFFFFF gehen, dann zu 0x00000000 umlaufen und wieder auf 0x8AC5C5C9 klettern.
Wenn Sie mehrere Kandidatenbereiche haben, möchten Sie diese in einer bestimmten Reihenfolge untersuchen
for rge in [(0x8AC5C5CA, 0x8AFFFFFF), (0x00C6C58A, 0x00FFFFFF), (0x00000000, 0x00C6C589), (0x01000000, 0x8AC5C5C9)]: for val in range(*rge): seq=list(reversed(struct.pack(">I", val))) copy = ...
Aber dann müssen Sie sich vergewissern, dass die Paare (Anfang, Ende) denrge
gesamten Speicherplatz zwischen 0x00000000 und 0xFFFFFFFF abdecken, wenn Sie wirklich alles untersuchen wollen. (Beachten Sie wiederum, dass der Bereich das letzte Byte inkrementiert und dass seq
die Bytes des Wertes entsprechend Ihren angegebenen Anforderungen umgekehrt werden.)
Wenn Sie zwei verschiedene base
Adressen verwenden wollten, stoßen Sie schnell an die Grenzen dessen, was in Ihrem Leben mit brutaler Gewalt möglich ist. Sie können jedoch beispielsweise die 4-Byte-Zahl in zwei 2-Byte-Teile aufteilen und diese an verschiedenen Offsets anwenden.
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:]