PDA

Просмотр полной версии : Скрипт для безвозвратного удаления данных


Digimortal
08.03.2007, 05:17
пример скрипта на perl, служащего для безвозвратного удаления файлов (без возможности восстановления спец. софтом) с жесткого диска.. Есть возможность использования 3х алгоритмов удаления; удалять отдельные файлы или полностью содержимое директорий..

#!/usr/bin/perl -w

use strict;

my $file = shift || usage();

if ($file =~ /^\'/)
{
while ($file !~ /\'$/ && @ARGV)
{
$file .= ' ';
$file .= shift;
}
$file =~ s/^\'//;
$file =~ s/\'$//;
}

my $algo = shift || 'visr';
my $mode = shift || 0;

my ($f, $rand, @size);

$file =~ /[\/\\]$/ ? delete_dir($file) : wipe($file);


sub delete_dir

{
my $dir = shift;

my @files = getfiles($dir, 0);
wipe("$dir/$_") foreach (@files);

my @dirs = getfiles($dir, 1);
delete_dir ("$dir/$_") foreach (@dirs);

print "Directory $dir deleted..\n" if rmdir($dir) or print "Can't delete directory $dir\n";
}


sub getfiles

{
my ($dir, $flag, $line, @dirlist, @res_mas, @dir_mas) = @_;

opendir my $d, "$dir";
@dirlist = readdir $d;

foreach my $line(@dirlist)
{
push @res_mas, $line if (!-d "$dir/$line" && $line ne '.' && $line ne '..' && !$flag);
push @dir_mas, $line if ( -d "$dir/$line" && $line ne '.' && $line ne '..' && $flag);
}

closedir $d;

return @res_mas if !$flag;
return @dir_mas if $flag;
}


sub wipe

{
my $file = shift;

open $f, "+<", $file or exit print "Can't delete $file";

binmode $f;
@size = stat $f;
my $t = time;

open $rand, "<", '/dev/urandom' or die "\n\tCan\'t open /dev/urandom\n" if $mode;

if ($algo eq 'visr') { visr() }
elsif ($algo eq 'bs') { bs() }
elsif ($algo eq 'pg') { pg() }
else { usage() }

close $rand if $mode;
close $f;

unlink $file;
$t = time-$t;

print "File $file deleted in $t seconds..\n";
}


sub usage

{
print << 'HELL';

The Mainest Evil of Runet
_ _ _ _ _ __ _ _ _
| || |___| | | |/ /_ _ (_)__ _| |_| |_ ___
| __ / -_) | | . <| . \| / _. | . \ _(_-<
|_||_\___|_|_|_|\_\_||_|_\__. |_||_\__/__/
hellknights.void.ru |___/ .0x48k.
digimortal.0x48k.cc .Digimortal.

Tool: DiWiper.pl v.0.4

Usage: perl diwiper.pl <file/dir> [algo] [mode]

Options:
algo: visr - algorithm VISR (default)
bs - Bruce Shneier's algorithm
pg - Peter Gutmann's algorithm
mode: 0 - use rand() (default)
1 - use /dev/urandom

HELL

exit;
}


sub fill

{
my $val = shift;
seek $f, 0, 0;
print $f $val for (1..$size[7]);
}


sub fill_rand

{
seek $f, 0, 0;
for (1..$size[7])
{
print $f getc $rand if $mode;
print $f chr rand 256 if $mode==0;
}
}


sub visr

{
for (1..3)
{
fill ("\x00");
fill ("\xFF");
}
fill ("\xAA");
}


sub bs

{
fill ("\xFF");
fill ("\x00");
fill_rand() for (3..7);
}


sub pg

{
fill_rand() for (1..4);

my @val =( "\x55", "\xAA", "\x92",
"\x49", "\x24", "\x00",
"\x11", "\x22", "\x33",
"\x44", "\x55", "\x66",
"\x77", "\x88", "\x99",
"\xAA", "\xBB", "\xCC",
"\xDD", "\xEE", "\xFF",
"\x55", "\xAA", "\x92",
"\x00", "\x49", "\x24" );

fill ($val[$_]) for (0..$#val);
fill_rand() for (32..35);
}


# thnx 2 ShadOS за то, что подкинул идейку этого скриптика ;)
# & thnx 2 KSURi за "технический аудит" моего perl-кода =)
# eof..

для удаления папок/каталогов следует добавить в конец их имени "\" или "/", если есть пробелы в значении параметра - то обрамить одинарными кавычками.. например:
perl diwiper.pl 'c:\Documents and Settings\user\123\' bs
удалит безвозвратно алгоритмом Брюса Шнайера все файлы, содержащиеся в директории 123 и ее саму..

з.ы. юзайте аккуратно, ато удалите чего лишнего =))

ShadOS
11.03.2007, 22:19
digi, молодец! Это скрипт ведь и под никсами работает! А оффтоперам жирные минусы поноставить надо!