binärer Zugriff auf die Festplatte

Hallo Leute!

Ich habe diese Frage schon in .NET gestellt, aber da ist das wohl nicht so einfach. Ich versuche ein Programm zu schreiben, das dafür sorgt, dass man gelöschte Dateien nicht mehr wiederherstellen kann.

Das müsste funktionieren, indem man alle Bits auf der Festplatte, die zum Überschreiben zugelassen sind (auf denen also keine existierenden Dateien gespeichert sind, aber zum Beispiel gelöschte) mit 0 überschreibe. So kann nichts mehr ausgelesen werden, außer „00000000…“. Dieses Programm könnte man regelmäßig über den Rechner laufen lassen, damit das, was mit - wahrscheinlich mit guten Grund - gelöscht hat auch für immer gelöscht bleibt.

Ich suche dazu eine Möglichkeit direkt auf die einzelnen Bits auf der Festplatte zuzugreifen. Ich bin an Anregungen für alle Programmiersprachen interessiert. Ich versuche Assembler zu vermeiden, aber auch hier bin ich an allem interessiert, was ihr habt.

Danke!

Das müsste funktionieren, indem man alle Bits auf der
Festplatte, die zum Überschreiben zugelassen sind (auf denen
also keine existierenden Dateien gespeichert sind, aber zum
Beispiel gelöschte) mit 0 überschreibe. So kann nichts mehr
ausgelesen werden, außer „00000000…“. Dieses Programm könnte
man regelmäßig über den Rechner laufen lassen, damit das, was
mit - wahrscheinlich mit guten Grund - gelöscht hat auch für
immer gelöscht bleibt.

Hallo Alexander,

zum Problem selbst kann ich leider nix sagen.

Aber zum Thema Löschen evtl. einen Hinweis geben. Die Idee mit Nullen zu überschreiben reicht bei Normalusern aus.

Schon vor Jahrzehnten war aber ein amerikanischer Mindeststandard vom Militär oder sonstwas so, daß zu löschende Bytes mindestens dreimal mit einer Zufallskombination aus Null und EinserBits überschrieben werden müssen, erst dann galt das als einigermaßen sicher gelöscht.

Da sich in all den Jahren auch die Fähigkeiten, vermeintlich gelöschte/überschriebene Bytes wieder zu lesen verbessert hat, würde ich mich da mal schlau machen was heutzutage als Minimumstandard fürs Löschen verlangt wird.

Gruß
Reinhard

Hi,

ich bin in dem Thema anscheinend noch nicht so bewandert, aber vielleicht weißt du ja, wo mein Fehler ist. Ich dachte, die einzige Möglichkeit, gelöschte Dateien auf der Festplatte wiederherzustellen, ist es, die zum überschreiben freigegebenen Bits einzeln durchzugehen und eventuell noch vollständig bestehende Dateien, zusammenzusetzen.

Wenn man die nun alle mit 0 überschreibt, wäre ja keine vollständig bestehende Datei mehr da. Gibt es denn tatsächlich eine Möglichkeit zu sagen, welchen Status ein Bit, dass jetzt z.B. 1 ist vorher hatte? Mit Softwaremethoden müsste das doch eigendlich unmöglich sein, es seih denn, ich habe eine komplett falsche Vorstellung von einer Festplatte…?

Moien

ich bin in dem Thema anscheinend noch nicht so bewandert, aber
vielleicht weißt du ja, wo mein Fehler ist. Ich dachte, die
einzige Möglichkeit, gelöschte Dateien auf der Festplatte
wiederherzustellen, ist es, die zum überschreiben
freigegebenen Bits einzeln durchzugehen und eventuell noch
vollständig bestehende Dateien, zusammenzusetzen.

Das Problem ist die Genauigkeit des Schreibkopfs. Der trifft die Spur nicht immer exakt und dreht die magnetischen Felder nicht immer vollständig. Wenn man nun sehr, sehr aufwendige Techniken benutzt (oder die Platte-Firmware hackt) kann man in der Theorie ein paar Lagen in die Vergangenheit sehen (Aus 1 wird 0.02 beim überschreiben mit 0. Aus 0.02 wird aber 0.0001. Kann ich nun zwischen 0.02 und 0.0001 unterscheiden so habe ich die erste Lage wieder hergestellt).

Zivile Retter wie Ontrack, Convar & Co werden diese Technik bei normalen Aufträgen nicht anwenden.

Zum Problem: direkt auf die Platte zugreifen hat einen kleinen Nachteil: man muss das Dateisystem kennen. Und Änderungen am System während dem Arbeiten muss man abfangen… Wesentlich einfacher ist es eine neue Datei an zu legen und solange 0 rein zu pumpen bis die Platte voll ist. Dann die Datei löschen.

cu

Hi Alex,

ich bin in dem Thema anscheinend noch nicht so bewandert, aber
vielleicht weißt du ja, wo mein Fehler ist. Ich dachte, die
einzige Möglichkeit, gelöschte Dateien auf der Festplatte
wiederherzustellen, ist es, die zum überschreiben
freigegebenen Bits einzeln durchzugehen und eventuell noch
vollständig bestehende Dateien, zusammenzusetzen.

