Приколы над Windows

Я начинаю писать цикл статей о том, как можно программно поприкалываться в Windows. Привет чукотским виримейкерам и троянописателям :) . В принципе все действия, которые я буду описывать, не являются сами по себе разрушительными, но могут попортить очень много нервов юзерам, особенно неопытным. Я надеюсь сделать что-то вроде коллекции приколов. Все программы будут писаться на Delphi. Если Вы хотите дополнить коллекцию - пишите мне на мыло.

Начнем с общих вопросов.

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.

2) Отключение комбинаций клавиш Ctrl-Alt-Del, Alt-Tab, Ctrl-Esc:

Для этого мы воспользуемся функцией SystemParametersInfo. Эта функция позволяет просматривать и изменять системные параметры.

BOOL SystemParametersInfo(
UINT uiAction, // системный параметр для изменения
UINT uiParam, // зависит от производимого действия
PVOID pvParam, // зависит от производимого действия
UINT fWinIni // обновлять профиль юзера или нет
);

Если функция сработала без ошибок, то она возвращает ненулевое значение, иначе - ноль.

В первый параметр передаем SPI_SCREENSAVERRUNNING, во второй 1, если отключаем клавиши, и 0, если включаем, 3-ий и 4-ый параметры – нули.

Вообще функция SystemParametersInfo очень полезная и мы часто ее будем использовать.

//Отключение комбинаций клавиш Ctrl-Alt-Del, Alt-Tab, Ctrl-Esc
procedure TForm1.Button3Click(Sender: TObject);
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,0,0);
end;

//Включение комбинаций клавиш Ctrl-Alt-Del, Alt-Tab, Ctrl-Esc
procedure TForm1.Button4Click(Sender: TObject);
begin
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,0,0);
end;

3) Изменение надписи на окнах открытых приложений

Пишем код:

procedure TForm1.Button5Click(Sender: TObject);
Var Wnd:THandle; //хэндл окна
begin
Wnd:=findWindow(0,PChar(Edit1.text)); //ищем окно поего названию
if (Wnd0) 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 и о цветомузыке на клавиатуре.

Эта статья предназначена только для ознакомительных целей. Ни в коем случае не реализовывайте на практике то, что Вы прочитаете, так как Вы несете полную ответственность за свои поступки в соответствии с действующим законодательством. Я не отвечаю за достоверность информации и не несу ответственности за Ваши поступки!  Все что вы делаете, вы делаете на свой страх и риск!!!