DAta REScue dares 0.6

(C) 2002 Oliver Diedrich odi@ct.heise.de
(C) 2005 c't Magazin für Computertechnik, Heise Zeitschriften Verlag

Das Progranmm und alle Quellcodedateien stehen unter der GNU General Public License (GPL), siehe www.gnu.org

Diese Software ergänzt einen c't-Artikel:

Hardald Bögeholz, Oliver Diedrich: Silberpuzzle, Daten von beschädigten CDs und DVDs retten, c't 16/05, S. 78.

Dort finden Sie weitere Informationen zum Thema "Daten retten von optischen Medien".


Was es tut
-----------

Dares durchsucht ein CD-/DVD-Image oder eine CD/DVD nach Dateien. Das funktioniert auch mit beschädigten CDs und DVDs, auf die das Betriebssystem nicht mehr zugreifen kann. Dares kann auch mit Images und Datenträgern umgehen, bei denen die Verwaltungsstrukturen des Dateisystems (ISO-9660 oder UDF) beschädigt sind. Die Software ist speziell auf die Zusammenarbeit mit H2cdimage ausgelegt, einem Programm, das Images auch von massiv beschädigten optischen Medien erstellt (ftp://ftp.heise.de/pub/ct/ctsi/h2cdimage.zip).


Wie es arbeitet
----------------

Wie jedes Dateisystem enthält das CD- und DVD-Dateisystem ISO 9660 neben Dateien Metainformationen, die beschreiben, wo auf dem Datenträger eine Datei gespeichert ist. Sind diese Verwaltungsstrukturen beispielsweise durch einen kleinen Kratzer beschädigt, sieht das Betriebssystem keine Dateien mehr, obwohl noch alle Daten vorhanden sein können. Das ist ungefähr so, als hätte man seine Schätze im Wald vergraben und dann den Lageplan verbummelt: Weil ein kleines Stück Papier fehlt, ist alles verloren -- es sei denn, man gräbt den ganzen Wald um.

Dares tut genau das und kratzt alle auffindbaren Dateien von einem beliebig kaputtem CD- oder DVD-Image oder Datenträger. Nach Verwaltungsinformationen sucht Dares gar nicht erst; stattdessen scannt es das Image systematisch von Anfang bis Ende und prüft, ob irgendwo eine Datei beginnt. Dazu bedient es sich der Magic-Library, die auch das Unix-Programm file zur Bestimmung des Dateityps nutzt. File schließt anhand des Anfangs einer Datei auf deren Inhalt und nutzt dazu so genannte "magic numbers", typische Kennbytes zu Beginn einer Datei.

Zwei Eigenschaften von ISO-9660 machen das Graben nach den Daten recht erfolgversprechend. Zum einen beginnen Dateien immer am Start eines Sektors: Man muss nur alle 2048 Bytes testen, ob hier eine Datei beginnt. Zum anderen kennt ISO-9660 keine Fragmentierung: Ist eine Datei größer als die 2**KByte Sektorgröße, belegt sie entsprechend mehr aufeinanderfolgende Sektoren. Schwieriger ist es, das Ende einer Datei zu erkennen. Die naheliegende Idee, jeden weiteren Sektor darauf zu testen, ob dort eine neue Datei beginnt, führt zu vielen Fehlerkennungen (und damit unvollständigen Dateien): Bei über 1500 Dateitypen der Magic-Bibliothek ist die Wahrscheinlichkeit, mitten in einer Datei den vermeintlichen Anfang einer anderen Datei zu entdecken, gar nicht so gering. Ein MS-DOS-Programm beispielsweise ist durch ein "MZ" am Dateianfang gekennzeichnet; und diese Zeichenfolge kann durchaus auch außerhalb eines DOS-Programms vorkommen, mit ein bisschen Pech auch mal auf einem Sektoranfang.

Dares prüft daher jeden einer Datei zugeordneten Sektor darauf, ob er das Ende der Datei enthalten könnte. Ausgangspunkt ist die Überlegung, dass die Größe der wenigsten Dateien ein exaktes Vielfaches von 2048 ist: Meist ist der letzte Sektor nicht vollständig belegt. Bei ISO 9660 sind diese Sektoren mit Nullen aufgefüllt. Endet ein Sektor also mit Nullen, spricht das für ein Dateiende. Das Programm unterscheidet dabei zwischen Text- und Binärdateien: In Textdateien kann kein Nullbyte vorkommen, in Binärdaten schon. Entsprechend genügt bei Textdateien eine Null, um auf das Dateiende zu erkennen, während bei einer Binärdatei mehrere Nullen am Sektorende nötig sind, wobei zudem der nächste Sektor nicht mit einem Nullbyte beginnen darf (das spricht eher dafür, dass die Sektorgrenze zufällig in einem Block von Nullbytes gelandet ist).


Wie man es benutzt
-------------------

Nach Auspacken des Archivs startet man das Programm im Verzeichnis dares-0.6.5 mit der Anweisung

./bin/dares  (Textmodus)

oder 

./bin/qtdares  (Version mit Qt-GUI).

Voraussetzung ist, dass die libmagic installiert ist -- sie ist bei Bestandteil des Programmpakets file. Die Qt-Version benötigt Qt 3, die Textmodus-Version ncurses.

Das Programm versteht die folgenden Kommandozeilenoptionen:

dares -i Image -s Verzeichnis [-h2i h2i-Datei] [-a] [-m] [-l Log-Datei]

-i:   CD-/DVD-Image oder CD-/DVD-Device
-s:   Verzeichnis, in dem die geretteten Dateien gespeichert werden
-h2i: h2i-Datei zum Image (erzeugt von H2cdimage)
-a:   alle gefundenen Dateien ohne Rückfrage speichern
-m:   Mime Types an Stelle einer ausführlichen Beschreibung verwenden
-l:   Log-Datei (Default: dares.log)

Beispiel: dares -i cdrom.image -s /tmp

Die Konsolenversion dares benötigt mindestens die Parameter -i und -s; qtdares erfragt die nötigen Angaben in einer Dialogbox, wenn sie nicht auf der Kommandozeile angegeben sind.

Das Programm durchsucht zunächst das Image oder den Datenträger und gibt dabei aus, wie viele Blöcke (à 2048 Byte) bislang durchsucht und wie viele Dateien gefunden wurden. Wenn sich die wiederherzustellenden Dateien am Anfang des Image befinden, lässt sich Dares mit Strg-C abbrechen und zeigt dann die bis dahin gefundenen Dateien an.

Nach Abschluss der Suche erscheint eine Liste mit den gefundenen Dateitypen. Das kann (bei Auswahl von Mime Types) ungefähr so aussehen:

found 210 files of 12 different types
----------------------------------------------------------------------
<text> text/html (91/98; 968 KByte)
<text> text/plain; charset=us-ascii (29/31; 426 KByte)
<bin>  image/gif (31/31; 59 KByte)
<text> application/x-shellscript (15/15; 44 MByte)
<bin>  application/x-gzip (11/11; 6 MByte)
<bin>  application/x-debian-package (11/11; 1840 KByte)
<text> text/plain; charset=iso-8859-1 (7/8; 727 KByte)
<bin>  application/x-dosexec (4/4; 1466 KByte)
<text> text/PGP armored data  signed message (3/3; 2 KByte)
<bin>  image/jpeg (2/2; 218 KByte)
<text> application/x-perl (1/1; 3 KByte)
<bin>  image/bmp (0/1; 32 KByte)

Qtdares zeigt diese Liste als Baum an, mit allen Dateien eines Dateityps unter dem jeweiligen Typ eingeordnet. <text> oder <bin> gibt an, ob es sich um eine Textdatei (HTML-Code, ASCII-Text, Skript und so weiter) oder um eine Binärdatei (JPEG-Dateien, komprimierte Archive, Programme, MS-Office-Dokumente etc.) handelt. In Klammern ist bei jedem Dateityp angegeben, wie viele (vermutlich) heile Dateien und wie viele Dateien insgesamt dieses Types gefunden wurden. Unvollständig können Dateien beispielsweise sein, wenn Teile des Datenträgers nicht gelesen werden konnten. Zudem steht bei jedem Dateityp, wie viele Byte die Dateien dieses Typs insgesamt belegen. Bei Auswahl einer Datei wird ihr Inhalt im rechten Teil des Fensters angezeigt.

In Dares verwenden Sie die Pfeil-hoch- und Pfeil-runter-Tasten, um einen Dateityp auszuwählen, und drücken die Taste 'd', Return oder Pfeil rechts, um eine Liste aller Dateien dieses Typs zu sehen. Dares zeigt nun einen zweigeteilten Bildschirm: In der oberen Hälfte sehen Sie die Liste der Dateien des ausgewählten Typs, in der unteren -- nach Auswahl einer Datei mit den Pfeiltasten und Drücken von 'd', Enter oder Pfeil rechts -- den Anfang der ausgewählten Datei, bei binären Datentypen als Hexdump:


image/gif (31)                                     <d>isplay <s>ave <q>uit
--------------------------------------------------------------------------
   1     2682:    825  Byte
   2     2683:   1352  Byte
   3     2684:    378  Byte
   4     2685:   1622  Byte
   5     2686:    288  Byte
   6     2687:    215  Byte
   7     2688:    347  Byte
   8     2689:    383  Byte
--------------------------------------------------------------------------
0000  47 49 46 38 39 61 F4 01  90 01 80 01 00 00 00 00  GIF89a..  ........
0010  00 00 00 21 F9 04 01 00  00 01 00 2C 00 00 00 00  ...!....  ...,....
0020  F4 01 90 01 00 02 FF 84  8F A9 CB ED 0F A3 9C B4  ........  ........
0030  DA 8B B3 DE BC FB 0F 86  E2 98 04 E6 89 A6 EA CA  ........  ........
0040  B6 EE 0B C7 F2 4C D7 F6  8D E7 FA CE F7 FE 0F 0C  .....L..  ........
0050  0A 87 27 00 F1 88 4C 2A  97 CC A6 F3 09 8D 4A 53  ..'...L*  ......JS
0060  C6 A9 F5 8A CD 6A B7 DC  AE B7 F8 0D 8B C7 E4 B2  .....j..  ........
0070  37 CF F3 FC BE FF 0F C8  B3 17 48 58 68 78 78 37  7.......  ..HXhxx7

Zurück zur Liste der Dateitypen kommt man mit 'q' oder Pfeil links.

Die einzelnen Dateien sind sortiert nach der Nummer des 2-KByte-Blocks, auf dem sie beginnen. Über diese Blocknummer lässt sie sich auch in der Log-Datei identifizieren, die alle erkannten Dateien in der Reihenfolge nach Blocknummern sortiert enthält.

Eine ausgewählte Datei lässt sich in Dares mit der Taste 's', in Qtdares mit Strg-S oder über das Kontextmenü sichern. In Qtdares ist es möglich, mehrere Dateien geichzeitig auszuwählen und mit Strg-A zu sichern. Die Ncurses-Version für die Konsole verfügt lediglich über die Möglichkeiten, entweder alle Dateien (Kommandozeilenoption -a) oder jede Datei einzeln zu sichern. Die Originalnamen der Dateien sind ohne Verwaltungsinformationen nicht rekonstruierbar; Dares benennt die Dateien nah dem Muster Blocknummer-Dateityp.[bin|text].

Strg-V ruft in Qtdares einen Viewer auf, an den die ausgewählte Datei übergeben wird. Dabei erscheint ein Dialog, in dem der Name des Programms einzugeben ist, beispielsweise gimp zur Anzeige von JPEG- und anderen Bilddateien. 'q' bzw. Strg-Q beendet das Programm.


Wenn das Ergebnis nicht überzeugt
----------------------------------

Die Heuristik zum Erkennen von Dateianfang und -ende kann natürlich fehlschlagen: Auf Video-DVDs beispielsweise sind die Videostreams typischerweise in Dateien von exakt einem GByte Größe zerhackt, die somit genau auf einer Sektorgrenze enden. Dares hängt dann die einzelnen Videodateien direkt aneinander. Abspielen lassen sie sich problemlos, allerdings können sie größer als 4 GByte werden und lassen sich dann nicht mehr auf FAT-Laufwerken speichern.

Umgekehrt beginnen AVI-Dateien typischerweise mit einem Header, der mit Nullbytes auf eine Größe von exakt 6**KByte aufgefüllt wird. Anschließend beginnen die Videodaten, die nicht mit Null beginnnen. Resultat: Für Dares endet die AVI-Datei nach dem Header, die eigentlichen Daten ordnet es einer neuen Datei zu. In einem solchen Fall findet man in der Log-Datei, in der Dares während der Suche alle gefundenen Dateien einträgt (dares.log), welcher Datei die Videodaten zugeordnet wurden -- häufig ist es eine Datei vom Typ data oder dem Mime Type "application/octet stream". Sind beide Dateien gespeichert, lassen sie sich mit cat aneinanderhängen. Alternativ kann man dd benutzen, um anhand der Informationen in der Log-Datei die Datei in der richtigen Größe aus dem Image zu extrahieren.

Natürlich kann es vorkommen, dass die gesuchte Datei, möglicherweise auch schon ihr Dateityp, nicht in der Liste auftaucht. In diesem Fall muss man mit der integrierten Dateivorschau und den externen Viewern in Qtdares die Liste der gefundenen Dateien durchsuchen, ob die Zieldatei vielleicht falsch erkannt wurde. Es kann sich lohnen, sowohl einen Durchlauf mit Mime Types (Option -m) als auch einen mit den ausführlichen Dateitypen zu starten: Die beiden Magic-Libraries unterscheiden sich etwas.

Da die ausführlichen Beschreibungen die Dateitypen sehr viel detaillierter aufgliedern als die Mime Types (bei Bilddateien kann der Dateityp Informationen über die Größe enthalten, bei Archivdateien über den Inhalt etc.), liefern die als Default verwendeten ausführlichen Dateitypen mehr Informationen über die Dateien. Allerdings wird man gelegentlich viele ähnliche Dateitypen mit nur wenigen Dateien finden, etwa bei zahlreichen GIF-Dateien unterschiedlicher Größe, die jede einen eigenen Typ bilden. Mit Mime Types wird man daher in vielen Fällen einen übersichtlicheren Dateibaum enthalten.

Weiß man, welche Dateitypen auf dem beschädigten Datenträger gespeichert waren, kann man die Dateien magic und magic.mime entsprechend anpassen und sie auf die erwarteten Dateitypen beschränken. Das vermeidet Fehlerkennungen. Dares versucht, die Signaturdatei magic[.mime] im aktuellen Verzeichnis zu lesen und gibt eine Warnung aus, wenn das nicht gelingt. In diesem Fall kommen die eingebauten Standardsignaturen zum EInsatz.
