Automatisch "brutale Gewalt", um einige Bytes wiederherzustellen, um eine beschädigte Datei wiederherzustellen

4407
Sbt19

Kennt jemand da draußen einen Weg, um Kraftwerte an einem bestimmten Offset in einer Datei zu brachieren? Es sind 4 aufeinander folgende Bytes, die brutal erzwungen werden müssten. Ich kenne den korrekten SHA-1 der beschädigten Datei. Ich möchte also die komplette Datei SHA-1 vergleichen, wenn der Byte-Wert geändert wird.

Ich kenne die genauen 4 Bytes, die geändert wurden, weil mir die Datei von einem Experten für Datenwiederherstellung als Wiederherstellungsaufforderung zur Verfügung gestellt wurde. Für diejenigen, die wissen möchten, hat die rar-Datei 4 Bytes, die absichtlich geändert wurden. Mir wurden die Offsets 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 Korruption befand. Da hat es keinen Wiederherstellungssatz. Ich versuche zu sehen, ob es eine Möglichkeit gibt, diese 4 Bytes korrekt auszufüllen, so dass die Datei ohne Fehler dekomprimiert wird. Die Dateigröße beträgt ca. 5 MB.

Beispiel :

Ich habe Fotos hochgeladen, damit wird klarer definiert, was genau ich tun möchte. Ich glaube, jemand kann sie hier mit mehr Wiederholungen posten.

Screenshot eins

Screenshot zwei

Der Beispielversatz, auf den ich mich fokussiere, ist der, 0x78bei dem das erste Bild den Wert anzeigt, wenn CA das Skript den Wert um 1 CBerhöhen soll, so dass es wie im zweiten Bild angezeigt wird . Ich möchte, dass der Wert immer weiter erhöht wird 1und die gesamte Datei SHA-1 jedes Mal verglichen wird. Nehmen Sie nur Änderungen an diesen 4 Bytes am angegebenen Offset vor.

Es wird versucht CAC5C58A, den SHA-1 zu vergleichen. Wenn dies nicht der Fall ist, wird es versucht. CBC5C58AWenn der erste Wert erreicht ist FF, wird er nach 00C6C58Ausw. verschoben . Grundsätzlich möchte ich, dass es möglich ist, von zu gehen, 00000000-FFFFFFFFaber auch die Option zu haben, wo Sie es beginnen und enden möchten. Ich weiß, dass es einige Zeit dauern kann, aber ich würde es trotzdem gerne ausprobieren. Denken Sie daran, dass ich den exakten Versatz der beschädigten Bytes kenne. Ich brauche nur die richtigen Werte.

Wenn Sie bei Google suchen: "So reparieren Sie eine beschädigte Datei durch Brute-Force" Es gibt eine Person, die ein Linux-Programm geschrieben hat. Es funktioniert jedoch nur für die im Programm enthaltenen Dateien. Ich suche nach einer Möglichkeit, den gleichen Prozess mit meiner Datei zu verwenden.

