Доброе время суток! У меня не большой и "простой" вопрос: как использовать SysEnter? где о нем можно почитать? и как он работает? Заранее благодарен
Команда процессора sysenter вместе с sysexit позволяет быстро переходить между кольцами защиты, используя минимум проверок процессором. Использует модельно-специфические регистры MSR Для команды SYSENTER параметры указываются следующим образом: Целевой сегмент кода - в SYSENTER_CS_MSR. Целевой указатель команд - в SYSENTER_EIP_MSR. Сегмент стека - вычисляет команда, добавляя 8 к значению в SYSENTER_CS_MSR. Указатель стека - в SYSENTER_ESP_MSR. Для SYSEXIT параметры задаются так: Целевой сегмент кода - значение из SYSENTER_CS_MSR + 16. Целевой указатель кода - в EDX. Сегмент стека - значение из SYSENTER_CS_MSR + 24. Указатель стека - в ECX. Значения, находящиеся в регистрах MSR, процессором проверяются при их загрузке, при выполнении команд SYSENTER и SYSEXIT проверки сведены к минимуму. Вызвать сервис экпортируемый ядром можно двумя командами: sysenter и int В регистр Eax помещается номер сервиса. В регистр Edx указатель на параметры в стеке. Вызов сервиса посредством команды Int экспортируются из ntdll как функция KiIntSystemCall: KiIntSystemCall: lea edx,dword ptr [esp+8] int 2Eh ret Управление из прерывания возвращается на следующую за int 2Eh команду. Вызов посредством sysenter экспортируются из ntdll как функция KiFastSystemCall: KiFastSystemCall: mov edx,esp sysenter После вызова управление передаётся НЕ НА СЛЕДУЮЩУЮ за sysenter команду, а на команду по адресу KiFastSystemCallRet в ntdll. Адреса двух последних функций определены в KUSER_SHARED_DATA. Существуют программы, которые для скрытости вызывают системные функции посредством прямого вызова sysenter. Перехватив функцию KiFastSystemCallRet будет возможность контрольровать все вызовы. ИНТЕРЕСНО что: В ntdll определены восемь точек входа зарегистрированных в ядре - это функции с префиксом Ki('Kernel Internal'). KiUserApcDispatcher ;Обработчик очереди потока. В частности отсюда начинает исполнение любой поток. KiUserExceptionDispatcher ;Обработчик исключений. Отсюда продолжает исполнение поток в котором произошло исключение. KiRaiseUserExceptionDispatcher KiUserCallbackDispatcher KiFastSystemCall ;Быстрый вызов системного сервиса через sysenter KiFastSystemCallRet ;Адрес команды возврата(ret) из KiFastSystemCall KiIntSystemCall ;Вызов системного сервиса посретством Int 2Eh [LdrInitializeThunk] Адреса этих функций определены в ядре в модуле ntoskrnl(ntkrnlpa). Первые четыре в секции .data, LdrInitializeThunk - в секции .PAGEDATA, адреса определяются процедурами в этом модуле в секции .INIT. LdrInitializeThunk используется PsCreateSystemThread=>KeInitializeApc()/KeInsertQueueApc в качестве параметра). В XP и Vista перед функцией LdrInitializeThunk находятся пять команд Nop. Если уменьшить на пять значение переменной в ntoskrnl, которая содержит адрес этой функции, вновь создаваемые потоки начнут своё исполнение с команды, расположенной ниже функции во всех процессах(глобально). Т.е. можно перехватить функцию не используя сплайсинг.
Сейчас ещё посмотрел: 1. копируеш ntoskrnl.exe в каталог. 2. открываеш в PETools и устанавливаешь OptionalHeader.Subsystem->Windows GUI(чтобы запустился) 3. открываеш в OllyDbg. RVA обработчика sysenter=688Fh(у меня версия файла 5.1.2600.2774)