AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abbruch beim Shreddern

Ein Thema von implementation · begonnen am 30. Aug 2009 · letzter Beitrag vom 31. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#1

Abbruch beim Shreddern

  Alt 30. Aug 2009, 15:58
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?
Marvin
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 16:15
Wie viel Arbeitsspeicher belegt dein Datentyp TFileData?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 16:18
Was bezweckst du mit dieser Funktion? Ich hoffe du bist dir bewusst das diese Funktion nicht dazu führt das man die Daten nicht wieder herstellen kann.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 16:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 16:45
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:
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 17:10
@SirThornberry: Das ist ja der Sinn am Shreddern

@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.
Marvin
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 17:15
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
Denn ich hat der Zufallsgenerator einige Vorteile, z.B. weil du dann nur einen Durchgang brauchst -> höhere Geschwindigkeit, geringere Belastung der Festplatte
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 17:23
@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 Deine Quellen würden mich sehr interessieren.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 17:28
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 von implementation:
Übrigens ist i vorzeichenlos
wer macht denn sowas

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

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 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.
$2B or not $2B
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Abbruch beim Shreddern

  Alt 30. Aug 2009, 17:37
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.
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