Luens93 (23.10.2013)
-
22.10.2013, 19:05 #11
- Registriert seit
- 15.11.2011
- Beiträge
- 8.141
- Blog Entries
- 5
Thanked 9.418 Times in 3.254 PostsAW: Programm schreiben um Festplatte zu löschen
So einfach ist das nicht. Um eine Festplatte sicher zu löschen müsste er die einzelnen Cluster direkt ansprechen können um sie mit Nullen zu überschreiben. So lange da ein OS drauf läuft kann das schon mal nicht funktionieren. Das wäre vergleichbar mit dem Versuch einen Teppich wegzuziehen auf dem du stehst.
Für dein Vorhaben müsstest du eine eigene kleine Linux-Distri entwickeln, die anstelle des Betriebssystems gestartet wird. Gearbeitet wird da mit C, C++ und wenn Modifikationen am Kernel erforderlich sein sollten ggf. auch Asm. Wir reden hier also nicht von ein paar Stunden Codingarbeit. Darik's Boot And Nuke | Hard Drive Disk Wipe and Data Clearing ist im Prinzip das was du vor hast, kannst dir ja mal anschauen.
Daher würde ich empfehlen dir ein anderes Projekt rauszusuchen. Wenn du C# Kentnisse hast entwickel doch Windows-Anwendungen und festige/erweitere damit dein Wissen. Nützliche Software ist immer gerne gesehen, speziell für Entwickler haben wir hierfür auch eine Downloadbase.
-
The Following User Says Thank You to DMW007 For This Useful Post:
-
22.10.2013, 19:19 #12
AW: Programm schreiben um Festplatte zu löschen
CreateFile function (Windows)
INFO: Direct Drive Access Under Win32
Sollte sowas sein, oder sehe ich das falsch?
-
23.10.2013, 12:51 #13
- Registriert seit
- 02.01.2013
- Beiträge
- 879
Thanked 458 Times in 313 PostsAW: Programm schreiben um Festplatte zu löschen
Nein, das ist völlig richtig.
Das ist übrigens auch in C# nutzbar, etwa so:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
int dwFlagsAndAttributes,
IntPtr hTemplateFile);
Anschließend kann der Low-Level Access dann so stattfinden:
IntPtr hDrive = CreateFile(
string.Format("\\\\.\\{0}:", DriveLetter)
GenericRead,
Read | Write,
IntPtr.Zero,
OpenExisting,
0,
IntPtr.Zero);
Mit der API-Funktion SetFilePointer setzt man den Startsektor, in ReadFile bzw. WriteFile gibt man dann noch die Zahl der Sektoren an, die geschrieben/gelesen werden sollen.
Eine ganze Festplatte so auf Null zu setzen sollte damit kein größeres Problem darstellen (solange DriveLetter > 0, d.h man nicht die Platte nimmt, auf der das OS läuft)... SetFilePointer setzt man auf 0, und in WriteFile gibt man als Anzahl der Sektoren die Gesamtzahl der Sektoren der Platte an.
Schwieriger wird das ganze, wenn man einzelne Dateien gründlich löschen will. Dann muss man sich unbedingt schlaumachen über die Art der Organisation der Daten auf der Platte. Das fängt bei Bootsektoren, Master Boot Record an, geht über Partitionen bis zu den verschiedenen Dateisystemen (NTFS, FAT32 usw.) und ihrem Aufbau. Das muß man alles verstanden haben, bevor man die Sektoren auf der Platte finden kann, die tatsächlich zu einer bestimmten Datei gehören.
Mir kam mal ein Programm unter, welches eine ganz interessante Art der Speicherung von Registrierungsdaten hatte. Die wurden einfach auf die Platte in den letzten Sektor einer Datei geschrieben, aber nicht mehr IN die Datei, sondern dahinter. D.h. wenn eine Datei nicht ein Vielfaches der Sektorgröße der Platte (war damals 512 Byte) hat, dann sind im letzten für die Datei reservierten Sektor nicht alle Bytes von der Datei belegt. Dateien können immer nur komplette Sektoren reservieren. Das machte sich das Programm zunutze. Ich weiß leider nicht mehr, durch welche Win32-Calls das genau bewerkstelligt wurde, aber ich will damit sagen: Es geht unter Windows problemlos, ganz filigran auf bestimmte Sektoren zuzugreifen. Nicht zuletzt die kommerziellen Dateieraserprogramme zeigen dies ja, die erfordern ja auch nicht irgendwelche Linuxtricksereien.Geändert von freulein (23.10.2013 um 12:59 Uhr)
-
The Following User Says Thank You to freulein For This Useful Post:
Luens93 (23.10.2013)
-
24.10.2013, 13:42 #14
- Registriert seit
- 15.11.2011
- Beiträge
- 8.141
- Blog Entries
- 5
Thanked 9.418 Times in 3.254 PostsAW: Programm schreiben um Festplatte zu löschen
Er will die Festplatte eines Laptops formatieren, der nur einen Festplattenschacht hat. Die Systempartition müsste also zwangsläufig ebenfalls formatiert werden. Somit führt für dieses Vorhaben kein Weg an einem externen Betriebssystem vorbei, das zb von einem USB-Stick gestartet wird. Dazu hab ich im letzten Post ja schon was geschrieben.
-
24.10.2013, 13:46 #15
-
-
24.10.2013, 14:08 #16
- Registriert seit
- 15.11.2011
- Beiträge
- 8.141
- Blog Entries
- 5
Thanked 9.418 Times in 3.254 PostsAW: Programm schreiben um Festplatte zu löschen
Seh grad den Post hab ich irgendwie total übersehen und in dem anderen war von nem alten Laptop an dem er das testen will die Rede. Sorry mein Fehler, damit geht mein erster Beitrag natürlich großteils auch an der eigentlichen Frage vorbei.
Wenns um externe Medien geht ist das ganze deutlich einfacher und du kannst problemlos mit C# arbeiten. Theoretisch musst du nicht mal auf die einzelnen Sektoren direkt zugreifen. Es dürfte reichen, wenn du alle Daten auf der Platte löscht und sie anschließend komplett mit Dateien befüllst die aus Nullen bestehen. Dann hast du am Ende auch alle Sektoren überschrieben.
Wenns dir ums Lernen und Verständnis geht würde ichs aber lieber mit freuleins Ansatz machen, der dürfte nicht nur sauberer sondern auch performanter sein. Rekursiv alles auf der Platte zu löschen, die Platte mit Schrottdaten zu füllen und anschließend wieder alles zu löschen ist für jemanden der ein kleines bisschen Erfahrung hat auch keine Herausforderung.
-
24.10.2013, 21:04 #17
- Registriert seit
- 02.01.2013
- Beiträge
- 879
Thanked 458 Times in 313 PostsAW: Programm schreiben um Festplatte zu löschen
So ganz einfach wäre dieser Ansatz nicht. Eine Festplatte besteht ja nicht nur aus dem Platz, der für Dateien genutzt wird, sondern auch z.B. dem Platz, der für Directories genutzt wird, sowie dem Platz, der für Partitioninfos genutzt wird usw. Platz, der für Directories genutzt wird, kann man nicht mit Dateidaten füllen, sondern nur mit Dateimetadaten, d.h. mit Daten über Dateien. Sichergehen, daß alle vorher vorhandenen Daten (Dateilisten) dort überschrieben werden, kann man nur, indem man entweder Directories löscht, oder die Directories mit der Maximalanzahl von Dateien füllt, die in die Sektoren passen, die das Directory (verkettete Sektoren) benutzt. Das ist alles nicht ganz einfach zu errechnen. Da ist es wirklich viel einfacher, die Sektorenanzahl n der Festplatte festzustellen, und dann (Pseudocode):
buffer[sektorgröße] mit 0 füllen.
for i = 0 to (n-1)
Schreibe buffer auf Sektor i der Platte
next i
Fertig.
Einfacher gehts nicht.Geändert von freulein (24.10.2013 um 21:22 Uhr)
-
The Following User Says Thank You to freulein For This Useful Post:
DMW007 (26.10.2013)
Ähnliche Themen
-
Festplatte Daten sicher Löschen
Von 2Good4You im Forum SoftwareAntworten: 5Letzter Beitrag: 07.03.2013, 11:20 -
Daten von Festplatte auf neue Festplatte übertragen?
Von Xin Zhao im Forum HardwareAntworten: 1Letzter Beitrag: 27.10.2012, 20:23 -
Programm, das anzeigt wieviel gb im Ordner -> Programm
Von Xin Zhao im Forum WindowsAntworten: 4Letzter Beitrag: 19.08.2012, 14:34 -
WinVista Festplatte löschen.
Von Waka Flocka im Forum WindowsAntworten: 8Letzter Beitrag: 19.04.2012, 14:28 -
Wie Bot schreiben
Von SYN-SYN/ACK-ACK im Forum Knuddels ProgrammierungAntworten: 12Letzter Beitrag: 09.06.2011, 21:56
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.