34
Willkommen bei Super User! Ich habe Ihre Frage bearbeitet, um die Anforderung für ein Programm zu entfernen, das außerhalb des Themas liegen würde. Können Sie [Ihre Frage bearbeiten] (https://superuser.com/posts/1315393/edit) (einige) der Beispiele, die Sie gesehen haben, einschließen? Es ist gut, dass Sie recherchiert haben, aber zeigen Sie uns genau, welche Recherche hilfreich wäre :) bertieb vor 6 Jahren 3
Danke, Bertieb! Ich habe einige Details hinzugefügt. Sbt19 vor 6 Jahren 0
Könnte ich fragen, wie Sie mit dieser Datei gelandet sind und wie Sie sicher sein können, dass dies nur die 4 fehlerhaften Bytes sind? Edoardo vor 6 Jahren 20
Kennen Sie das Dateiformat? Wenn Sie dies tun, können Sie möglicherweise die korrekten Werte herausfinden oder die Bereiche einschränken, anstatt zu versuchen, sie brutal zu erzwingen. Im Allgemeinen würde ich jedoch vorschlagen, dass eine beschädigte Datei aus Sicherheitsgründen gesichert werden sollte. StephenG vor 6 Jahren 1
@Deddyce Ich interessiere mich wirklich für den zweiten Teil Ihrer Frage - * Warum diese 4 Bytes? * Craig Otis vor 6 Jahren 11
Ich denke, der Blog-Post, auf den Sie sich beziehen, ist https://conorpp.com/how-to-fix-a-corrupted-file-by-brute-force tripleee vor 6 Jahren 1
Wie wurde die Datei aus Neugierde beschädigt? Und woher wissen Sie, dass es diese vier Bytes waren? JohnEye vor 6 Jahren 2
@CraigOtis Ich habe nie gefragt, warum diese 4 Bytes, "wie können Sie sicher sein, dass dies die einzigen 4 korrupten sind" die Sache ist Edoardo vor 6 Jahren 0
Das Programm "ghex" ist für solche Dinge nützlich. Lee Daniel Crocker vor 6 Jahren 0
@LeeDanielCrocker Könnten Sie erläutern, wie es nützlich ist? Speichern Sie manuell 4 Milliarden Dateien in ghex, führen Sie sie aus und prüfen Sie, ob sie übereinstimmen? Ein bisschen langweilig. pipe vor 6 Jahren 0
Die Frage betraf das Patchen einiger Bytes in einer einzigen Datei. Lee Daniel Crocker vor 6 Jahren 0
@LeeDanielCrocker Nein, die Frage betrifft das Patchen, bis die Prüfsumme den erwarteten Wert erreicht. Wie bei der Anfrage von Pipe fragen wir uns nun, ob Sie die Frage nicht richtig gelesen haben oder ob "ghex" dies tatsächlich kann. tripleee vor 6 Jahren 1
Ich habe weitere Details zu der betreffenden Datei hinzugefügt. Es ist nur eine Datenwiederherstellungstestdatei. Sbt19 vor 6 Jahren 1
@eddyce: Es ist ziemlich einfach, in diese Situation zu geraten, wenn Sie versehentlich eine Bearbeitung in Ihrem Hex-Editor speichern und dann den Undo-Puffer verwerfen, wenn er gespeichert wird. (Ich habe diejenigen verwendet, die das tun.) Mehrdad vor 6 Jahren 0
Beachten Sie, dass es aufgrund des Pigeon-Hole-Prinzips möglicherweise mehr als eine Folge von Bytes gibt, die den Hash zur Übereinstimmung bringen. Eine dieser Sequenzen ist möglicherweise für jeden Dateityp "gültiger". Roger Lipscombe vor 6 Jahren 1
Es sieht so aus, als würden Sie nach einem Hex-Editor suchen. https://softwarerecs.stackexchange.com/ ist der richtige Ort, um danach zu fragen Mawg vor 6 Jahren 0
@mehrdad ok, es ist eine Art Herausforderung dann :) Rat: Vergewissern Sie sich, dass Sie die Datei mit dem SHA-1 vergleichen, das Sie erhalten haben, und nicht nur durch das Entpacken des RAR-Archivs, weil - vielleicht - die geänderten 4 Byte Teil sind der RAR-CRC-Datensätze ... Edoardo vor 6 Jahren 0
Möglicherweise wird es eine Weile dauern, bis die aktuelle Datei gespeichert wird, und multipliziert diese mit 2 ^ 32 für die ungünstigste Suchzeit. Wenn jede sha1-Bewertung 0,01 Sekunden dauert, sehen Sie im schlechtesten Fall 1,36 Jahre, wenn Sie die Suche nicht parallelisieren. Im Durchschnitt die Hälfte davon. rrauenza vor 6 Jahren 0
Verwandte https://math.stackexchange.com/questions/1410509/wahrscheinlichkeitsnummer-von-guthaben-zum-ziel-der-korrigieren-der-von-a-set-nach-reparatur rrauenza vor 6 Jahren 0
[Lass uns verbessern! Wie wir @ rogerkvers $ 1.000 Wallet-verschleierten privaten Schlüssel gefunden haben] (https://medium.freecodecamp.org/lets-enhance-how-we-found-rogerkver-s-1000-wallet-obfuscated-private-key-8514e74a5433#c6c5) Vlastimil Ovčáčík vor 5 Jahren 0

2 Antworten auf die Frage

27
tripleee

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 baseAngabe, 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 indurch Folgendes zu ersetzen (wobei erneut importvor 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 structZauber 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 seqdie Bytes des Wertes entsprechend Ihren angegebenen Anforderungen umgekehrt werden.)

Wenn Sie zwei verschiedene baseAdressen 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:] 
Kommentare sind nicht für eine erweiterte Diskussion vorgesehen. Diese Konversation wurde [zum Chat verschoben] (https://chat.stackexchange.com/rooms/76323/discussion-on-answer-by-tripleee-automatically-brute-force-a-few-bytes-to-reco) . Journeyman Geek vor 6 Jahren 0
4
Hastur

Nein, nein, nein und wieder NEIN!

Die Antwort, die Sie erhalten, ist selten das, was Sie erwarten.

Einige Fragen an Sie:

  • Ist es möglich, dass ein Experte nicht weiß, dass es möglich ist, eine Zeichenkette for Bytes brutal zu erzwingen und den SHA-1 iterativ auszuprobieren, bis er konvergiert? Nein
  • Kann er es vergessen? Nein
  • Ist es möglich, dass Sie dies nicht für eine rar-Datei tun können? Nein
  • Ist die andere Antwort falsch? absolut NEIN

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 große Zahl.
Wenn Ihr Computer 1 Vorgang 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, denn eine vorgespeicherte 5-MB-Datei (bereits in RAM und im Cache geladen) fragt nur etwa 0,03 Sekunden (min 0,025 Sekunden) auf einem alten Computer. Das reduziert Ihre erwartete Zeit auf 1242-1492 Tage (etwas mehr als 3 Jahre).

Übrigens, übrigens, statistisch gesehen sollten Sie in der Hälfte der Zeit eine positive Antwort haben . Trotzdem sollten Sie warten, bis Sie alle Möglichkeiten ausprobiert haben, um sicherzustellen, dass es nur einen Ersatz gibt, der Ihnen die gleiche SHA-1-Prüfsumme gibt ...

Nun, dass UNMÖGLICH als "in WORTHWHILE Zeit nicht möglich" klingt .


Wie geht es weiter?

Eine richtigere Antwort auf Ihre technische Frage: Wenn Sie über rohe Gewalt sprechen, muss dies keine blinde rohe Gewalt sein.

  • In der anderen Antwort wird lediglich in einem Kommentar darauf hingewiesen, dass Sie die sha1-Prüfsumme des Teils vor der Beschädigung nicht berechnen müssen. Sie machen das 1. Mal und Sie sparen Zeit für jede nachfolgende Iteration (vielleicht ein Faktor 2 hängt von der Position ab).

  • Etwas, das den Wert der Anstrengung ändern kann, ist das Schreiben eines parallelen Codes, der auf der GPU ausgeführt wird. Wenn Sie über eine gute Grafikkarte verfügen, verfügen Sie möglicherweise über etwa 1000 Kerne, die parallel für Sie berechnen können (sogar mehr, aber sie haben eine niedrigere Frequenz als die CPU, sind aber dennoch sehr viel). Wenn Sie die Zeit von 1400 auf 1,4 Tage reduzieren können, können Sie dies vielleicht sogar tun.

  • Ein anderer Ansatz kann zu einer schnelleren Lösung führen.
    Sie sagten, es sei eine rar-Datei. Die rar-Dateistruktur ist in Blöcke unterteilt. Wenn Sie zählen, können Sie sehen, wo die Korruption sinkt. Wenn es sich um einen Teil der Daten handelt, um einen Teil der Header oder um beides. Dann können Sie konsequent handeln. Der Einfachheit halber nehmen wir an, es geht um die Daten:
    Sie können die rohe Kraft Ihres Offsets ausführen, und für jeden positiven CRC dieses Blocks prüfen, ob der SHA1 für die gesamte Datei sogar positiv ist. Wieder können Sie einen parallelen Code erstellen.

Schlussnote

Wenn sie 6 Bytes statt 4 Bytes waren, waren Sie mit der derzeitigen Technologie aus dem Spiel.

Tolle Antwort - man müsste nicht unbedingt den gesamten Speicherplatz auslasten, da sich die rar selbst in diesem Beispiel aufgrund interner Überprüfungen nicht dekomprimieren würde, selbst wenn der sha1 mit einem doppelten Hash arbeitet. Es wäre sehr unwahrscheinlich, 4 Bytes zu treffen, die das sha1 falsch gelöst haben, und ein internes Crc falsch. rrauenza vor 6 Jahren 0
@rrauenza Danke. Übrigens nicht nur (der doppelte Check). In der Tat sollte der Block kürzer sein als der gesamte Teil von den beschädigten Bytes bis zum Ende der Datei, und der CRC sollte leichter zu berechnen sein als der sha1-Algorithmus ... Hastur vor 6 Jahren 0
@rrauenza Wissen Sie, wie ich den eigentlichen parallelen Code auf der GPU laufen lassen würde? Ich habe eine gute GPU. Vielen Dank. Sbt19 vor 6 Jahren 0
Nein, tue ich nicht. Sie können jedoch mehrere CPUs verwenden, indem Sie den Suchraum jedoch partitionieren. rrauenza vor 6 Jahren 0
@ Sbt19 Was auch immer Sie darüber gesagt haben, Google ist nicht so gruselig, `;-)` zu verwenden. Suchen Sie nach (falls nvidia) `Cuda, brute force, sha1` und Sie werden viele Hinweise haben, z. B. [Quellcode] (https://github.com/smoes/SHA1-CUDA-bruteforce). Übrigens, halten Sie Ihre Aufmerksamkeit hoch, denn _browsing von diesem google-Pfad, oh mein Junge, kann Sie auf eine der dunklen Seiten des Netzes führen _... `:-)`. (Nicht auf github ... auf anderen Websites, die Sie mit dieser Art von Forschungen treffen können). __PS> __ Es gibt viele wissenschaftliche Veröffentlichungen zu verwandten Themen (z. B. diesem) (https://ieeexplore.ieee.org/document/8001964/) ... Hastur vor 6 Jahren 0
@Hastur Heh, ich kann Google sehr gut gebrauchen: Ich kenne alle Seiten des Netzes. Ich bin jedoch nicht im Programmierbereich ausgebildet. Ich weiß von SHA1-Raubzucht. Ich konnte keinen richtigen Code finden, der eine Datei durch die GPU brutal zwingen kann. Das wäre viel schneller. PS Danke für deine ausführliche Antwort. Ich bin sicher, es wird anderen helfen. Sbt19 vor 6 Jahren 0
Ist etwa 4,3 Milliarden; das ist nicht wirklich eine "wirklich große Zahl". Es ist zum Beispiel ähnlich wie die Taktraten, mit denen CPUs laufen. PS: Wenn ich die Zahlen auf diesem mehrere Jahre alten Computer laufe, bekomme ich ~ 63 Tage, ohne komplizierte Funktionen wie die Verwendung einer GPU. derobert vor 5 Jahren 0
Wenn Sie einen CRC haben, mit dem Sie nachprüfen können, wäre es dumm, das zu unterdrücken - das können Sie analytisch tun. Dann sollten Sie sich nur noch mit SHA-1 beschäftigen, wenn CRC durchläuft (dies sollte Ihren Suchraum durch etwa 2¹⁶ teilen, wodurch die Suchzeit auf den Minutenbereich reduziert wird.) derobert vor 5 Jahren 0
@derobert 1). Ich habe Probleme, mehr als 21 zu zählen (mit Fingern und Nase ... `:-)`). Für mich ist es wirklich sehr groß, wenn Sie daran denken, die Iteration abzuschließen. 2). Der Vergleich mit dem CPU-Takt gilt, wenn Sie einen Prozessor haben, der in einem Zyklus die SHA1 für die gesamte 5-MB-Datei ausführen kann (also mit 5-MB-Registern ...) 3) Ich stimme völlig zu, dass die CRC-Informationen einfacher zu verwenden sind (und ich schlug vor), aber das OP fragte nach SHA1 ... 4) Ich denke, das _WORTHWHILE_-Konzept ist der zentrale Punkt der Frage ... Hastur vor 5 Jahren 0
@Hastur Auf meiner gar nicht neuen Maschine beträgt SHA-1 ~ 490 MB / s pro Kern (mindestens pro OpenSSL). In allen 4 Kernen sind das fast 2 GB / s. Ich denke, ob es sich lohnt, hängt ganz davon ab, wie viel die Daten wert sind. Es ist ein "peinlich parallelisierbares" Problem, so dass Sie (z. B.) ganz einfach die gesamte Rechenleistung von Amazon EC2 (usw.) kaufen können. Wenn ein c5large mindestens so schnell ist wie meine nicht so neue Maschine, dann sind es bei aktuellen Spot-Preisen weniger als 50 US-Dollar, um es in einer Stunde erledigen zu lassen. derobert vor 5 Jahren 0
Ich kann Ihnen nicht mehr zustimmen, was die "peinlich parallelisierbare" _-Problematik betrifft. IMHO der beste Ansatz ohne die rar-Informationen besteht darin, die Variable sha1 mit dem ersten Block der Datei (linear) zu aktualisieren, die Permutationen der 4 Bytes zu generieren, die Variablen von sha1 zu erhöhen, sie eindeutig zu ordnen und mit dem zweiten Block fortzufahren. Bei der rar-Info kommt es darauf an, dass, wenn es sich um Daten und Header handelt, diese neu aufgebaut werden müssen (aber nicht in den Permutationen mindestens 1 Byte zählen soll, wenn nicht alle) ... dann wenn der rar-Block (in dem die Korruption ist) is) Suche nach dem richtigen CRC dann sha1. Hastur vor 5 Jahren 0