{"id":162,"date":"2013-06-11T23:47:40","date_gmt":"2013-06-11T21:47:40","guid":{"rendered":"http:\/\/ferrari2k.dyndns.org\/blog\/?p=162"},"modified":"2013-06-12T00:29:53","modified_gmt":"2013-06-11T22:29:53","slug":"truecrypt-partitionen-wiederherstellen","status":"publish","type":"post","link":"https:\/\/ferrari2k.spdns.org\/blog\/?p=162","title":{"rendered":"Truecrypt Partitionen wiederherstellen"},"content":{"rendered":"<p><strong>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.<\/strong><\/p>\n<p>Hallo, mein letzter Beitrag ist ja nun schon wieder \u00fcber ein Jahr her, daf\u00fcr hab ich diesmal auch wieder was (hoffentlich) n\u00fctzliches f\u00fcr euch \ud83d\ude09<br \/>\nVor 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\u00f6schen. Dumm nur, dass diese mit Truecrypt gesichert waren und daher von konventionellen Datenrettungsprogrammen nicht gefunden werden k\u00f6nnen (Die Partitionen haben keine generelle Header, sie sind nach dem L\u00f6schen nicht von Datenm\u00fcll zu unterscheiden).<br \/>\nIch werde hier auff\u00fchren, welche Schritte ich durchgef\u00fchrt habe, um wieder an meine Daten zu kommen.<\/p>\n<p>Kurzer Disclaimer: Die Rettung hat bei mir funktioniert, nat\u00fcrlich 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\u00fcstel*) \ud83d\ude09<!--more--><br \/>\nSo, nun aber mal anfangen. So sah die Partition von meinem Windows nach dem Malheur in grober Partitionierung etwa aus:<\/p>\n<p><a href=\"http:\/\/ferrari2k.dyndns.org\/blog\/wp-content\/uploads\/2013\/06\/partitionierung.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-164\" alt=\"partitionierung\" src=\"http:\/\/ferrari2k.dyndns.org\/blog\/wp-content\/uploads\/2013\/06\/partitionierung-1024x71.png\" width=\"640\" height=\"44\" srcset=\"https:\/\/ferrari2k.spdns.org\/blog\/wp-content\/uploads\/2013\/06\/partitionierung-1024x71.png 1024w, https:\/\/ferrari2k.spdns.org\/blog\/wp-content\/uploads\/2013\/06\/partitionierung-300x20.png 300w, https:\/\/ferrari2k.spdns.org\/blog\/wp-content\/uploads\/2013\/06\/partitionierung.png 1449w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a>Um den mittleren Bereich, welcher \u00fcber 650GB &#8222;RAW&#8220; angezeigt wird, geht es hier. Die Partition erstmal ignorieren, die hatte ich schon zur Zeit der Rettung angelegt, ich erkl\u00e4re 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.<br \/>\nSo, wie f\u00e4ngt man an? Was ihr braucht: Platz f\u00fcr ein Image der kompletten Festplatte, das macht die Arbeit leichter, man kann dann n\u00e4mlich 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\u00fcr IMMER weg.<br \/>\nDeswegen habe ich unter Linux ein Image der kompletten Platte erstellt. Daf\u00fcr braucht ihr mindestens soviel Platz an einem St\u00fcck, wie die Platte gro\u00df ist, im Idealfall nochmal soviel f\u00fcr ein Backup vom Image (so, dass man immer eine &#8222;nicht angefasste&#8220; Situation in der Hinterhand hat).<br \/>\nDies geht mit dem &#8222;dd&#8220;-Befehl, der dann folgenderma\u00dfen aussieht:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ndd if=\/dev\/sda of=\/path\/to\/backup.img\r\n<\/pre>\n<p>Damit hat man jetzt also schonmal ein Backup f\u00fcr alle F\u00e4lle.<br \/>\nSo, jetzt geht es an die Datenrettung. Ihr seid deutlich im Vorteil, wenn ihr in etwa wisst, wo die Partitionen gelegen haben und wie gro\u00df sie in etwa waren. Ich hatte das Gl\u00fcck, die Gr\u00f6\u00dfen noch im Total Commander rauszuschreiben, sie waren: 479.325.948 KB f\u00fcr die Daten und 20.589.308 KB f\u00fcr die Mailpartition.<br \/>\nAu\u00dferdem wusste ich, dass ich die Datenpartition am Anfang des freien Bereichs angelegt hatte.<br \/>\nDie Partitionstabelle meiner Platte sah bis dahin so aus (Leerzeilen wegen Formatierung entfernt):<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nCommand (m for help): p\r\n\r\nDisk \/dev\/sda: 1000.2 GB, 1000204886016 bytes\r\n255 heads, 63 sectors\/track, 121601 cylinders, total 1953525168 sectors\r\nUnits = sectors of 1 * 512 = 512 bytes\r\nSector size (logical\/physical): 512 bytes \/ 512 bytes\r\nI\/O size (minimum\/optimal): 512 bytes \/ 512 bytes\r\nDisk identifier: 0x629b5b14\r\n\r\nDevice \u00a0 Boot Start End Blocks Id System\r\n\/dev\/sda1 2048 22290431 11144192 27 Hidden NTFS WinRE\r\n\/dev\/sda2 * 22290432 22495231 102400 7 HPFS\/NTFS\/exFAT\r\n\/dev\/sda3 22495232 379396095 178450432 7 HPFS\/NTFS\/exFAT\r\n\/dev\/sda4 379396096 1953523711 787063808 5 Extended\r\n\/dev\/sda5 1752037376 1953523711 100743168 7 HPFS\/NTFS\/exFAT\r\n<\/pre>\n<p>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.<br \/>\nJetzt 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\u00dfteil meiner Daten schonmal in Sicherheit bringen.<br \/>\nKleine Anmerkung: Ubuntu hat die Partition ab Sektor 379.398.144 beginnen lassen, was 2048 Sektoren \u00fcber dem Startsektor der erweiterten Partition liegt. Warum genau, das wei\u00df ich nicht, tippe aber darauf, dass dort die Partitionsinformationen \u00fcber die logischen Partitionen abgelegt werden.<br \/>\nSo, 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\u00df 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 \ud83d\ude09<br \/>\nAls erstes brauchen wir die Gr\u00f6\u00dfe meiner Partition in Bytes (das Loopbackdevice erwartet einen Offset in Bytes).<br \/>\nDazu die vom Total Commander bekannte KB Gr\u00f6\u00dfe mit 1024 multiplizieren, das Ergebnis lautet: 20.589.308 * 1024 = 21.083.451.392 Bytes.<br \/>\nJetzt brauchen wir die Bytezahl vom Endsektor des freien Bereichs.<br \/>\nDie n\u00f6tigen Informationen k\u00f6nnen wir dem Auszug der Partitionstabelle oben und der Partitionsgr\u00f6\u00dfe in KB entnehmen. Aus der Partitionstabelle l\u00e4sst sich erkennen, dass die Sektorgr\u00f6\u00dfe 512 Bytes betr\u00e4gt.<br \/>\nDer letzte Sektor wurde oben schon erw\u00e4hnt. Diesen mit der Anzahl Bytes pro Sektor multipliziert ergibt das letzte Byte des freien Bereichs:<br \/>\n1.752.037.375 * 512 =\u00a0897.043.136.000<br \/>\nDer letzte Sektor endet auf -375, da der erste Sektor der n\u00e4chsten Partition -376 lautet. Nur um Verwirrung zu vermeiden \ud83d\ude42<br \/>\nMan kann aber auch den ersten Sektor der n\u00e4chsten Partition nehmen, das macht im Endeffekt nichts, man muss dann nur beim Suchen einen Sektor weiter suchen, das ist kein Aufwand.<br \/>\nSo, jetzt muss man noch die Partitionsgr\u00f6\u00dfe vom Endsektor abziehen und man hat den Sektor, hinter dem die Partition auf keinen Fall beginnen kann:<br \/>\n897.043.136.000 &#8211; 21.083.451.392 =\u00a0875.959.684.608<br \/>\nZum Pr\u00fcfen der Sektoren habe ich ein kleines Script geschrieben, welches das zu verwendende Loopbackdevice \u00fcbernimmt (ich habe in verschiedene Richtungen gesucht, daher verschiedene Loopbackdevices) und das Startbyte.<br \/>\nDas Script sieht folgenderma\u00dfen aus:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\noffset=$1\r\nloopdevice=$2\r\nwhile :\r\ndo\r\necho teste offset $offset\r\nlosetup -o $offset \/dev\/$loopdevice \/platten\/Software\/Backup\\ Rechner\/backup_1tb\r\ntruecrypt \/dev\/$loopdevice \/mnt -p ********** -k &quot;&quot; --protect-hidden=no --non-interactive\r\nif &#x5B; $? -eq 0 ]; then\r\nls -la \/mnt\r\necho startbyte korrekt\\: $offset\r\ntruecrypt -d \/dev\/mnt\r\nlosetup -d \/dev\/$loopdevice\r\nbreak\r\nfi\r\ntruecrypt -d \/dev\/$loopdevice\r\nlosetup -d \/dev\/$loopdevice\r\nsleep 0.1\r\noffset=$(( $offset - 512 ))\r\ndone\r\n<\/pre>\n<p>So, was macht das Script?<br \/>\nIn den ersten beiden Zeilen werden die Argumente \u00fcbernommen, das Offset als erstes und das Loopbackdevice als zweites.<br \/>\nDanach 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 \ud83d\ude09 ).<br \/>\nIn der While-Schleife wird das angegebene Loopbackdevice mit dem angegebenen Offset initialisiert, danach wird versucht, das Loopbackdevice mit Truecrypt zu mounten. Die Sternchen m\u00fcssen das Passwort sein, wenn dort Sonderzeichen drin vorkommen, m\u00fcssen diese so escaped werden, dass die Bash damit umgehen kann. Was den Dateinamen angeht: das ist das Image, das solltet ihr nat\u00fcrlich entsprechend anpassen.<br \/>\nMit der If-Bedingung wird gepr\u00fcft, 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\u00f6tig, da das Loopbackdevice ein bisschen Zeit braucht) und dann das Offset um die Sektorgr\u00f6\u00dfe (512 Bytes) verringert.<br \/>\nMit diesem Script habe ich so ca. 5GB pro Tag durchsuchen k\u00f6nnen.<br \/>\nW\u00e4re deutlich schneller gegangen, wenn ich am Anfang richtig gerechnet h\u00e4tte \ud83d\ude09<br \/>\nAm Ende habe ich damit aber die Partition gefunden.<br \/>\nZum Test, ob das Script \u00fcberhaupt was findet, kann man folgendes machen: Ich wusste, wo der Startsektor f\u00fcr die Datenpartition liegt. Einfach eine gewisse Anzahl Sektoren danach als Offset eintragen, die Partition wird sofort gefunden:<br \/>\n379.398.144 + 2.048 = 379.400.192<br \/>\nIn Bytes:\u00a0194.252.898.304<br \/>\nHier mal der erste Aufruf: &#8222;.\/tctest 194252898304 loop0&#8220;.<\/p>\n<p>So, hier nochmal mein &#8222;alter&#8220; Rechenweg, der zu der tagelangen Suche f\u00fchrte:<br \/>\n&#8211; Gr\u00f6\u00dfe der Mailpartition in KB: 20.589.308<br \/>\n&#8211; Abzug dieser Zahl von der &#8222;letzter freier Sektor&#8220; Zahl 1.752.037.375<br \/>\n&#8211; Resultat: 1.752.037.375 &#8211; 20.589.308 = 1.731.448.067<br \/>\n&#8211; In Bytes: 1.731.448.067 * 512 = 886501410304<br \/>\nHier lag mein Denkfehler: Zusammenschmei\u00dfen von Bytes und Sektoren. Der korrekte Sektor w\u00e4re gewesen: 20.589.308 KB * 1024 = 21.083.451.392 Bytes<br \/>\nDividiert durch 512 Bytes \/ Sektor ergibt: 21.083.451.392 \/ 512 = 41.178.616 Sektoren<br \/>\nAbzug dieser Zahl: 1.752.037.375 &#8211; 41.178.616 =\u00a01.710.858.759<br \/>\nIn Bytes: 1.710.858.759 * 512 =\u00a0875.959.684.608<br \/>\nVergleich mit dem errechneten Sektor oben: 875.959.684.608. Passt doch \ud83d\ude09<br \/>\nIch habe also durch das Eintragen von 20M Sektoren ziemlich genau in der Mitte der Mailpartition angefangen zu suchen. Nat\u00fcrlich w\u00e4re ich auch mit der Arbeitsweise irgendwann auf den richtigen Sektor gekommen, nur mit dem richtigen Sektor funktioniert es deutlich schneller \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 &hellip; <a href=\"https:\/\/ferrari2k.spdns.org\/blog\/?p=162\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-162","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=162"}],"version-history":[{"count":15,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/162\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/162\/revisions\/173"}],"wp:attachment":[{"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ferrari2k.spdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}