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

Клизма для файрвола

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

Хакер, номер #072, стр. 072-112-4


Выделив память, остается аккуратно, постранично (по 0x1000 байт) перенести весь наш образ в чужое адресное пространство, не забывая перед копированием проставлять PAGE_EXECUTE_READWRITE на памяти с помощью функции VirtualProtectEx. Копирование может обломаться, если память по заданному адресу уже выделена процессом-жертвой. Чтобы этого избежать, я максимально сдвигаю образ нашей программы еще в процессе сборки ее PE-заголовков с помощью директив компилятора:

#pragma comment(linker,"/BASE:0x13140000")

После удавшегося копирования от нас потребуется только запустить необходимую функцию НАШЕЙ программы в ЧУЖОМ процессе. К примеру, чтобы в чужом процессе работала наша функция func, нужно всего лишь запустить функцию CreateRemoteThread, указав в ее первом параметре хэндл процесса, а в третьем - имя запускаемой функции. Для совместимости своей программы со старыми версиями Win (9х-винды, увидев незнакомую функцию, обломают нам весь кайф), CreateRemoteThread я не прописываю в таблице импорта, а нахожу с помощью GetProcAddress.

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

ЛИСТИНГ

::LoadLibrary("user32.dll");

::LoadLibrary("ws2_32.dll");

::LoadLibrary("dnsapi.dll");

Клизма файрволу

Чтобы тебе было максимально понятно, зачем все это дело нужно, реализуем обход персонального файрвола на основе изученной только что технологии. С помощью инжектирования, насколько мне известно, файры можно обойти двумя способами. Первый способ – обыкновенное внедрение кода в процесс файрвола;

Оказывается, некоторые защиты не детектят собственного обращения в Сети :). Современные версии файрволов этому не подвержены.

Второй способ – инжектирование в процесс браузера, который обычно содержится во всех списках доверенных приложений. Для его реализации нужно всего лишь создать скрытую копию процесса iexplore.exe (т.е. дефолтового браузера) с помощью функции CreateProcess, записать полученный ID процесса и использовать его в функции внедрения кода.

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

__asm ret

Я мог бы бесконечно рассказывать о возможностях технологии Process Injection и нюансах ее реализации, но, к сожалению, я сильно ограничен в объеме. Если тебе хочется больше информации – рой Сеть. Например, на сайте древнейшего хакерского журнала Phrack есть интересный материальчик про обход файрволов с помощью этой техники. Если у тебя возникнут какие-нибудь вопросы – пиши, я с удовольствием пообщаюсь с тобой по почте.

На этом я заканчиваю свой рассказ. Удачного компилирования, и да пребудет с тобой Сила.

Основная функция программы

BOOL WINAPI G::SetStealth(DWORD (WINAPI *func)(LPVOID), LPTSTR szProcess) {

DWORD p_id = NULL;

HMODULE g_module = GetModuleHandle(NULL);

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