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

А ты написал свой стелс?

Касатенко Иван aka SkyWriter

Спецвыпуск Xakep, номер #035, стр. 035-050-3


Не будем заострять внимание на поиске и открытии хендла самого процесса, а перейдем сразу к делу: запишем в программу код запуска треда вируса. После этого нам надо найти таблицу импортируемых функций программы и переписать адрес одной из импортированных функций так, чтобы он указывал на наш код запуска. И то, и другое можно сделать при помощи функций ReadProcessMemory и WriteProcessMemory. Естественно, стоит переписывать какую-то часто используемую функцию, например, GetMessage. Но не забудь, что после запуска своего кода необходимо вернуть все на свои места, а то жертва перестанет корректно функционировать.

Третий способ чуть легче, он особенно удобен, если ты пишешь свое детище на C. Состоит он в том, чтобы воспользоваться библиотекой Detours от разработчиков Microsoft ;). Она позволяет загрузить в чужой процесс свою DLL-библиотеку, а уж та может творить внутри все, что угодно. Сравните весь тот бред, что был написан про второй способ, с лаконичным куском кода:

// hProcess - хендл процесса

// szDllPath - путь к подгружаемой библиотеке

DetourContinueProcessWithDllA(hProcess, szDllPath);

Он загрузит в жертву нашу DLL'ку, в функции ProcessAttach которой ты пропишешь все, что собираешься сделать. Просто, как раз-два-три. Неприятно одно: с собой приходится таскать целую библиотеку подгружаемых багов aka DLL :), что, согласись, в вире - излишне.

Четвертый способ я опишу лишь концептуально, без деталей, а то я уж больно сильно увлекся кодингом :). Этот способ состоит в подмене функции, которая выдает приложениям список процессов. Точнее не функции, а ряда функций: Process32First и Process32Next. Тут же напрашивается идея использования для этого той же техники, что и в предыдущих двух способах.

Но в идеале каждой пользовательской программе нужно подсовывать "исправленные" версии таких функций. Как же это сделать? Делается это, как оказалось, несложно и достаточно лаконично. Дело в том, что их код хранится в одном месте физической памяти, а в каждый процесс лишь отображается (спасибо дескрипторным таблицам, о которых написано в статье про Ring0), таким образом, остается лишь изменить эти функции в физической памяти, и счастье придет само собой! =) Но обычным способом это сделать невозможно, потому что эта область защищена от записи. Тупик? Нет! Решение все-таки существует.

Оно состоит в переходе на более глубокий уровень Windows, на уровень ядра или в так называемое нулевое кольцо защиты (Ring0). Находясь именно в этом уровне, мы можем делать то, что обычным программкам на Visual Basic'е и не снилось, мы можем изменять физическую память, в том числе и наши функции. Как попасть в нулевое кольцо защиты? Для этого существует специальный механизм эскалации привилегий в процессорах фирмы Intel.

Этот способ, хотя и достаточно прост в описании, на практике оказывается самым сложным, потому как программирование на уровне ядра - это хождение по лезвию бритвы, чуть что не так, и наблюдаешь за красивым синим экраном :). Но зато это и единственный по-настоящему надежный путь. В самом деле, какому антивирусу захочется копаться в пучинах кернела?

Назад на стр. 035-050-2  Содержание  Вперед на стр. 035-050-4