sorry, mein lächerliches Wissen darüber ist stark veraltet, ich wußte noch wie das bei FAT formatierten Festplatten so einigermaßen abläuft mit der dateiverwaltung, bei NTFS oder was es sonst so gibt weiß ch nichts.

„damals“ bei FAT war es so, du löschst eine Datei, das bedeutet im Dateinmaen wirde der erste Buchstabe durch ein Fragezeichen ersetzt in der FAT-Liste.
Mehr wurde nicht gemacht, d.h. alle dateidaten waren/sind noch aif der Festplatte vorhanden.

Und diese FAT-Liste war irgendwie so (lang her) daß da der dateiname stand und die Byteadresse wo die datei beginnt auf der Festplatte.

Betriebssystembedingt ist es nun so, nehmen wir mal an die Festplatte wäre leer und du speicherst eine Datei ab die Bytes groß ist, so wird sie in den Adressen 1-1000 abgespeichert.
dann speicherst du eine andere Datei ab, so wird diese in die Adressen 1001 -2000 reingeschrieben.
Rufst du nun Datei1 auf und vergrößerst sie so wird der Überhang in 2001 bis 2000 +x reingeschrieben.

Die FAT-Liste sieht dann so aus:
Datei1 1
Datei2 1001

Rufst du nun Datei1 auf, so schaut das Betriebssystem in die FAT-Liste, findet den Namen Datei1 und hüpft zu der Adresse die da steht, also die 1, also das erste Byte der Festplatte, dann liest es alle nachfolgenden Bytes ein, solange bis da eine Bytefolge kommt die signalisiert hier ist die datei zu Ende.

Kommt da keine solche Bytefolge, dann kommt eine andere Bytefolge,die sagt, Datei ist noch nicht zu Ende, hüpf mal nach Adresse 2001, da geht die datei weiter.

Wenn du nun Datei1 löschst, so wird an dem Ganzen nicht viel geändert, es bleibt bestehen, einzig im Dateinamen in der FAT wird der erste Buchstabe durch ein Fragezeichen ersetzt, d.h. wenn du danach Datei1 aufrufst wird sie nicht gefunden.

Dateirettungsprogramme nach Löschungen gehen nun so vor, sie lesen die FAT aus und listen dir alle Einträge bei den Namen der Dateien auf, die vorne ein Fragezeichen haben.

Du gibst dann einen beliebigen Buchstaben ein, somit ist deine gelöschte Datei wiederhergestellt.

Das Ganze klappt natürlich nur, wenn zwischen dem Löschen der datei1 und dem Versuch sie wieder herzustellen, keine andere datei abgespeichert wurde, denn für das Betriebssystem ist z.B. jetzt der Adressplatz 1-100 frei, da ja Datei1 offiziell gelöscht ist, dann schreibt es ggfs. dort die Daten der neuen Datei rein, dann sind die Daten von Datei1 endgültig futsch.

Wenn man die nun alle mit 0 überschreibt, wäre ja keine
vollständig bestehende Datei mehr da. Gibt es denn tatsächlich
eine Möglichkeit zu sagen, welchen Status ein Bit, dass jetzt
z.B. 1 ist vorher hatte?

Ja, gibt es wohl, diese Bits sind keine Kästchen wo man eine 0 oder 1 reinschreibt, sondern es wird magnetisch etwas erzeugt was dann als 0 oder 1 gewertet wird.

Wenn man da quasi mit einer Lupe rangeht, kann man wohl erkennen was da vorher da stand, weil die Neumagnetisierung nicht in der exakt gleichen Zeichenposition geschah.

Ich stelle (hab da auch nicht die wahre Ahnung) so vor, du schreibst mit einer Schreibmaschine einen Brief.
Und es gibt ja Schreibmaschinen die haben auch das Feature, daß man geschrieben Buchstaben wieder löschen kann.

Nun willst du in dem Brief eine Zahl abändern, spannst also das Blatt genauso wie vorher in die Schreibmaschine ein, löschst die zahl und ersetzt sie durch eine andere.

Fürs Auge ist dann dies nicht sichtbar, aber mit einer Riesenlupe könntest du erkennen welche Zahl da vorher gestanden haben könnte, da die Schreibmaschine nicht so genau positioniern kann.

So in etwa stelle ich mir den Ablauf vor, wenn superteure Programme nicht die Festplatte über das Betriebssystem auslesen, sondern ganz genau hinschauen auf jedes magnetisierte Teilchen.

Aus diesem Grund wird halt empfohlen, an jeder Bitstelle mehrfach eine 0 oder 1 hinzuschreiben.

Ich hoffe ich war verständlich, weitergehendes Wissen dazu habe ich nicht :smile:

Gruß
Reinhard

Mit Softwaremethoden müsste das doch
eigendlich unmöglich sein, es seih denn, ich habe eine
komplett falsche Vorstellung von einer Festplatte…?

