![]() |
Abbruch beim Shreddern
Ich bin dabei, mir eine Prozedur zum Dateischreddern zu schreiben.
Bei kurzen Dateien funktioniert das auch einwandfrei. Aber bei langen Dateien bricht das Programm direkt nach der Prozedur ab.
Delphi-Quellcode:
Durch auskommentieren (siehe oben) habe ich herausgefunden, dass allein schon das Lesen (ReadBytes) für den Abbruch verantwortlich ist.
type
TFileData = array[DWord] of Byte; TAnyFile = file of byte; ... procedure shred(fn:string); var data: TFileData; l: DWord; f: TAnyFile; procedure ReadBytes; var i: DWord; begin System.Reset(f); i := Low(i); while not (eof(f) or (i=High(i))) do begin System.Read(f,Data[i]); Inc(i); end; l := i; ShowMessage(IntToStr(l)); i := Low(i); System.Close(f); end; procedure StoreBytes; var i: DWord; begin System.Reset(f); for i := Low(i) to l do System.Write(f,Data[i]); System.Close(f); end; procedure Pass1; var i: DWord; begin for i := Low(i) to l do Data[i] := Data[i] or $B4; end; procedure Pass2; var i: DWord; begin for i := Low(i) to l do Data[i] := Data[i] and $2D; end; procedure Pass3; var i: DWord; begin for i := Low(i) to l do Data[i] := Data[i] xor $67; end; procedure Pass4; var i: DWord; begin for i := Low(i) to l do Data[i] := Data[i] or $ED; end; begin ShowMessage('0'); ChDir(DirToWin(dir)); ShowMessage('1'); System.Assign(f,fn); ShowMessage('2'); ReadBytes; ShowMessage('3'); { Pass1;StoreBytes; ShowMessage('4'); Pass2;StoreBytes; ShowMessage('5'); Pass3;StoreBytes; ShowMessage('6'); Pass4;StoreBytes; ShowMessage('7'); } end; Auch den Aufruf habe ich durch ShowMessage-Aufrufe gepolstert, daher weiß ich, dass direkt nach Aufruf der Prozedur abgebrochen wird:
Delphi-Quellcode:
Warum bricht das Programm bei langen Dateien ab und bei kurzen nicht?
ShowMessage('-1');
shred(p[1]); // Hier wird abgebrochen ShowMessage('8'); |
Re: Abbruch beim Shreddern
Wie viel Arbeitsspeicher belegt dein Datentyp TFileData? :cyclops:
|
Re: Abbruch beim Shreddern
Was bezweckst du mit dieser Funktion? :shock: Ich hoffe du bist dir bewusst das diese Funktion nicht dazu führt das man die Daten nicht wieder herstellen kann.
|
Re: Abbruch beim Shreddern
Hier mal ein abgewandelter Auszug aus einem ähnlichen Programm von mir:
Delphi-Quellcode:
Übrigens würde mich interessieren, weshalb du Bit-Operationen verwendest, anstatt die Daten einfach mit völlig anderen Werten zu überschrieben.
type
TShredder = class private FBuffer: packed array[0..$20000 div sizeof(integer)] of integer; public constructor Create; function ShredderFile(Name: string): Boolean; end; constructor TShredder.Create; begin randomize; end; procedure TShredder.GenerateRandomBuffer; var i: Integer; begin for i := 0 to High(FBuffer) do FBuffer[i] := random(maxint); end; function TShredder.ShredderFile(Name: string): Boolean; var LFileStream: TFileStream; LWriteCount: integer; begin Result := False; LFileStream := TFileStream.Create(Name,fmCreate); try LFileStream.Position := 0; while LFileStream.Position < LFileStream.Size-1 do begin LWriteCount := min(length(FBuffer), LFileStream.Size-LfileStream.Position); LFileStream.Write(FBuffer[0],LWriteCount); GenerateRandomBuffer; end; Result := True; finally LFileStream.Free; end; end; |
Re: Abbruch beim Shreddern
Such einfach mal im Forum nach
![]() ![]() ![]() Dann wirst du viele Codes finden, welche sogar funktionieren (ja, auch einen alten Code von mir ... also bevor ich es besser wußte) Aber im Endefekt ist das bei heutiger Hardware eh alles sinnlos. Überschreib die Datei einfach nur einmal mit 0-en und fertig isses. Abgesehn davon hast du eh Probleme: Was ist mit alten Daten (Kopien des Dateisystems) der Datei, welche z.B. durch die Defragmentierung entstanden sind oder alten Versionen der Datei? Die Daten kann man schon seit Jahren nicht wieder herstellen, wenn sie EINMAL überschrieben wurden. Und wenn dann ist das einfach nur Aberglaube und der Geschäftssinn von Leuten, welche anderen unwissenden Leuten irgendwas verkaufen wollen. PS:
Delphi-Quellcode:
Low(i) = MinInt = minus 2 Millonen
for i := Low(i) to l do
du meinst vermutlich 1 to L außerdem ist der Byteweise Zugriff etwas Ineffektiv und Lazarus schaff es ein 4 GB-Array auf den Stack zu legen? Array[DWord] of Byte = Array[Low(DWord)..High(DWord)] of Byte = 4 GB abgesehn davon, daß du die ganze Datei erstmal in einen RAM kopierst, was (abgesehn von dem eh schon zugroßem Array, welches nicht möglich sein sollte und bei Verwendung eines dynamischen Arrays in Dateigröße) ein bissl viel sein könnte ... also bei (sehr) großen Dateien |
Re: Abbruch beim Shreddern
@SirThornberry: Das ist ja der Sinn am Shreddern :roll:
@NemenLozer: Warum soll ich den Zufallsgenerator anstrengen, wenn ich doch sowieso Daten voraliegen habe, die nach ein paar Bitoperationen ja auch unbrauchbar sind -> immer 139 @Apollonius: 4.294.967.296 B = 4 GB - shit meinen gesamten Arbeitsspeicher - das war das Problem. Danke! @himitsu: ja, das Arbeitsspeicherproblem wäre jetzt geklärt. das ich größere Dateien in mehreren Blöcken buffern muss, weiß ich natürlich auch, aber das ganze wäre noch dazugekommen. Wenn du mal hinguckst, siehst du, dass die Datei nicht einmal gelöscht wird, woran man erkennen kann, das noch alles unvollständig ist. Übrigens ist i vorzeichenlos, Low(i) ist also gleich 0 ;-) Als Lösung habe ich jetzt jedes DWord durch ein einfaches Word ersetzt. (nur noch 64 KB) Jetzt läuft es. |
Re: Abbruch beim Shreddern
Zitat:
Denn ich hat der Zufallsgenerator einige Vorteile, z.B. weil du dann nur einen Durchgang brauchst -> höhere Geschwindigkeit, geringere Belastung der Festplatte |
Re: Abbruch beim Shreddern
@Implementation: Für mich klingt "Daten schreddern" danach das du willst das man sie NICHT mehr lesen kann. Und genau das habe ich auch oben geschrieben:
Zitat:
= "das diese Funktion dazu führt" + "das man die Daten wieder herstellen kann" Im Klartext. Nach Aufruf deiner Funktion kann man die Daten noch herstellen. @himitsu: Bitte verbreite das weiter :mrgreen: Deine Quellen würden mich sehr interessieren. |
Re: Abbruch beim Shreddern
Zitat:
Mehrfaches Schreiben bringt absolut nix oder nenn mir einen Ort, wo die Daten noch gepeichert sein sollen, do daß mehrfaches Schreiben dort hinkommt und ein Einmaliges nicht. Festplatten enthalten so kleine Strukturen, daß die angeblich difundierenden Magnetfelder praktisch garnicht existieren und sich maximal für einzelne Bits auslesen lassen, da durch die entsprechenden Verfahren benachbarte Bytes/Sectoren unwiederuflich zerstört werden. Und USB-Sticks oder andere Speicherchips haben soein verhalten überhaupt nicht. Zitat:
nja OK aber um dein Vorhaben zu lindern: OK, selbst wenn du mehrfach mit diesen Funktionen schreibst, landet dennoch nicht alles davon und wenn dann maximal die abschließende 139 auf der Festplatte, denn du schreibst die Daten nur in die WindowsFileCache und diese schreibt es nicht sofort auf die Festplatte :zwinker: In meinem Shredder wurde wenigstens die WFC umgangen, dazu wurde noch versucht die Einträge im Dateisystem etwas unbrauchbar zu machen Aber gegen die Datenkopien im Dateisystem geht keiner der hier in der DP vorgestellten ShredderCodes vor. Denn dafür muß man auch noch alle "freien" Bereiche der festplatte überschreiben, da ja keiner eine Ahnung hat, ob/wo Kopien vorhanden sind. Zitat:
Falls ich irgendwann mal Zeit hab meinen Dateisystem-Editor fertigzustellen und auch noch zu veröffentlichen, dann wird da ein "funktionierender" Shredder enthalten sein, welcher die Datei mit einmal Nullen überschreibt (reicht, wie gesagt, vollkommen aus) es ist einfach nur Zeitverschwendung, mehrmals zu schreiben, abgesehn davon, daß man theoretisch die Lebensdauer (maximale Schreibzyklen) von Datenträgern sinnlos herabsetzt. Und was wwas wichtiger ist, es wird auch das Dateisystem von den zugehörigen Daten befreit und auch der "ungenutze" Speicher bereinigt. |
Re: Abbruch beim Shreddern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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