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

Операция "Перехват"

A.M.D.F. (grunge@amdf.pp.ru)

Хакер, номер #070, стр. 070-082-2


Я создал в Visual Studio два проекта: один для библиотеки, которая содержит функцию ReplaceIATEntryInOneMod, другой для программы, которая будет выполнять необходимые процедуры по загрузке моей DLL в адресное пространство подопытного процесса.

Необходимо сразу определиться, какую именно функцию нужно заменить. Дело в том, что их на самом деле две: MessageBoxA (работающая в кодировке ANSI) и MessageBoxW (в кодировке Unicode). Мой Блокнот из состава Windows XP использует именно Unicode-версию. Поэтому в дальнейшем я должен буду везде указывать MessageBoxW.

В созданной мною библиотеке находятся три функции: главная функция DllMain, функция для замены MessageBox (я называл ее MyMessageBoxW) и ReplaceIATEntryInOneMod. В главной функции DllMain при загрузке (когда параметр ul_reason_for_call равен DLL_PROCESS_ATTACH) происходит поиск адреса процедуры MessageBoxW в библиотеке user32.dll (которая уже загружена в адресное пространство подопытного процесса). Затем в функцию ReplaceIATEntryInOneMod передаются в качестве параметров: имя библиотеки, в которой находится заменяемая функция (user32.dll), адрес MessageBoxW, найденный до этого, адрес функции MyMessageBoxW и хэндл процесса notepad.exe.

Моя функция MyMessageBoxW имеет точно такой же список параметров, как и оригинальная MessageBoxW, и такой же тип возвращаемого результата. С соответствием типов нужно быть очень внимательным - если они не будут совпадать, процесс почти наверняка вылетит с ошибкой. Моя функция вызывает оригинальный MessageBox, передавая ему те же самые параметры, за исключением текста сообщения. Его я заменил на "Эй, чувак, ты забыл сохраниться" :).

Второй проект занимается внедрением библиотеки в Блокнот при его запуске. Для этого я использовал функцию CreateRemoteThread. Эта функция запускает поток в адресном пространстве чужого процесса. Она присутствует только в Windows 2000/XP, на платформе 9x она не поддерживается. Я надеюсь, ты давно сменил старушку Windows 98 на более прогрессивную винду XP?

Сначала моя программа запускает Блокнот, затем ищет адрес процедуры LoadLibraryA в библиотеке kernel32.dll. Именно эта процедура будет выполнена внутри Блокнота и заставит его загрузить нашу приготовленную библиотеку, которая сделает все остальное. Также нужно еще передать в качестве параметра для LoadLibrary название библиотеки (я назвал ее xaklib.dll). Эта строка обязательно должна находиться в адресном пространстве Блокнота, иначе LoadLibrary с большой долей вероятности вызовет в процессе ошибку нарушения доступа. Чтобы этого избежать, я выделил для строки, содержащей имя библиотеки, память в чужом процессе с помощью функции VirtualAllocEx, а затем записал в нее значение с помощью WriteProcessMemory.

Программа под контролем

Приготовления закончились. Теперь остается лишь запустить функцию LoadLibrary при помощи CreateRemoteThread и ждать, когда программа завершится. Произойдет загрузка Блокнота и замена функции MessageBox. Теперь ты можешь наблюдать измененный текст окошка подтверждения.

Назад на стр. 070-082-1  Содержание  Вперед на стр. 070-082-3