Danke, ihr beiden, jetzt habe ich eine etwas bessere Vorstellung von der Materie. Und die Idee mit der großen Datei ist gut!!

Aber eine Frage habe ich noch: Ist es denn mit Hilfe einer Programmiersprache theoretisch möglich, sich die äußere Beschaffenheit einer magnetischen Speicherzelle anzusehen? Eigendlich kann man da ja nur auf die offiziell vorhandenen Bits zugreifen, die auch VIRTUELL vorhanden sind - oder doch nicht?

Aber eine Frage habe ich noch: Ist es denn mit Hilfe einer
Programmiersprache theoretisch möglich, sich die äußere
Beschaffenheit einer magnetischen Speicherzelle anzusehen?
Eigendlich kann man da ja nur auf die offiziell vorhandenen
Bits zugreifen, die auch VIRTUELL vorhanden sind - oder doch
nicht?

Hi Alex,

mit den allgemein bekannten Programmiersprachen kommste da nicht weiter *denk*
Egal C, Vb, Pascal, Delphi u.v.m, die beruhen letztlich alle auf Assembler, also Bytes/Bits schreiben lesen.

Und Assembler erkennt nicht ob das Bit vorher eine 0oder 1 war.

Zum „Auslesen“ der magnetschicht mag es wohl Möglichkeiten geben, aber da kenne ich nix mit Namen.

Tipp: Bastle erstmal ein Programm daß alle „unbenutzen“ Bytes/Bits einer Festplatte überschreibt, laß das mehrfach durchlaufen mit unterschiedlichen Bit-Werten.
Dann kann man da m.E. nichts wieder herstellen, aber ich kenne die Möglichkeiten vom CIA und sonstigen Mafiafirmen nicht.

Gruß
Reinhard

Gruß
Reinhard

Moien

Aber eine Frage habe ich noch: Ist es denn mit Hilfe einer
Programmiersprache theoretisch möglich, sich die äußere
Beschaffenheit einer magnetischen Speicherzelle anzusehen?

Das ist so eine „ja, aber“ Sache. Man kann wohl die meisten Platten zum auslesen dieser Daten missbrauchen. Aber dazu muss man die API der Firmware kennen. Und die sollte von Hersteller zu Hersteller unterschiedlich sein und fällt unter Betriebsgeheimniss. Man müsste die Plattenfirmware auslesen (JTAG), decompilieren, das Assembler-listing verstehen. Dann alle Verbindungen auf dem Board nachmessen. Und evtl. noch die Firmware umbauen und zurück spielen.

Wenn du dich gut mit Microcontrollern und Assembler auskennst sollte das in 6-9 Monaten machbar sein.

cu

Was hier nicht bedacht wird ist, daß das sozusgen ‚Dienste‘ sind, die ihr benutzt. Einen Schreib-/Lesezugriff macht letztendlich das Betriebssystem und ihr stoßt es sozusagen nur an (z.B.: Betriebsystem, schreibe bitte in diesen oder jenen Sector, dieses oder jenes Byte). Wie es das macht, habt ihr nicht unbedingt den Finger drauf. Genauswenig, wie das Betriebsystem nur den Festplattencontroller ‚bittet‘ do bitte mal hier oder da was hinzuschreiben und ihr auch nicht unbedingt beeinflussen könnt, wie er das macht.
Windows und Unix Betriebssysteme geben den Platz den gelöschte Dateien einnehmen einfach wieder als freien Platz frei, daß heißt ein Überschreiben passiert ja nach dem, wie stark die Platte frequentiert ist nach einiger Zeit von allein. Der Einzige noch brauchbare Vorschlag, der für den über-paranoiden Heimanwender vielleicht noch taugt, ist nach dem Löschen, den Rest der Platte solange mit einer Datei vollzuschreiben, bis diese komplett belegt ist. Alles ander, mit Festplatten Firmware hacken etc. ist einfach fern aller Skalen, was die paar Daten angeht, die ein Heimanwender auf der Festplatte hat.

Hallo Alex,

Ich versuche ein Programm zu schreiben,
das dafür sorgt, dass man gelöschte Dateien nicht mehr
wiederherstellen kann.

Das müsste funktionieren, indem man alle Bits auf der
Festplatte
mit 0 überschreibe.

Nimm eine beliebige Linux-Distri und setze wechselweise die Befehle

dd if=/dev/urandom of=/dev/hda
dd if=/dev/zero of=/dev/hda

ab. Der erste Befehl überschreibt die erste Festplatte mit Pseudo-Zufallszahlen, der zweite mit Nullen. Praktischerweise das ganze in eine Schleife mit n Wiederholungen einpacken (n steht im direkten Verhältnis zur Paranoia), für /dev/hda deine Festplatte einsetzen, also z.B. /dev/sda für ne SATA-Platte (die erste, /dev/sdb wäre die zweite usw.)
Varianten davon kannst Du dir hier ansehen:
http://de.wikipedia.org/wiki/Dd_%28Unix%29

Viele Grüße
Marvin