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

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

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

(gorlum@real.xakep.ru)

Инжектирование в чужой процесс – это просто

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

В Windows, как ты знаешь, для каждого процесса создается уникальное виртуальное адресное пространство, за пределы которого процесс самостоятельно, без помощи ядра выбраться не может. Суть технологии Process Injection (реже - process infection) заключается как раз в том, чтобы заставить процесс вылезти за рамки своего адресного пространства, и не просто вылезти, а совсем и навсегда. «За рамки» тут означает - в другой процесс, который обладает некоторыми полезными для твоего кода характеристиками, будь то просто постоянное нахождение в памяти или присутствие в списках доверенных приложений.

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

Давай подумаем, отбросив всякие крутые программистские предназначения, для чего простому (хорошо, не совсем простому) хакеру может пригодиться Process Injection. Во-первых, с помощью инжекта можно сделать процесс твоей программы (трояна, кейлоггера etc) невидимым в списке процессов. Причем не с помощью перехвата функции NtQuerySystemInformation, используемой в Process Manager’е, – этот способ далек от совершенства, реализация ядерной функции все время меняется, поэтому для обеспечения совместимости для каждой версии (если не билда) винды нужно делать отдельную функцию-перехватчик, - а с помощью полного перемещения кода своего процесса в адресное пространство другого, который висит уже долго и умирать, видимо, не собирается.

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

В-третьих, находясь в чужом процессе, программа не использует EXE-файл, из которого была запущена в начале, а значит, она может его:

а) модифицировать – применить патч, скачанный из инета, или просто полиморфизовать, дабы антивирусами не определялся;

б) стереть – нет файла, нет и вторжения. Естественно, перед выключением компа его следует восстановить;

в) сменить дислокацию – никто не помешает от запуска к запуску менять имя файла.

Содержание  Вперед на стр. 072-112-2
ttfb: 3.2899379730225 ms