Я пытаюсь перехватить SYSENTER
функцию отправки из ядра, и в течение последних нескольких дней я изучал, что происходит, когда программа выполняет SYSENTER
и хочет войти в ядро, тогда я понял IA32_SYSENTER_EIP
и IA32_SYSENTER_ESP
ответственны за установку ядра RIP
и RSP
после SYSENTER
.
Вчера я прочитал Руководства Intel для разработчиков ПО по поводу SWAPGS
:
Обмен SWAPGSтекущее значение базового регистра GS со значением, содержащимся в адресе MSR C0000102H (IA32_KERNEL_GS_BASE).Инструкция SWAPGS является привилегированной инструкцией, предназначенной для использования системным программным обеспечением.
При использовании SYSCALL для реализации системных вызовов в точке входа ОС отсутствует стек ядра.Также не существует простого метода для получения указателя на структуры ядра, из которого можно прочитать указатель стека ядра.Таким образом, ядро не может сохранять регистры общего назначения или справочную память.
Из второго абзаца there is no kernel stack at the OS entry point
кажется, что ядро ОС выполняет SWAPGS
, чтобы установить GS
, а затем получить стек ядрауказатель, но, как я читал, в SYSENTER
ядре RIP (EIP) и RSP (ESP) должны быть установлены из IA32_SYSENTER_EIP
и IA32_SYSENTER_ESP
, поэтому ядро имеет свой указатель стека в IA32_SYSENTER_ESP
!
MyВопросы:
- Если адрес стека ядра должен исходить от GS, тогда какова цель
IA32_SYSENTER_ESP
? - В чем различия между
AMD LSTAR (0xC0000082)
и IA32_SYSENTER_EIP
?Я спрашиваю об этом, потому что видел, что Windows установил 0xc0000082 на моем процессоре Intel. - Есть ли какая-то особая проблема с перехватом ядра диспетчера SYSENTER? Это потому, что всякий раз, когда я ставлю точку останова в функции Windows, которая отвечает за диспетчеризацию вызовов SYSENTER (KiSystemCall64Shadow)) на удаленной машине отладки (не виртуальной машины), затем он вызывает BSOD с UNEXPECTED_KERNEL_MODE_TRAP.