Зделал так: ;Get the handler of an interrupt sidt tbyte [rbp+strcDriverData.pntrIDTR] mov rax,qword [rbp+strcDriverData.pntrIDTR+2] ;rax points to IDT lea rax,[rax+8*10h] ;rax points to the trap gate mov rbx,[rax] ;[0..15] shrd rsi,rbx,16 mov rbx,[rax+6] ;[16..31] shrd rsi,rbx,16 mov rbx,[rax+8] ;[32..63] shrd rsi,rbx,32 ;Search the beginning of the kernel and rsi,0fffffffffffff000h ServGetAddress_0: sub rsi,1000h cmp word [rsi],'MZ' jne ServGetAddress_0 ;Check up for: 'PE' header mov edx,[rsi+3ch] cmp word [rsi+rdx],'PE' jne ServGetAddress_0 ;Continue the searching протестил: XP, 7
Посмотри в сторону KeCapturePersistentThreadState(). Более подробно об этой функции есть, например, здесь.
x64 Стандартная задача. Начинаем исполняться с CPL = 0. Остальное всё нужно найти, базу ядра, распарсить его, найти переменные/функи.. К PCR доступ есть.
а есть примеры перехвата DoubleFault? через IDTR - аппаратно, а исключения зависит от ОС (к примеру: в usermode в XP финальный обработчик в kernel32 указывает, а в Viste в ntdll, вроде)
OpticalToxin Есть примеры перехвата не критичных исключений(не приводящих к генерации багчека). Есть возможность перехватить багчеки, но это закрытая тема, это основа моего руткита