Truecrypt Partitionen wiederherstellen

Note to english speaking people: if you think this article could be useful for getting your data back, leave a message in the comments and I will find time to translate this article.

Hallo, mein letzter Beitrag ist ja nun schon wieder über ein Jahr her, dafür hab ich diesmal auch wieder was (hoffentlich) nützliches für euch 😉
Vor anderthalb Wochen wollte ich an meinem Laptop eine neue Partition erstellen und Windows hat sich stattdessen entschieden, die davor und dahinter liegenden Partitionen stattdessen zu löschen. Dumm nur, dass diese mit Truecrypt gesichert waren und daher von konventionellen Datenrettungsprogrammen nicht gefunden werden können (Die Partitionen haben keine generelle Header, sie sind nach dem Löschen nicht von Datenmüll zu unterscheiden).
Ich werde hier aufführen, welche Schritte ich durchgeführt habe, um wieder an meine Daten zu kommen.

Kurzer Disclaimer: Die Rettung hat bei mir funktioniert, natürlich gibt es keine Garantie, dass das bei euch auch so funktioniert. Und wenns nicht funktionieren sollte: nehmt das Backup, dass ihr hoffentlich gemacht habt (nicht so, wie ich *hüstel*) 😉
So, nun aber mal anfangen. So sah die Partition von meinem Windows nach dem Malheur in grober Partitionierung etwa aus:

partitionierungUm den mittleren Bereich, welcher über 650GB „RAW“ angezeigt wird, geht es hier. Die Partition erstmal ignorieren, die hatte ich schon zur Zeit der Rettung angelegt, ich erkläre gleich, warum. Stellt euch erstmal vor, dass in diesem Bereich alles frei war. Ich hatte dort am Anfang des freien Bereichs eine Datenpartition von ca. 480GB und am Ende eine Mailpartition von ca. 20GB.
So, wie fängt man an? Was ihr braucht: Platz für ein Image der kompletten Festplatte, das macht die Arbeit leichter, man kann dann nämlich auf dem Image arbeiten oder auf der Festplatte. Ohne Image arbeitet man aber ohne Netz und doppeltem Boden, ein Fehler und die Daten sind für IMMER weg.
Deswegen habe ich unter Linux ein Image der kompletten Platte erstellt. Dafür braucht ihr mindestens soviel Platz an einem Stück, wie die Platte groß ist, im Idealfall nochmal soviel für ein Backup vom Image (so, dass man immer eine „nicht angefasste“ Situation in der Hinterhand hat).
Dies geht mit dem „dd“-Befehl, der dann folgendermaßen aussieht:

dd if=/dev/sda of=/path/to/backup.img

Damit hat man jetzt also schonmal ein Backup für alle Fälle.
So, jetzt geht es an die Datenrettung. Ihr seid deutlich im Vorteil, wenn ihr in etwa wisst, wo die Partitionen gelegen haben und wie groß sie in etwa waren. Ich hatte das Glück, die Größen noch im Total Commander rauszuschreiben, sie waren: 479.325.948 KB für die Daten und 20.589.308 KB für die Mailpartition.
Außerdem wusste ich, dass ich die Datenpartition am Anfang des freien Bereichs angelegt hatte.
Die Partitionstabelle meiner Platte sah bis dahin so aus (Leerzeilen wegen Formatierung entfernt):

Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x629b5b14

Device   Boot Start End Blocks Id System
/dev/sda1 2048 22290431 11144192 27 Hidden NTFS WinRE
/dev/sda2 * 22290432 22495231 102400 7 HPFS/NTFS/exFAT
/dev/sda3 22495232 379396095 178450432 7 HPFS/NTFS/exFAT
/dev/sda4 379396096 1953523711 787063808 5 Extended
/dev/sda5 1752037376 1953523711 100743168 7 HPFS/NTFS/exFAT

Man erkennt, dass am Anfang der erweiterten Partition (sda4) ab Sektor 379.396.096 bis Sektor 1.752.037.376 (sda5) keine Partition definiert ist.
Jetzt half mir zum ersten Mal das Wissen, dass die erste Partition am Anfang des freien Speichers lag. Ich habe also unter Ubuntu mit fdisk eine neue Partition erstellt (direkt auf der Festplatte, also nicht im Image), welche den kompletten freien Bereich umspannte. Dann hab ich ausprobiert, ob die Partition von Truecrypt unter Windows gemountet werden konnte. Aus dieser Situation ist der oben verlinkte Screenshot entstanden. Die Idee war goldrichtig, ich konnte die Datenpartition mounten und einen Großteil meiner Daten schonmal in Sicherheit bringen.
Kleine Anmerkung: Ubuntu hat die Partition ab Sektor 379.398.144 beginnen lassen, was 2048 Sektoren über dem Startsektor der erweiterten Partition liegt. Warum genau, das weiß ich nicht, tippe aber darauf, dass dort die Partitionsinformationen über die logischen Partitionen abgelegt werden.
So, damit hatte ich also schonmal meine Daten, jetzt ging es an die deutlich wichtigere Partition, die Mails. Ich hatte keine Ahnung, wo der Startsektor liegt, nur, wie groß sie in Etwa war und wo sich der Endsektor in Etwa befindet. Der Plan war jetzt, auf dem Image zu arbeiten, einen Startsektor zu berechnen, das Image per Loopback zu mounten und gucken, ob man das per Truecrypt mounten kann. Wenn nicht, neuen Sektor berechnen und das Spiel von vorne angehen. Am Ende werde ich kurz auf einen Rechenfehler eingehen, welcher mich 2 Tage Suche gekostet hat. Nach Behebung dessen hatte ich meine Mails in 5 Minuten wieder 😉
Als erstes brauchen wir die Größe meiner Partition in Bytes (das Loopbackdevice erwartet einen Offset in Bytes).
Dazu die vom Total Commander bekannte KB Größe mit 1024 multiplizieren, das Ergebnis lautet: 20.589.308 * 1024 = 21.083.451.392 Bytes.
Jetzt brauchen wir die Bytezahl vom Endsektor des freien Bereichs.
Die nötigen Informationen können wir dem Auszug der Partitionstabelle oben und der Partitionsgröße in KB entnehmen. Aus der Partitionstabelle lässt sich erkennen, dass die Sektorgröße 512 Bytes beträgt.
Der letzte Sektor wurde oben schon erwähnt. Diesen mit der Anzahl Bytes pro Sektor multipliziert ergibt das letzte Byte des freien Bereichs:
1.752.037.375 * 512 = 897.043.136.000
Der letzte Sektor endet auf -375, da der erste Sektor der nächsten Partition -376 lautet. Nur um Verwirrung zu vermeiden 🙂
Man kann aber auch den ersten Sektor der nächsten Partition nehmen, das macht im Endeffekt nichts, man muss dann nur beim Suchen einen Sektor weiter suchen, das ist kein Aufwand.
So, jetzt muss man noch die Partitionsgröße vom Endsektor abziehen und man hat den Sektor, hinter dem die Partition auf keinen Fall beginnen kann:
897.043.136.000 – 21.083.451.392 = 875.959.684.608
Zum Prüfen der Sektoren habe ich ein kleines Script geschrieben, welches das zu verwendende Loopbackdevice übernimmt (ich habe in verschiedene Richtungen gesucht, daher verschiedene Loopbackdevices) und das Startbyte.
Das Script sieht folgendermaßen aus:

