Kennt jemand eine Möglichkeit, Werte bei einem bestimmten Versatz in einer Datei zu brachialisieren? Es sind 4 aufeinanderfolgende Bytes, die brutal gezwungen werden müssten. Ich kenne das korrekte SHA-1 der beschädigten Datei. Ich möchte also die gesamte Datei SHA-1 jedes Mal vergleichen, wenn sie den Bytewert ändert.
Ich kenne die genauen 4 Bytes, die geändert wurden, weil mir die Datei von einem Datenwiederherstellungsexperten als Wiederherstellungsaufforderung übergeben wurde. Für diejenigen, die wissen wollen, hat die rar-Datei 4 Bytes, die absichtlich geändert wurden. Mir wurde der Versatz der geänderten 4 Bytes und des ursprünglichen SHA-1 mitgeteilt. Die Person sagte, es sei UNMÖGLICH, die genaue Datei im Archiv wiederherzustellen, sobald die 4 Bytes geändert wurden. Auch wenn es nur wenige Bytes waren und Sie genau wussten, wo sich die Beschädigung befand. Da es keinen Wiederherstellungsdatensatz gibt. Ich versuche zu sehen, ob es eine Möglichkeit gibt, diese 4 Bytes korrekt auszufüllen, damit die Datei fehlerfrei dekomprimiert wird. Die Dateigröße beträgt ca. 5 MB.
Beispiel :
Ich habe Fotos hochgeladen, damit klarer definiert ist, was ich tun möchte. Ich glaube, jemand kann sie hier für mich mit mehr Repräsentanten posten.
Der Beispieloffset, auf den ich mich konzentriere, ist 0x78
der Punkt, an dem das erste Bild den Wert anzeigt, da CA
ich möchte, dass das Skript den Wert um 1 CB
erhöht, so dass er dem Wert im zweiten Bild entspricht. Ich möchte, dass es den Wert immer weiter erhöht 1
und dann jedes Mal die gesamte Datei SHA-1 vergleicht. Nehmen Sie nur Änderungen an diesen 4 Bytes am angegebenen Versatz vor.
Es wird versucht CAC5C58A
, den SHA-1 zu vergleichen. Wenn dies nicht CBC5C58A
zutrifft , wird versucht. Wenn der erste Wert erreicht FF
ist, geht er zu 00C6C58A
und so weiter. Grundsätzlich möchte ich, dass es geht, 00000000-FFFFFFFF
aber auch die Möglichkeit hat zu wählen, wo Sie es beginnen und enden möchten. Ich weiß, dass es einige Zeit dauern könnte, aber ich würde es trotzdem gerne versuchen. Denken Sie daran, ich kenne den genauen Versatz der Bytes, die beschädigt sind. Ich brauche nur die richtigen Werte.
Wenn Sie auf Google suchen: "So beheben Sie eine beschädigte Datei mit brachialer Gewalt" Es gibt eine Person, die ein Linux-Programm geschrieben hat. Es funktioniert jedoch nur mit den im Programm enthaltenen Dateien. Ich suche nach einer Möglichkeit, den gleichen Prozess mit meiner Datei zu verwenden.
quelle
Antworten:
Hier ist ein kleines Python-Programm, das genau das tut, was Sie zu beschreiben scheinen.
UnNur kurz getestet; Bitte ping mich an, wenn du Tippfehler findest.Das
base
gibt an, wo versucht werden soll, die vier Bytes anzuwenden, und die lange Zeichenfolge'996873
... ist die hexadezimale Darstellung des erwarteten SHA1. Die Zeilefor 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 Literal-Liste
[[0xCA, 0xC5,
...]]
durch etwas ersetzen, das tatsächlich alle möglichen Werte durchläuft, aber im Grunde genommen ist es nur ein Platzhalter für etwas Nützlicheres, da ich nicht sicher bin, was genau Sie dort wollen.So etwas
for seq in itertools.product(range(256), repeat=4)):
durchläuft alle möglichen Werte von 0 bis 2 32 -1. (Sie müssen dann in derimport itertools
Nähe des oberen Randes hinzufügen.) Oder Sie können einfach einen Versatz hinzufügen. Aktualisieren Sie das Skript, um das aktuellefor seq in
durch das folgende zu ersetzen (wobei wiederumimport
das Hauptprogramm vorgezogen werden muss).Ich umgekehrt die Reihenfolge des Bytes , so dass es natürlich Schritte von 0x8AC5C5CA zu 0x8AC5C5CB aber dann dem nächsten Inkrement werden 0x8AC5C5CC usw. Die
struct
Magie dies eine Folge von Bytes zu konvertieren ist (hatte es nachzuschlagen von https: // Stackoverflow. com / a / 26920983/874188 ). Dies beginnt bei 0x8AC5C5CA und geht zu 0xFFFFFFFF, umschließt dann 0x00000000 und steigt wieder auf 0x8AC5C5C9 auf.Wenn Sie mehrere Kandidatenbereiche haben, die Sie in einer bestimmten Reihenfolge untersuchen möchten, z
Aber dann müssen Sie sich vergewissern, dass die (Start-, End-) Paare den
rge
gesamten Raum zwischen 0x00000000 und 0xFFFFFFFF abdecken, wenn Sie wirklich alles untersuchen möchten. (Beachten Sie auch hier, dass der Bereich das letzte Byte inkrementiert undseq
die Bytes des Werts entsprechend Ihren angegebenen Anforderungen umgekehrt angewendet werden.)Wenn Sie zwei verschiedene
base
Adressen verwenden möchten, stoßen Sie schnell an die Grenzen dessen, was in Ihrem Leben mit brachialer Gewalt machbar ist. Sie können jedoch beispielsweise die 4-Byte-Zahl in zwei 2-Byte-Teile aufteilen und diese an verschiedenen Offsets anwenden.quelle
Nein, nein, nein und wieder NEIN!
Selten erhalten Sie eine Antwort, die nicht Ihren Erwartungen entspricht.
Einige Fragen an Sie:
Na und? ... Zeit.
Der Punkt ist, dass Sie so wenige Bytes ändern müssen ... nur 4!
Was bedeutet das? 256 4 das sind 256x256x256x256 Möglichkeiten, eine wirklich sehr große Zahl.
Wenn Ihr Computer 1 Operation pro Sekunde verarbeiten konnte (Ersetzung in der Datei + sha1) ...
sollten Sie mehr als 136 Jahre warten , oder wenn Sie mehr als 49710 Tage bevorzugen.
Sie haben genug Glück, eine 5 MB große vorab zwischengespeicherte Datei (die bereits im RAM und im Cache geladen ist) benötigt auf einem alten Computer nur etwa 0,03 Sekunden (min. 0,025 Sekunden). Das verkürzt Ihre erwartete Zeit auf 1242-1492 Tage (etwas mehr als 3 Jahre).
Es ist wahr, BTW, dass statistisch gesehen Sie in der Hälfte der Zeit eine positive Antwort haben sollten . Trotzdem sollten Sie warten, bis Sie alle Möglichkeiten ausprobiert haben, um sicherzugehen, dass es nur eine Substitution gibt, die Ihnen dieselbe SHA-1-Prüfsumme gibt ...
Nun, da UNMÖGLICH klingt als "nicht möglich in einer bestimmten Zeit".
Wie geht es weiter?
Richtigere Antwort auf Ihre technische Frage: Wenn Sie über rohe Gewalt sprechen, muss es nicht unbedingt blinde rohe Gewalt sein.
In einem Kommentar in der anderen Antwort heißt es lediglich, dass Sie die sha1-Prüfsumme für das Teil vor der Beschädigung nicht berechnen müssen. Sie machen das 1. Mal und Sie sparen Zeit für jede nachfolgende Iteration (möglicherweise ein Faktor 2, der von der Position abhängt).
Etwas, das den Wert der Anstrengung ändern kann, ist das Schreiben eines parallelen Codes , der auf der GPU ausgeführt wird. Wenn Sie eine gute Grafikkarte haben, haben Sie möglicherweise ungefähr 1000 Kerne, die für Sie parallel rechnen können (sogar mehr, aber sie haben eine niedrigere Frequenz als die CPU, aber sie sind immer noch viel). Wenn Sie in der Lage sind, die Zeit von 1400 auf 1,4 Tage zu verkürzen, können Sie es vielleicht sogar tun.
Ein anderer Ansatz kann zu einer schnelleren Lösung führen.
Sie sagten, es ist eine Rar-Datei. Die rar-Dateistruktur ist in Blöcke unterteilt. Wenn Sie es zählen, können Sie sehen, wo die Korruption fällt. Wenn es sich um einen Teil der Daten handelt, um einen Teil der Überschriften oder um beide. Dann können Sie konsequent handeln. Nehmen wir der Einfachheit halber an, es
sind keine Daten mehr vorhanden: Sie können die Brute Force Ihres Offsets ausführen und für jeden positiven CRC dieses Blocks überprüfen, ob der SHA1 für die gesamte Datei sogar positiv ist. Auch hier können Sie einen parallelen Code ausführen.
Schlussbemerkung
Wenn sie 6 Bytes statt 4 waren, warst du mit der gegenwärtigen Technologie aus dem Spiel.
quelle
;-)
. Suche nach (wenn nvidia)Cuda, brute force, sha1
und du wirst viele Hinweise haben, zB Quellcode . BTW Ihre Aufmerksamkeit hoch halten , weil aus , dass Google Weg gerade, oh mein Junge, können Sie auf eine der dunklen Seiten des Netzes führen ...:-)
. (Nicht auf Github ... auf einer anderen Seite, die Sie mit dieser Art von Recherchen treffen können). PS> Es gibt eine Menge wissenschaftlicher Artikel zu verwandten Themen, z. B. diesen ...