Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abbruch beim Shreddern (https://www.delphipraxis.net/139515-abbruch-beim-shreddern.html)

implementation 30. Aug 2009 14:58


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:
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;
Durch auskommentieren (siehe oben) habe ich herausgefunden, dass allein schon das Lesen (ReadBytes) für den Abbruch verantwortlich ist.
Auch den Aufruf habe ich durch ShowMessage-Aufrufe gepolstert, daher weiß ich, dass direkt nach Aufruf der Prozedur abgebrochen wird:
Delphi-Quellcode:
ShowMessage('-1');
shred(p[1]);
 // Hier wird abgebrochen
ShowMessage('8');
Warum bricht das Programm bei langen Dateien ab und bei kurzen nicht?

Apollonius 30. Aug 2009 15:15

Re: Abbruch beim Shreddern
 
Wie viel Arbeitsspeicher belegt dein Datentyp TFileData? :cyclops:

SirThornberry 30. Aug 2009 15:18

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.

Namenloser 30. Aug 2009 15:26

Re: Abbruch beim Shreddern
 
Hier mal ein abgewandelter Auszug aus einem ähnlichen Programm von mir:
Delphi-Quellcode:
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;
Übrigens würde mich interessieren, weshalb du Bit-Operationen verwendest, anstatt die Daten einfach mit völlig anderen Werten zu überschrieben.

himitsu 30. Aug 2009 15:45

Re: Abbruch beim Shreddern
 
Such einfach mal im Forum nach Hier im Forum suchenShredder, Hier im Forum suchenFileShredder, Hier im Forum suchenEraser und so weiter,

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:
for i := Low(i) to l do
Low(i) = MinInt = minus 2 Millonen

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

implementation 30. Aug 2009 16:10

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.

Namenloser 30. Aug 2009 16:15

Re: Abbruch beim Shreddern
 
Zitat:

Zitat von implementation
@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

Also was bei dieser Operation am ende herauskommt, habe ich jetzt nicht durchgerechnet :mrgreen:
Denn ich hat der Zufallsgenerator einige Vorteile, z.B. weil du dann nur einen Durchgang brauchst -> höhere Geschwindigkeit, geringere Belastung der Festplatte

SirThornberry 30. Aug 2009 16:23

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:

Ich hoffe du bist dir bewusst das diese Funktion nicht dazu führt das man die Daten nicht wieder herstellen kann.
= "das diese Funktion NICHT dazu führt" + "das man die Daten NICHT wieder herstellen kann"
= "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.

himitsu 30. Aug 2009 16:28

Re: Abbruch beim Shreddern
 
Zitat:

Zitat von implementation
@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

Dann schreib doch gleich die 139 rein.

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:

Zitat von implementation
Übrigens ist i vorzeichenlos

wer macht denn sowas :shock:

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:

Zitat von SirThornberry
@himitsu: Deine Quellen würden mich sehr interessieren.

Im Grunde wurde alles schon in einigen der anderen Shredder-Threads mehrmals gesagt.

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.

Namenloser 30. Aug 2009 16:37

Re: Abbruch beim Shreddern
 
Zitat:

Zitat von himitsu
Denn dafür muß man auch noch alle "freien" Bereiche der festplatte überschreiben, da ja keiner eine Ahnung hat, ob/wo Kopien vorhanden sind.

Das Programm, aus dem ich den Code abgewandelt habe, macht eigentlich genau das :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz