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 dem Auspacken des Archivs müssen sich die Dateien dares.exe,
hs_regex.dll, magic und magic.mime alle im selben Verzeichnis
befinden. Starten Sie nun dares.exe.

Starten Sie das Programm von der Kommandozeile aus, versteht es
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

Ansonsten erfragt Dares die nötigen Angaben in einer Dialogbox
nach dem Start.

Das Programm durchsucht zunächst das Image. Dieser Prozess kann
je nach Größe des Image mehrere Minuten dauern; Dares gibt in
dieser Zeit leider keine Fortschrittsmeldungen aus.

Nach Abschluss der Suche zeigt Dares einen Baum mit allen
gefundenen Dateien an, sortiert nach ihren Dateitypen. <text>
oder <bin> beim Dateityp gibt an, ob es sich um Textdateien
(HTML-Code, ASCII-Text, Skript und so weiter) oder um
Binärdateien (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 Anfang im rechten Teil
des Fensters angezeigt, bei binären Dateitypen als Hexdump.

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 dares.log identifizieren,
die alle erkannten Dateien in der Reihenfolge nach Blocknummern
sortiert enthält.

Eine ausgewählte Datei lässt sich in Dares mit Strg-S oder über
das Kontextmenü sichern. Es ist es möglich, mehrere Dateien
geichzeitig auszuwählen und mit Strg-A 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 einen Viewer auf, an den die ausgewählte Datei
übergeben wird. Dabei erscheint ein Dialog, in dem der Name des
Programms einzugeben ist, beispielsweise notepad zur Anzeige von
Textdateien. 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 nach dem
Speichern aneinanderhängen. Alternativ kann man anhand der
Informationen in der Log-Datei die Datei in der richtigen Größe
aus dem Image 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.
