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

Крутой протектор – не беда

Ms-Rem (Ms-Rem@yandex.ru)

Спецвыпуск: Хакер, номер #057, стр. 057-056-2


Из схемы, которая расположилась где-то рядом, следует, что вызов функции ядра до его передачи соответствующей Native API проходит довольно сложную обработку. Сначала, в третьем кольце, вызывается соответствующая функция библиотеки ntdll, где в регистр EAX помещается номер вызываемого системного сервиса, а в регистр EDX - указатель на передаваемые параметры. Затем вызывается прерывание 2Eh (в Windows XP - команда sysenter), и происходит переход процесса в нулевое кольцо, где управление передается согласно записанному в IDT шлюзу прерывания. В этом месте происходит переключение окружения третьего кольца на нулевое. Выполняется смена пользовательского стека на стек ядра. Также осуществляется перезагрузка сегментного регистра FS, который в нулевом кольце указывает на совершенно иные структуры, чем в третьем кольце. Затем управление передается обработчику прерывания 2Eh - функции ядра KiSystemService. Она копирует в стек ядра передаваемые системному сервису параметры и производит вызов Native API функции ядра, согласно содержимому ServiceDescriptorTable (SDT). Эта таблица находится в памяти ядра и представляет собой структуру, содержащую четыре таблицы системных сервисов (SST). Первая из этих таблиц описывает сервисы, экспортируемые ядром (ntoskrnl.exe), вторая - графической подсистемой (win32k.sys), а остальные две зарезервированы на будущее и сейчас не используются.

Самый простой способ перехвата Native API в ядре - замена адреса обработчика нужной функции в SDT на "свой". При вызове перехваченной функции происходит проверка параметров, и если производится (например как в протекторе) попытка чтения памяти защищенного процесса, то возвращается отказ в доступе, иначе просто вызывается оригинальный обработчик функции. Просмотреть содержимое SDT мы можем командой SoftIce'а NTCALL, при этом отладчик выводит номер функции, ее имя (если установлены отладочные символы), адрес и имя функции обработчика. Если вместо Ntoskrnl!NtOpenProcess мы видим что-то типа Xprot!.text + 1234h, то функция перехвачена защитой.

Однако патчинг SDT - не единственный способ перехвата Native API. Также может быть перехвачено прерывание int 2Eh в win2k (о чем можно узнать командой SoftIce'а IDT) либо изменен обработчик системного вызова через sysenter в winxp и выше. Установка\снятие обработчика прерывания int 2Eh будет выглядеть так:

Назад на стр. 057-056-1  Содержание  Вперед на стр. 057-056-3