Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #96, ДЕКАБРЬ 2006 г.

Новогоднее западло

BUG(O)R

Хакер, номер #096, стр. 096-088-4


Новый год везде...

Пора завязывать с этими детскими играми. Скажем так, это была разминка. Теперь, чтобы праздничная обстановка была прочувствована сполна, распространимся по всей системе глобально. Что мы можем для этого сделать? Подумав минут 5, я решил далеко не ходить и сделать простой перехват всех функций MessageBox в системе, модифицируя текст сообщения таким образом:

Happy New Year, Dead Moroz!!!

[Оригинальный текст сообщения]

С Новым годом, отморозок!!!

Вот и все. Сообщения в системе выползают довольно часто, поэтому твой приятель (или неприятель) действительно сможет ощутить приближение праздника :).

Перейдем к кодингу. С какими трудностями мы столкнемся? В первую очередь это инжект во все программы. В принципе, перебрать все процессы и проинжектить туда dll труда не составит, но как же быть с вновь созданными процессами? Можно поставить глобальный перехват функций создания процесса, но это сложно и неспортивно. Есть более элегантное решение, которое основано на использовании Windows-хуков. Предположим, что в событии DLL_PROCESS_ATTACH мы установим хук на какое-нибудь сообщение, например WH_GETMESSAGE. И любая программа, которая имеет хоть одно окно (эй, баклан, он сказал «имеет», гы-гы), обязательно это сообщение будет использовать, а значит и наша dll будет подгружена в адресное пространство всех «оконных» процессов. Но самое главное, что пока хук не снят, dll будет подгружаться со всеми вновь созданными процессами, имеющими окно. Другими словами, наш прикол будет работать вплоть до перезагрузки. Еще одна проблема в том, что функций MessageBox фактически две (с индексом A и W; первые в качестве параметров используют ANSI-строки, вторые - UNICODE), так что перехватывать надо две функции, а не одну.

Что ж, поехали! Для начала я приведу код лоадера, который будет начинать работу нашей dll.

Наш новогодний загрузчик

program Loader;

uses

Windows;

begin

LoadLibrary('main.dll');

Sleep(INFINITE);

end.

Приведенный код, я думаю, в комментариях не нуждается. Теперь давай подробно разберем код main.dll - он довольно здорово преобразился:

Главная библиотека нашего прикола

procedure DLLEntryPoint(dwReason: DWord);

begin

case dwReason of

DLL_PROCESS_ATTACH:

begin

SetGlobalHook();

HookProc('user32.dll', 'MessageBoxA', @NMessageBoxA, @TMessageBoxA);

HookProc('user32.dll', 'MessageBoxW', @NMessageBoxW, @TMessageBoxW);

UnicodeText := 'Happy New Year!!!';

end;

DLL_PROCESS_DETACH:

begin

UnhookCode(@TMessageBoxA);

UnhookCode(@TMessageBoxW);

end;

end;

end;

Как видишь, перехват устанавливается на две функции. Непонятной остается лишь функция SetGlobalHook. Собственно, эта функция и устанавливает хук (ее исходник ты можешь найти на DVD). Любой человек хоть немного знающий, что такое хуки, прекрасно поймет, что здесь происходит.

Теперь рассмотрим процедуру перехвата MessageBoxA. Тут все до безобразия просто:

Первая функция перехвата

function NMessageBoxA (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

begin

asm

pushad

end;

NewTextA := 'С Новым годом, отморозок!!!' + #13#10#13#10 + lpText + #13#10#13#10 + 'С Новым годом, отморозок!!!';

Назад на стр. 096-088-3  Содержание  Вперед на стр. 096-088-5