Программа-невидимка Николай "GorluM" Андреев Хакер, номер #075, стр. 075-110-2 Поэтому перейдем ко второму способу - модифицированию таблицы импорта. Все имена импортируемых функций программой функций (API) находятся в таблице импорта. После запуска таблица имен функций превращается в таблицу их адресов. Суть способа заключается в нахождении адреса перехватываемой функции в таблице и замене его на адрес своего обработчика. Способ очень простой - достаточно знать формат PE-заголовка, который тысячу раз везде описан, и уметь манипулировать функцией GetProcAddress. Но у этого способа есть значительный недостаток - таблица импорта есть не только у перехватываемого приложения, но и у всех его динамических библиотек. Никто не может быть уверен в том, что одна из них не импортирует функцию, которую мы хотим перехватить. Поэтому модифицировать надо таблицы импорта всех модулей и exe и dll, да еще и контролировать появление новых модулей, загружаемых с помощью LoadLibrary. При написании программы-невидимки я отдал предпочтение именно второму способу. Итак, пусть у нас есть некоторая запущенная программка и мы хотим, чтобы вместо запуска какой-нибудь API-функции она запускала бы нашу. Что мы должны сделать? Во-первых, мы должны поместить функцию обработчик в адресное пространство этой программы. Во-вторых - модифицировать определенным методом либо код перехватываемой функциии, либо таблицу импорта. Но поскольку мы хотим, чтобы юзер не видел следов нашей программы в любой утилите, в любом приложении - мы должны перехватить API во всех процессах системы. Мы должны сделать глобальный перехват, внедрить свой код во все процессы. Легко! Глобальное внедрение Конечно, внедрить код во все запущенные процессы очень просто - нужно всего лишь написать DLL и установить какой-нибудь глобальный хук, после чего DLL будет подгружена ко всему и вся, кроме сервисов. Но мы простых путей не ищем. Я люблю, когда программа - это один екзешник, без библиотек. Поэтому предлагаю использовать инжектирование кода, описанное в декабрьском номере для внедрения функции-перехватчика. Просто инжектировать будем во все доступные процессы. Перечисляем с помощью toolhelp API процессы, внедряем в каждый свой код и модифицируем таблицу импорта. В программе это выглядит вот так (функция InjectAndRun уже была описана мной в декабре): Глобальное инжектирование |