Операция "Перехват" 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. Теперь ты можешь наблюдать измененный текст окошка подтверждения. |