it-swarm.com.de

Einige Bytes automatisch brachial erzwingen, um eine beschädigte Datei wiederherzustellen

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 daran interessiert sind, enthält 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.

 Screenshot One

 Screenshot Two

Der Beispieloffset, auf den ich mich konzentriere, ist 0x78, wobei das erste Bild den Wert als CA anzeigt. Ich möchte, dass das Skript den Wert um 1 erhöht, damit er zu CB wird, wie im zweiten Bild gezeigt. Ich möchte, dass es den Wert um 1 erhöht und dann jedes Mal die gesamte Datei SHA-1 vergleicht. Nehmen Sie nur Änderungen an diesen 4 Bytes am angegebenen Offset vor.

Es wird CAC5C58A versuchen und den SHA-1 vergleichen. Wenn dies nicht zutrifft, wird CBC5C58A versucht. Wenn der erste Wert FF erreicht, wird zu 00C6C58A gewechselt und so weiter. Grundsätzlich möchte ich, dass es in der Lage ist, von 00000000-FFFFFFFF zu gehen, aber auch die Option zu haben, zu wählen, wo es beginnen und enden soll. 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.

34
Sbt19

Hier ist ein kleines Python-Programm, das genau 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 {0}'.format(seq))
        break
else:
    print('no success')

Un Nur kurz getestet; Bitte pingen Sie mich an, wenn Sie Tippfehler finden.

Die base gibt an, wo die vier Bytes angewendet werden sollen, und der lange String '996873... ist die hexadezimale Darstellung des erwarteten SHA1. Die Zeile for seq in... definiert die zu versuchenden Bytes. und natürlich 'binaryfile' durch 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 wie for seq in itertools.product(range(256), repeat=4)): durchläuft alle möglichen Werte von 0 bis 232-1. (Dann müssen Sie import itertools oben hinzufügen.) Oder Sie können einfach einen Versatz hinzufügen. Aktualisieren Sie das Skript, um den aktuellen for seq in durch den folgenden zu ersetzen (wobei die import vor dem Hauptprogramm stehen 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 es natürlich von 0x8AC5C5CA zu 0x8AC5C5CB inkrementiert wird, aber dann ist das nächste Inkrement 0x8AC5C5CC usw. Die struct-Magie besteht darin, dies in eine Folge von Bytes zu konvertieren (musste es von https nachschlagen://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

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) in rge den gesamten Raum zwischen 0x00000000 und 0xFFFFFFFF abdecken, wenn Sie wirklich alles untersuchen möchten. (Beachten Sie auch hier, dass der Bereich das last byte inkrementiert und dass seq die Bytes des Werts entsprechend Ihren angegebenen Anforderungen in umgekehrter Reihenfolge anwendet.)

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.

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:]
27
tripleee

Nein, nein, nein und wieder NEIN!

Selten erhalten Sie eine Antwort, die nicht Ihren Erwartungen entspricht.

Einige Fragen an Sie:

  • Ist es möglich, dass ein Experte nicht weiß, dass es möglich ist, eine Zeichenfolge für Bytes zu erzwingen und den SHA-1 iterativ zu testen, bis er konvergiert? Nein
  • Ist es möglich, dass er es vergisst? Nein
  • Ist es möglich, dass Sie dies für eine rar-Datei nicht tun können? Nein
  • Ist die andere Antwort falsch? absolutNEIN

Na und? ... Zeit.

Der Punkt ist, dass Sie so wenige Bytes ändern müssen ... nur 4!

Was bedeutet das? 2564 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) ...
Sie sollten 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 gespeichert 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 sollten Sie eine positive Antwort in der Hälfte der Zeit haben . 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 als "nicht möglich in einer LOHNENDEN Zeitspanne" klingt.


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 Sie zu einer schnelleren Lösung führen.
    Sie sagten, es sei 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 prü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.

4
Hastur