#!/bin/bash
offset=$1
loopdevice=$2
while :
do
echo teste offset $offset
losetup -o $offset /dev/$loopdevice /platten/Software/Backup\ Rechner/backup_1tb
truecrypt /dev/$loopdevice /mnt -p ********** -k "" --protect-hidden=no --non-interactive
if [ $? -eq 0 ]; then
ls -la /mnt
echo startbyte korrekt\: $offset
truecrypt -d /dev/mnt
losetup -d /dev/$loopdevice
break
fi
truecrypt -d /dev/$loopdevice
losetup -d /dev/$loopdevice
sleep 0.1
offset=$(( $offset - 512 ))
done

So, was macht das Script?
In den ersten beiden Zeilen werden die Argumente übernommen, das Offset als erstes und das Loopbackdevice als zweites.
Danach wird eine Endlos-While-Schleife durchlaufen (das Script dauert lang genug, um das in Ruhe zu kontrollieren und abzubrechen, ich hab mir daher eine Abbruchbedingung gespart. Sauber ist das nicht, aber naja 😉 ).
In der While-Schleife wird das angegebene Loopbackdevice mit dem angegebenen Offset initialisiert, danach wird versucht, das Loopbackdevice mit Truecrypt zu mounten. Die Sternchen müssen das Passwort sein, wenn dort Sonderzeichen drin vorkommen, müssen diese so escaped werden, dass die Bash damit umgehen kann. Was den Dateinamen angeht: das ist das Image, das solltet ihr natürlich entsprechend anpassen.
Mit der If-Bedingung wird geprüft, ob das Mounten erfolgreich war, wenn ja, das Startbyte ausgegeben und die Dateien (damit man gleich kontrollieren kann, ob die richtige Partition gemountet wurde). Wenn das Mounten erfolglos war, wird der Offset ausgegeben, die Partition ausgehangen, eine kurze Pause gemacht (War nötig, da das Loopbackdevice ein bisschen Zeit braucht) und dann das Offset um die Sektorgröße (512 Bytes) verringert.
Mit diesem Script habe ich so ca. 5GB pro Tag durchsuchen können.
Wäre deutlich schneller gegangen, wenn ich am Anfang richtig gerechnet hätte 😉
Am Ende habe ich damit aber die Partition gefunden.
Zum Test, ob das Script überhaupt was findet, kann man folgendes machen: Ich wusste, wo der Startsektor für die Datenpartition liegt. Einfach eine gewisse Anzahl Sektoren danach als Offset eintragen, die Partition wird sofort gefunden:
379.398.144 + 2.048 = 379.400.192
In Bytes: 194.252.898.304
Hier mal der erste Aufruf: „./tctest 194252898304 loop0“.

So, hier nochmal mein „alter“ Rechenweg, der zu der tagelangen Suche führte:
– Größe der Mailpartition in KB: 20.589.308
– Abzug dieser Zahl von der „letzter freier Sektor“ Zahl 1.752.037.375
– Resultat: 1.752.037.375 – 20.589.308 = 1.731.448.067
– In Bytes: 1.731.448.067 * 512 = 886501410304
Hier lag mein Denkfehler: Zusammenschmeißen von Bytes und Sektoren. Der korrekte Sektor wäre gewesen: 20.589.308 KB * 1024 = 21.083.451.392 Bytes
Dividiert durch 512 Bytes / Sektor ergibt: 21.083.451.392 / 512 = 41.178.616 Sektoren
Abzug dieser Zahl: 1.752.037.375 – 41.178.616 = 1.710.858.759
In Bytes: 1.710.858.759 * 512 = 875.959.684.608
Vergleich mit dem errechneten Sektor oben: 875.959.684.608. Passt doch 😉
Ich habe also durch das Eintragen von 20M Sektoren ziemlich genau in der Mitte der Mailpartition angefangen zu suchen. Natürlich wäre ich auch mit der Arbeitsweise irgendwann auf den richtigen Sektor gekommen, nur mit dem richtigen Sektor funktioniert es deutlich schneller 😉

Dieser Beitrag wurde unter Allgemein veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.