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

Программа-невидимка

Николай "GorluM" Андреев

Хакер, номер #075, стр. 075-110-2


Поэтому перейдем ко второму способу - модифицированию таблицы импорта. Все имена импортируемых функций программой функций (API) находятся в таблице импорта. После запуска таблица имен функций превращается в таблицу их адресов. Суть способа заключается в нахождении адреса перехватываемой функции в таблице и замене его на адрес своего обработчика. Способ очень простой - достаточно знать формат PE-заголовка, который тысячу раз везде описан, и уметь манипулировать функцией GetProcAddress. Но у этого способа есть значительный недостаток - таблица импорта есть не только у перехватываемого приложения, но и у всех его динамических библиотек. Никто не может быть уверен в том, что одна из них не импортирует функцию, которую мы хотим перехватить. Поэтому модифицировать надо таблицы импорта всех модулей и exe и dll, да еще и контролировать появление новых модулей, загружаемых с помощью LoadLibrary.

При написании программы-невидимки я отдал предпочтение именно второму способу.

Итак, пусть у нас есть некоторая запущенная программка и мы хотим, чтобы вместо запуска какой-нибудь API-функции она запускала бы нашу. Что мы должны сделать? Во-первых, мы должны поместить функцию обработчик в адресное пространство этой программы. Во-вторых - модифицировать определенным методом либо код перехватываемой функциии, либо таблицу импорта.

Но поскольку мы хотим, чтобы юзер не видел следов нашей программы в любой утилите, в любом приложении - мы должны перехватить API во всех процессах системы. Мы должны сделать глобальный перехват, внедрить свой код во все процессы. Легко!

Глобальное внедрение

Конечно, внедрить код во все запущенные процессы очень просто - нужно всего лишь написать DLL и установить какой-нибудь глобальный хук, после чего DLL будет подгружена ко всему и вся, кроме сервисов. Но мы простых путей не ищем. Я люблю, когда программа - это один екзешник, без библиотек. Поэтому предлагаю использовать инжектирование кода, описанное в декабрьском номере для внедрения функции-перехватчика. Просто инжектировать будем во все доступные процессы. Перечисляем с помощью toolhelp API процессы, внедряем в каждый свой код и модифицируем таблицу импорта.

В программе это выглядит вот так (функция InjectAndRun уже была описана мной в декабре):

Глобальное инжектирование

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