Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Скрипт для безвозвратного удаления данных (https://forum.antichat.xyz/showthread.php?t=34954)

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, молодец! Это скрипт ведь и под никсами работает! А оффтоперам жирные минусы поноставить надо!


Время: 15:45