убийство часового КРИС КАСПЕРСКИ, АКА МЫЩЪХ Спецвыпуск: Хакер, номер #072, стр. 072-072-6 С другой стороны - даже если оставить виртуализацию в покое и вернуться в реальный мир — 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 [обходи мента сзади, а Patch-Guard - спереди.] Для проверки целостности путем системных библиотек разработчики Patch-Guard'а не стали использовать тяжеловесные алгоритмы типа MD5, а взяли быстрый и легкий СRC. Очевидно, они не учили матчасть, поскольку CRC хоть и относится к надежным алгоритмам, но ориентирован он на непреднамеренные искажения. Помехи на линии, например. Дописав несколько «корректирующих» байт (для CRC8 — один, для CRC16 – два, для CRC 32 — четыре и для CRC64 – восемь), мы добьемся того, что контрольная сумма модифицированного образа останется неизменной, и Patch-Guard ничего не заметит! Поскольку Patch-Guard контролирует блоки фиксированного размера, наша задача слегка усложняется и, вместо дописывания корректирующих байт, мы должны записать их поверх неиспользуемых нулевых байт, или ненулевых — какая разница?! Главное, чтобы их значение можно было безболезненно менять на любое другое. В каждом файле легко найти множество команд NOP (опкод 90h), расположенных между функциями и служащих для выравнивания. Остается только расковырять саму функцию, используемую Patch-Guard'ом для подсчета контрольной суммы. Листинг, приведенный ниже, позаимствованный из статьи «Bypassing PatchGuard on Windows x64»: |