Автор: Артём Сухобоков chimaf@mail.ru или artem2@beep.ru
Я начинаю писать цикл статей о том, как можно программно поприкалываться в Windows. Привет чукотским виримейкерам и троянописателям :) . В принципе все действия, которые я буду описывать, не являются сами по себе разрушительными, но могут попортить очень много нервов юзерам, особенно неопытным. Я надеюсь сделать что-то вроде коллекции приколов. Все программы будут писаться на Delphi. Если Вы хотите дополнить коллекцию - пишите мне на мыло.
Рис. 1 Главная форма примера.
Начнем с общих вопросов.
1) Невидимка
Делаем свою программу невидимой в списке запущенных программ по Ctrl+Alt+Del
Для этого нужно загрузить функцию RegisterServiceProcess из KERNEL32.DLL.
function RegisterServiceProcess (dwProcessID, dwType:DWord) : DWORD
У этой функции 2 параметра типа Dword:
dwProcessID-ID процесса, вызывающего функцию.
dwType-0 или 1. Если 1, то невидимость включена, 0-выключена.
Пишем код:
…
type
//тип загружаемой процедуры
TRegisterServiceProcess = function (dwProcessID, dwType:DWord) : DWORD; stdcall;
…
// включение невидимости
procedure TForm1.Button1Click(Sender: TObject);
var hNdl :THandle; //хзндл DLL
R: TRegisterServiceProcess; //переменная процедурного типа
begin
if not(csDesigning in ComponentState) then //если находимся не в Delphi IDE
begin
hNdl:=LoadLibrary('KERNEL32.DLL'); //загружаем DLL
R:=GetProcAddress(hNdl, 'RegisterServiceProcess'); //получаем функцию из DLL
R(GetCurrentProcessID, 1); //вызываем функцию
FreeLibrary(hNdl); //освобождаем DLL
end;
end;
//отключение невидимости
procedure TForm1.Button2Click(Sender: TObject);
var hNdl :THandle; // хзндл DLL
R: TRegisterServiceProcess; //переменная процедурного типа
begin
if not(csDesigning in ComponentState) then // если находимся не в Delphi IDE
begin
hNdl:=LoadLibrary('KERNEL32.DLL'); // загружаем DLL
R:=GetProcAddress(hNdl, 'RegisterServiceProcess'); // получаем функцию из DLL
R(GetCurrentProcessID, 0); // вызываем функцию
FreeLibrary(hNdl); // освобождаем DLL
end;
end;
Я отключил невидимость при запуске программы в Delphi IDE, потому что тогда невидимым станет сам Delphi.
Эта невидимость работает только по Ctrl-Alt-Del. Продвинутые же программы, которые используют переборку всех процессов, нашу программу увидят. Например, я для вычисления троянов использую CodeStuff Starter.
Для этого мы воспользуемся функцией SystemParametersInfo. Эта функция позволяет просматривать и изменять системные параметры.
BOOL SystemParametersInfo(
UINT uiAction, // системный параметр для изменения
UINT uiParam, // зависит от производимого действия
PVOID pvParam, // зависит от производимого действия
UINT fWinIni // обновлять профиль юзера или нет
);
Если функция сработала без ошибок, то она возвращает ненулевое значение, иначе - ноль.
В первый параметр передаем SPI_SCREENSAVERRUNNING, во второй 1, если отключаем клавиши, и 0, если включаем, 3-ий и 4-ый параметры – нули.
Вообще функция SystemParametersInfo очень полезная и мы часто ее будем использовать.
procedure TForm1.Button5Click(Sender: TObject);
Var Wnd:THandle; //хэндл окна
begin
Wnd:=findWindow(0,PChar(Edit1.text)); //ищем окно поего названию
if (Wnd<>0) then SetWindowText(Wnd,PChar(Edit2.text)) //изменяем название окна
else MessageBox(Application.handle,'Нет такого окна','Ошибка',MB_OK);
end;
Теперь все по-порядку. Функция
HWND FindWindow(
LPCTSTR lpClassName, // Указатель на строку-название класса окна
LPCTSTR lpWindowName // Указатель на строку-название окна
);
Эта функция, если находит окно, соответствующее данному названию класса окна и названию окна, возвращает его хэндл. Если такого окна нет, то функция возвращает 0. Мы не знаем название класса окна, поэтому в первый параметр мы передаем 0.
Функция
BOOL SetWindowText(
HWND hWnd, //хэндл окна
LPCTSTR lpString // указатель на строку-новое название окна
);
Эта функция позволяет изменить название окна, хэндл которого передается в первом параметре на строку, указатель на которую передается во втором параметре. Она возвращает ненулевое число, если завершается успешно. В случае ошибки она возвращает 0. Чтобы узнать информацию об ошибке нужно вызвать функцию GetLastError.
На сегодня хватит. В следующий раз я расскажу об окнах, которые невозможно закрыть штатными средствами Windows и о цветомузыке на клавиатуре.