Einzelnen Beitrag anzeigen

paritycheck

Registriert seit: 8. Feb 2005
51 Beiträge
 
Delphi 2009 Professional
 
#6

Re: FLSHR - Der File-Shredderer

  Alt 27. Jul 2006, 10:20
Ich hatte sowas auch mal gemacht allerdings hab ich damals den Gutmann Algorithmus benutzt.
Ich häng einfach mal den Quelltext dran. Vielleicht kannste was damit anfangen.

Delphi-Quellcode:
...
type
  TOverWriteData = array[0..2] of Byte;

const
  OverWriteData: array[0..34] of TOverWriteData =
  (($00, $00, $00), ($00, $00, $00), ($00, $00, $00), ($00, $00, $00), //Random data
   ($55, $55, $55), ($AA, $AA, $AA), ($92, $49, $24),
   ($49, $24, $92), ($24, $92, $49), ($00, $00, $00),
   ($11, $11, $11), ($22, $22, $22), ($33, $33, $33),
   ($44, $44, $44), ($55, $55, $55), ($66, $66, $66),
   ($77, $77, $77), ($88, $88, $88), ($99, $99, $99),
   ($AA, $AA, $AA), ($BB, $BB, $BB), ($CC, $CC, $CC),
   ($DD, $DD, $DD), ($EE, $EE, $EE), ($FF, $FF, $FF),
   ($92, $49, $24), ($49, $24, $92), ($24, $92, $49),
   ($6D, $B6, $DB), ($B6, $DB, $6D), ($DB, $6D, $B6),
   ($00, $00, $00), ($00, $00, $00), ($00, $00, $00), ($00, $00, $00)); //Random Data

procedure FillBuffer(var Buffer: array of TOverWriteData; Data: TOverWriteData);
var i: integer;
begin
  for i:= 0 to High(Buffer) do begin
      Buffer[i]:= Data;
  end;
end;

procedure RandomizeBuffer(var Buffer: array of TOverWriteData);
var i: integer;
begin
  Randomize;
  for i:= 0 to High(Buffer) do begin
      Buffer[i][0]:= ord(Trunc(Random(255)));
      Buffer[i][1]:= ord(Trunc(Random(255)));
      Buffer[i][2]:= ord(Trunc(Random(255)));
  end;
end;

function Shredder(aFilename: string): Boolean;
var nSize: INT64;
    hFile, i: Integer;
    BytesWritten: Integer;
    TotalBytes: INT64;
    BytesToWrite: INT64;
    Buffer: array[0..1365] of TOverWriteData;
begin
  result:= False;
  hFile:= FileOpen(aFilename, fmOpenWrite or fmShareExclusive);
  if hFile > 0 then begin
     nSize:= FileSeek(hFile, 0, 2);
     if nSize = 0 then begin
        FileClose(hFile);
        result:= SysUtils.DeleteFile(aFilename);
        exit;
     end;
     for i:= 0 to High(OverWriteData) do begin
         if (i in [0..3,31..34]) then //Die ersten und letzten 4 Durchläufe mit Zufallsdaten überschreiben
       RandomizeBuffer(Buffer)
         else
            FillBuffer(Buffer, OverWriteData[i]);
         TotalBytes:= nSize;
         if (TotalBytes - sizeof(Buffer)) <= 0 then
            BytesToWrite:= TotalBytes
         else
            BytesToWrite:= sizeof(Buffer);
         FileSeek(hFile, 0, 0);
         repeat
           BytesWritten:= FileWrite(hFile, Buffer, BytesToWrite);
           Dec(TotalBytes, BytesWritten);
           if (TotalBytes - sizeof(Buffer)) <= 0 then
              BytesToWrite:= TotalBytes
           else
              BytesToWrite:= sizeof(Buffer);
         until
           TotalBytes <= 0;
     end;
     FileClose(hFile);
     result:= SysUtils.DeleteFile(aFilename);
  end;
end;
Kann man sicherlich besser implementieren aber es funktioniert...
  Mit Zitat antworten Zitat