Код выполняется в модуле ntoskrnl.exe в секции '.text', управление на него передаётся из UserMode посредством Call far. На первой инструкции - BSOD. Windows XP Kernel Version 2600 (Service Pack 2) MP (2 procs) Free x86 compatible Kernel base = 0x804d7000 PsLoadedModuleList = 0x805644a0 ******************************************************************************* * Bugcheck Analysis * ******************************************************************************* Bugcheck code 1000008E Arguments 80000004 8054d185 b2106d5c 00000000 ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. 0012ffb0 00801193 00000000 00000000 00000000 ntoskrnl+0x76185 0012fff0 00000000 00801188 00000000 00000000 0x801193 eax=00000000 ebx=8054d185 ecx=0012fe84 edx=00000048 esi=00801084 edi=0012ff32 eip=8054d185 esp=b2106dd0 ebp=0012ffb0 iopl=0 nv up ei pl nz na po nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206 ntoskrnl+76185: 8054d185 fa cli ******************************************************************************* * EFlags * ******************************************************************************* EFLAGS_IF equ 0000000000001000000000b ;Interrupt Flag
Clerk ну ты замутил систему вроде это Bug Check 0x8E: KERNEL_MODE_EXCEPTION_NOT_HANDLED а вот почему пусть спецы скажут
а разве можно прыгать так далеко и так просто? по-моему обращение в системную область памяти из юзермода и должно вызывать исключение не даром же ntdll.dll спроецирована и туда и сюда как вариант имхо переходничок на подобие ntdll.dll сделать, или тоже пропатчить
Суть в следующем. Если я выделяю память с помощью ZwAllocateVirtualMemory и туда записываю обработчик, то при смене кольца иногда он выполняется, а иногда падает с STATUS_IRQL_LESS_OR_EQUAL, видимо потомучто память выгружаемая. Попытался залочить через ZwLockVirtualMemory, при выполнении сразу падает. Я решил записать обработчик в свободное место в ntos, в секцию кода, где места достаточно. Вызываю - BSOD. С этим проблемы, в варе не работает, там вообще фигня происходит.
Во-первых, селектор, используемый в call far должен обладать спецсвойствами (чтобы его юзать из ринг3). Во-вторых, Zw* функции оперируют с памятью в ринг3 (причем персонально для адресного пространства процесса), в ринг0 адреса могут быть другими. В-третьих, нужно убедиться, что виртуальным адресам соответствуют физические (и из RAM). Т.е. вируальный адрес может быть зарезервирован (в адресном пространстве процесса), но ему нет соответствия физической памяти в каталоге страниц => эксепшн. Ну и права у данной страницы должны быть соответствующие (на выполнение). Нужен код или более подробное описание самого процесса