Как сделать hook на sysenter это понятно. А вот как снять чужой не очень. Получаю msr[0x176] затем мне надо узнать реальный адрес KiFastCallEntry которая и является обработчиком сисентера, чей адрес находиться в msr[0x176]. Как можно получить этот адрес например из ntoskrnl.exe.
Из любой Zw** экспортируемой ntoskrnl.exe ZwYieldExecution: Код (Text): 004074D5 > B8 16010000 MOV EAX,116 004074DA 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4] 004074DE 9C PUSHFD 004074DF 6A 08 PUSH 8 004074E1 E8 C0090000 CALL ntoskrnl.00407EA6 ;KiFastCallEntry 004074E6 C3 RETN Либо отсюда можно найти по сигнатуре: Код (Text): 0043EB04 8BFF MOV EDI,EDI 0043EB06 56 PUSH ESI 0043EB07 3E:A1 20F0DFFF MOV EAX,DWORD PTR DS:[FFDFF020] 0043EB0D 803D FC274800 00 CMP BYTE PTR DS:[4827FC],0 0043EB14 8BF0 MOV ESI,EAX 0043EB16 74 31 JE SHORT ntoskrnl.0043EB49 0043EB18 6A 00 PUSH 0 0043EB1A 6A 08 PUSH 8 0043EB1C 68 74010000 PUSH 174 0043EB21 E8 35000000 CALL ntoskrnl.0043EB5B 0043EB26 6A 00 PUSH 0 0043EB28 68 6F7F4000 PUSH ntoskrnl.00407F6F ;KiFastCallEntry 0043EB2D 68 76010000 PUSH 176 0043EB32 E8 24000000 CALL ntoskrnl.0043EB5B 0043EB37 6A 00 PUSH 0 0043EB39 FFB6 68080000 PUSH DWORD PTR DS:[ESI+868] 0043EB3F 68 75010000 PUSH 175 0043EB44 E8 12000000 CALL ntoskrnl.0043EB5B 0043EB49 5E POP ESI 0043EB4A C2 0400 RETN 4 0043EB4D 90 NOP 0043EB4E 90 NOP 0043EB4F 90 NOP 0043EB50 90 NOP 0043EB51 90 NOP 0043EB52 0F32 RDMSR ; Privileged command 0043EB54 C3 RETN 0043EB55 90 NOP 0043EB56 90 NOP 0043EB57 90 NOP 0043EB58 90 NOP 0043EB59 90 NOP 0043EB5A 90 NOP 0043EB5B 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4] 0043EB5F 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 0043EB63 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C] 0043EB67 0F30 WRMSR ; Privileged command 0043EB69 C2 0C00 RETN 0C 0043EB6C 8D49 00 LEA ECX,DWORD PTR DS:[ECX] 0043EB6F C3 RETN
Что то не похоже на правду : Код (Text): kd> u nt!ZwYieldExecution nt!ZwYieldExecution: 804de4d5 b816010000 mov eax,116h 804de4da 8d542404 lea edx,[esp+4] 804de4de 9c pushfd 804de4df 6a08 push 8 804de4e1 e8c0090000 call nt!KiSystemService (804deea6) 804de4e6 c3 ret 804de4e7 90 nop 804de4e8 8bff mov edi,edi
Mad666 Хочешь я тебя обламаю Тут писал гдето про инструкцию Sysenter, она флажёк трассировки не сбрасывает. Значит я сделою так. Перед вызовом Sysenter я установлю EFlags.TF -> 1. Далее произойдёт следующее: 1. Если ты подменил в MSR вход, то будет вызван твой обработчик, но так как TF останется взведённым после исполнения первой инструкции хэндлера возникнет трассировочное исключение. Управление получит код, указатель на который определён в шлюзе прерывания, по дефолту там KiTrap01(). Далее будет вызван KiDispatchException(), если установлен твой хэндлер исключений в KiDebugRoutine, то он будет вызван. Иначе - голубой огонёк 2. Если ты выполнишь перехват KiFastCallEntry() к примеру сплайсингом. В таком случае дело совсем плохо. Опятьже возникает трассировочное исключение, вызывается KiTrap01(). В нём проверка: Код (Text): cmp ecx,ntoskrnl._KiFastCallEntry Далее управление передаётся на KiFastCallEntry2(). А там формирование фрейма и передача управления: Код (Text): 00406DB2 _KiFastCallEntry2 mov ecx,30 00406DB7 mov fs,cx 00406DB9 mov ecx,23 00406DBE mov ds,cx 00406DC0 mov es,cx 00406DC2 mov ecx,dword ptr fs:[40] 00406DC9 mov esp,dword ptr ds:[ecx+4] 00406DCC push 23 00406DCE push edx 00406DCF pushfd 00406DD0 or byte ptr ss:[esp+1],1 00406DD5 jmp short <ntoskrnl.Kfsc10> Управление получит код Kfsc10: Код (Text): 00406E0F _KiFastCallEntry mov ecx,23 00406E14 push 30 00406E16 pop fs 00406E18 mov ds,cx 00406E1A mov es,cx 00406E1C mov ecx,dword ptr fs:[40] 00406E23 mov esp,dword ptr ds:[ecx+4] 00406E26 push 23 00406E28 push edx 00406E29 pushfd 00406E2A <Kfsc10> push 2 Тоесть если заюзоть Sysenter с взведённым TF, то в общем первые 10 инструкций в начале KiFastCallEntry() пропускаются и вызов идёт в обход твоего перехвата ) blast Скачалбы символы - удобно.
Forever, сталобыть сигнатурным поиском остаецо... на ХР и 2к можно идти от KiSystemService вниз, на остальных не знаю.
Всем спасибо за ответы! blast в ZW функциях KiSystemService, которую, например, можно получить перехватив любой Nt вызов и вернуться по стеку или по сигнатурам из ntoskrnl.exe Clerk Ничего я перехватывать не хочу. Я пишу драйвер для востановления системы (SSDT, SSDT shadow, IDT, SYSENTER и т.д.) FreemanВидимо только это. ClerkСпасибо за код, посмотрим, попробуем.
Mad666 ИМХО задача поиска для многих не экспортируемых функций/переменных слишком сложна и не универсальна. У меня был вариант посмотреть в сторону отладочных символов(нтос у меня занимает ~4М).