Взлом patch-guard

Симбиотические пути выживания


Собственно говоря, а чего это мы так встрепенулись? Чем нам, хакерам, мешает этот Patch-Guard и зачем его убивать? Пускай живет и защищает _нашу_ машину от всяких непрошеных тварей (типа кривых пионерских драйверов или червей), в то время как мы запустим свой хвост в чужие.

Рисунок 6 симбиоз — и никого убивать не надо

Все современные 64-разрядные процессоры семейства AMD x86-64 и Intel IA64, выпущенные после августа 2006 года, поддерживают механизмы аппаратной виртуализации. Достаточно, находясь в режиме ядра, выполнить машинную команду VMCALL (AMD) или VMXON (Intel), чтобы запустить гипервизор (в терминологии Intel – монитор виртуальных машин), переводящий операционную систему в гостевой режим и полностью контролирующий ее, перехватывая все обращения к портам ввода/вывода, прерывания, чтение/запись MSR-регистров (через которые, в частности, реализована инструкция SYSCALL). Мы как бы "подминаем" под себя операционную систему, работая в минусовом кольце (естественно, "минусовом" чисто условно) и осуществляем перехват без модификации базового кода/данных гостевой системы, так что Patch-Guard ничего не сможет определить. Причем, заткнуть эту дыру без _значительного_ ущерба для функциональности Microsoft не сможет хотя бы по чисто маркетинговым соображениям, иначе — прощай аппаратная виртуализация!

С другой стороны, даже если оставить виртуализацию в покое и вернуться в реальный мир — Patch-Guard может контролировать только неизменяемые области кода и данных, а в том же самом драйвере NDIS.SYS полно указателей, находящихся в стеке, пуле памяти и других изменяемых местах. Остается найти такой указатель, который был бы инициализирован после загрузки драйвера в память и указывал на вызываемый код. Хакеры уже давно и небезуспешно научились устанавливать хуки на NDIS.SYS в обход Patch-Guard'а, маскируя "нежелательную" сетевую активность или направляя/принимая пакеты, скрывающиеся от брандмауэра. Главный и единственный минус этого решения — не универсальность. Приходится либо "тащить" смещения указателей каждой версии NDIS'а за собой (что монстроузно, да и всех версий все равно не учтешь), использовать эвристические методы (которые весьма ненадежны), или… скачивать символьную информацию прямо с сервера Microsoft, воспользовавшись утилитой symchk, входящий в комплект поставки "Debugging Tools". Не слишком-то изящное решение, но зато надежное.

symchk NDIS.SYS /s srv*.\*http://msdl.microsoft.com/download/symbols -v

Листинг 4 добываем символьную информацию для текущей версии NDIS.SYS



Содержание раздела