![]() |
Re: File Eraser programmieren
Achso...Verstehe. Ohne mich zu fragen, tss... Als nächstes veröffentlicht er noch meine Klasse...Tsss...
Obwohl, die ist ja eh sch****, hat Matze mir gesagt, ich soll ja alles am besten vergessen. Sollte ich wirklich gaaanz schnell tun. |
Re: File Eraser programmieren
Da meine Variante eh mal als OpenSource auslaufen wird, kann ich dat hier ja ruhig mal zeigen ^^
Alao aktuell mach ich dat so:
Delphi-Quellcode:
Das meiste dürfte ja selbsterklärend sein, von den Namen her.
Type TDelFlags = Set of (cdfOverride1, cdfOverride3, cdfOverride7, cdfOverride15, cdfOverride31,
cdfSplit, cdfSplitLarge, cdfFileTable); // cdfFileTable do not use on Win NT file system. Const cdfDefault = [cdfOverride7 {, cdfFileTable}]; cdfDefaultLarge = [cdfOverride1, cdfSplitLarge {, cdfFileTable}]; Function ClearAndDeleteFile(FileName: WideString; Flags: TDelFlags = cdfDefault): ByteBool; Var Handle: THandle; Len, LF: TLargeIntRec; DecSize, BufSize, i, i2: LongInt; Buffer: PLongWordArray; Begin Result := False; FileName := _ExpandFileName(FileName); Handle := CreateFileW(Pointer(FileName), amGenericWrite or amGenericRead, amFileShareRead or amFileShareWrite or amFileShareDelete, nil, cdOpenExisting, 0, 0); If Handle = InvalidHandle Then Exit; Buffer := nil; Try Len.Lo := GetFileSize(Handle, @Len.Hi); If Len.Org = InvalidFileSizeLI Then Exit; If (Len.Hi = 0) and (Len.Lo <= $00A00000) Then BufSize := Len.Lo shr 2 Else BufSize := $00280000; Buffer := Memory.Get((BufSize + 1) shl 2); Memory.Fill1(Buffer, BufSize shl 2, LongWord(_Random(-1))); If cdfOverride31 in Flags Then i := 31 Else If cdfOverride15 in Flags Then i := 15 Else If cdfOverride7 in Flags Then i := 7 Else If cdfOverride1 in Flags Then i := 1 Else i := 3; For i := i downto 0 do Begin For i2 := BufSize - 1 downto 0 do Buffer^[i2] := Buffer^[i2] xor LongWord(_Random(-1)); i2 := BufSize shl 2 - _Random(BufSize); LF.Org := Len.Org; SetFilePointer(Handle, 0, nil, mmFileBegin); While LF.Org >= i2 do Begin WriteDataNE(Handle, Buffer, i2, nil, nil); Dec(LF.Org, i2); End; WriteDataNE(Handle, Buffer, LongInt(LF.Lo), nil, nil); FlushFileBuffers(Handle); End; If (cdfSplit in Flags) or (cdfSplitLarge in Flags) Then Begin DecSize := GetClusterSize(_ExtractFileDrive(FileName), 512); LF.Org := Len.Org; SetFilePointer(Handle, LF.Lo, @LF.Hi, mmFileBegin); If cdfSplitLarge in Flags Then Begin i := DecSize; While LF.Org > i do Begin Dec(LF.Org, i); SetFilePointer(Handle, -i, nil, mmFileCurrent); SetEndOfFile(Handle); FlushFileBuffers(Handle); i := DecSize + LF.Org shr 10; End End Else While LF.Org > DecSize do Begin Dec(LF.Org, DecSize); SetFilePointer(Handle, -DecSize, nil, mmFileCurrent); SetEndOfFile(Handle); FlushFileBuffers(Handle); End; End; SetFilePointer(Handle, 0, nil, mmFileBegin); SetEndOfFile(Handle); Finally Memory.Free(Pointer(Buffer)); CloseHandle(Handle); End; DeleteFileW(Pointer(FileName)); If cdfFileTable in Flags Then Begin For i := 0 to 99 do Begin FileName := WideString('CF') + WideChar(i div 10 or $30) + WideChar(i mod 10 or $30) + WideString('.FNSClearDir'); Handle := CreateFileW(Pointer(FileName), amGenericWrite, amFileShareRead or amFileShareWrite or amFileShareDelete, nil, cdCreateAlways, 0, 0); If Handle <> InvalidHandle Then CloseHandle(Handle); End; For i := 99 downto 0 do Begin FileName := WideString('CF') + WideChar(i div 10 or $30) + WideChar(i mod 10 or $30) + WideString('.FNSClearDir'); DeleteFileW(Pointer(FileName)); End; End; Result := True; End; - WriteDataNE entspricht dabei WriteFile (WinAPI incl. 'ner winzigen Fehlerbehandling) - Memory geht direkt an den MemoryManager in etwa kann man das so sehn: Memory.Get=GetMem, ... Ein Problem hab ich allerdings noch beim entfernen der Daten aus dem Verzeichnis. Bei den älteren Dateisystemen (FAT...) konnte man den Eintrag dadurch entfernen, daß man die Tabelle überfüllt hat. Leider führt NTFS 'ne Art LogBuch, oder wie man das nennen kann, wo ich bisher noch nicht weiß, wie ich da rannkomme, um den entsprechenden Eintrag entfernen zu können -.-'' Na ja, mal sehn ob jemand noch ein paar Tipps hat :angel2: |
Re: File Eraser programmieren
Zu diesen Thema gibt es im Forum schon Lösungen. Einfach mal suchen.
|
Re: File Eraser programmieren
Wie man was aus'm NTFS rausbekommt?
Hab bereits gesucht und nichts passendes entdeckt. Und nicht nur in der DP. |
Re: File Eraser programmieren
|
Re: File Eraser programmieren
Diese Beiträge kenn ich schon alle und haben mir nicht geholfen.
Die Daten der Datei bekomm ich schon "weg", nur eben bei NTFS nicht den Verweis darauf, also das, was innerhalb des übergeordneten Verzeichnisses steckt. Denn, wie gesagt, NTFS scheint 'ne Art Logbuch zu führen (Dateiumbenennungen, Dateilöschungen, und was es sonst noch gibt) und genau das bekomm ich nicht weg. |
Re: File Eraser programmieren
Hagen hat auch schonmal geschrieben, dass man mit den Methoden, die ihr bisher gerwähnt habt nur die Datei so löscht, wie sie gerade besteht. Aber die Datei kann ja auch mal größer gewesen sein als unmittelbar vor dem Löschvorgang, also liegen noch in irgendwelchen Sektoren auf der Platte Restinhalte der Originaldatei rum und warten darauf, gefunden zu werden.
|
Re: File Eraser programmieren
Jupp, und das bekommt man nur weg, indem man die leeren Sektoren und das ungenutzte Sektoenteil am Ende jeder Datei "sicher" löscht.
Außerdem müßte man noch jede vorhande Datei "sicher löschen" und danach den Dateiinhalt wieder herstelllen, damit auch hinter den vorhandenen Daten die Restmagnetisierung zerstört wird ... |
Re: File Eraser programmieren
WinAPI? Assembler?
|
Re: File Eraser programmieren
Zitat:
Es ist sozusagen ein Ding der Unmöglichkeit, Daten unwiederbringlich zu löschen (ohne Hammer :mrgreen:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz