всем привет. я перехватываю обработчик sysenter'a вот так : Код (Text): VOID installhook(){ __asm mov ecx, 0x176 __asm rdmsr __asm mov d_origKiFastCallEntry, eax __asm mov eax, MyKiFastCallEntry __asm wrmsr } и обрабатываю : Код (Text): static _declspec(naked) ProcessSyscall(ULONG num){ DbgPrint("sysenter called\n"); } static _declspec(naked) MyKiFastCallEntry(){ __asm pushad __asm pushfd __asm push fs __asm push ds __asm push es __asm push 30h __asm pop fs __asm call ProcessSyscall __asm pop es __asm pop ds __asm pop fs __asm popfd __asm popad __asm jmp d_origKiFastCallEntry } но не могу понять, почему этот код бсодит. если вместо дбгпринта ставить просто ret то все отлично. но стоит сделать колл на любую АПИ, как система слетает. что я не учел ? бсод обычно либо такой : BugCheck F7, {49, bb40, ffff44bf, 0} либо тестовая система (win 2003 sp1) виснет так что даже не брякается по команде из windbg
подредактировал маленько ога. в аттаче проэкт полный. Код (Text): static _declspec(naked) ProcessSyscall(ULONG num){ DbgPrint("sysenter called\n"); __asm ret; } static _declspec(naked) MyKiFastCallEntry(){ __asm pushad __asm pushfd __asm push fs __asm push ds __asm push es __asm mov dx, 0x30 __asm mov fs, dx __asm call ProcessSyscall __asm pop es __asm pop ds __asm pop fs __asm popfd __asm popad __asm jmp d_origKiFastCallEntry } чета не цепляет аттач... http://slil.ru/25301342
пробовал. пробовал смареть что в ЕАХ, е если там был номер ф-ции ZwClose то дбгпринтил... но всеравно БСОД. причем сначала в дебагере появлялся принт, а потом бсод.
patolog проблема cкорее всего в стеке sysenter изменяет ESP, но это значение не определяет стек ядра текущего процесса его еще надо получить вызов сторонней функции может требовать стек ядра процесса, но т. к ESP невалиден, получаем BSOD этим можно объяснить нормальное выполнение кода в случае, если сторонняя функция ядра не вызывается http://www.wasm.ru/forum/viewtopic.php?pid=187193#p187193
Странно.Попробуй так.Это работает на XP SP2 и скорее всего будет работать и у тебя. Код (Text): new_SysCall: pusha pushf push fs push ds push es mov ax, 30h mov dx, 23h mov fs, ax mov ds, dx mov es, dx mov edx, large fs:124h mov edx, [edx+44h] push edx push offset Format ; "eprocess %X",0 call DbgPrint add esp, 8 pop es pop ds pop fs popf popa jmp old_SysCall А вот если захочешь добраться до стека,придется сделать как советует rei3er : Код (Text): ; ; When we trap into the kernel via fast system call we start on the DPC stack. We need ; shift to the threads stack before enabling interrupts. ; mov ecx, PCR[PcTss] ; mov esp, [ecx]+TssEsp0 З.Ы. А кто знает,как можно заставить KiFastCallEntry вернуть управление в драйвер [чтобы узнать результат ф-ии] а не выйти в r3 по sysexit?
TheDeath У меня такой код на SP2 блюскринит. Если сделать DbgPrint один единственный раз, то система просто перегружается. Другой вопрос - допустим хочу сделать другой обработчик для некой функции API. Как можно поставить jmp NewApiFunc? Пробовал всякие варианты - результат один - Blue Screen. Судя по всему обработчик sysenter делает еще что то (?)
смотреть, каким образом и где KiFastCallEntry сохраняет адрес возврата кроме того, для успешного перехвата sysexit целевой код должен быть отображен на адресное пространство ядра через PTE c установленным битом U либо можно модифицировать дескриптор PF в IDT
у меня на сп2 код бсоданул тоже. интересен еще вот какой факт. узнаем адрес оригинального диспатчера. палим дизасм по адресу, видим mov ecx, 0x00000020 //5 байт и в своем диспатчере делаем : Код (Text): new_SysCall: mov ecx, 0x00000020 jmp old_SysCall+5 и получам бсод(
да, я смарел в виндбг, а сверял с оригинальным сорсом Код (Text): PUBLIC _KiFastCallEntry2 _KiFastCallEntry2: ; ; Sanitize the segment registers ; mov ecx, KGDT_R0_PCR mov fs, ecx mov ecx, KGDT_R3_DATA OR RPL_MASK mov ds, ecx mov es, ecx
katrus Странно.Тогда почему у меня работает? В аттаче дров на скорую руку.Запускай dbgview в vmware и смотри.При остановке с вероятностью 1/3 bsod.Понятно,почему rei3er Это понятно,но какой извращенный способ. В зависимости от MmUserProbeAddress адрес возврата через sysexit в ntdll или опять в ядро. Пока решил эту проблему сплайсингом в сам KiFastCallEntry Код (Text): mov esi, edx mov ebx, [edi]+SdNumber xor ecx, ecx mov cl, byte ptr [ebx+eax] mov edi, [edi]+SdBase mov ebx, [edi+eax*4] sub esp, ecx shr ecx, 2 ; jmp в мой драйвер, и оттуда уже в kss60 mov edi, esp cmp esi, _MmUserProbeAddress jae kss80 KiSystemServiceCopyArguments: rep movsd ; ; Make actual call to system service ; kssdoit: call ebx ; call system service kss60:
хм..) у меня лично на ХР сп2 и вин 2к3 бсоднуло) Код (Text): DRIVER_OVERRAN_STACK_BUFFER (f7) A driver has overrun a stack-based buffer. This overrun could potentially allow a malicious user to gain control of this machine. DESCRIPTION A driver overran a stack-based buffer (or local variable) in a way that would have overwritten the function's return address and jumped back to an arbitrary address when the function returned. This is the classic "buffer overrun" hacking attack and the system has been brought down to prevent a malicious user from gaining complete control of it. Do a kb to get a stack backtrace -- the last routine on the stack before the buffer overrun handlers and bugcheck call is the one that overran its local variable(s). Arguments: Arg1: d7171430, Actual security check cookie from the stack Arg2: 0000bb40, Expected security check cookie Arg3: ffff44bf, Complement of the expected security check cookie Arg4: 00000000, zero