неработает (читай : бсодит с ошипкой "BUGCHECK: 30 SET_OF_INVALID_CONTEXT") сделущий кодес: Код (Text): Context.ContextFlags = CONTEXT_FULL; Status = Int2eCall(0x55 /*NtGetContextThread*/, hThread, &Context); DbgPrint("[SwitchEIP] : NtGetContextThread() returns %p\n", Status); DbgPrint("[SwitchEIP] : Target EIP is %p\n", Context.Eip); Status = Int2eCall(0x0D5 /*NtSetContextThread*/, hThread, &Context); DbgPrint("[SwitchEIP] : NtSetContextThread() returns %p\n", Status); в умных доках написано что NtSetContextThread не может менять SS:SP, CS:IP, FLAGS, BP. и првда - я ставлю CONTEXT_INTEGER и все пашет. но как работает в таком случае юзермодные кодесы которые меняют EIP ? все вродь также. проверок нет никаких странных там : Код (Text): BOOL APIENTRY SetThreadContext( HANDLE hThread, CONST CONTEXT *lpContext ) { NTSTATUS Status; Status = NtSetContextThread(hThread,(PCONTEXT)lpContext); if ( !NT_SUCCESS(Status) ) { BaseSetLastNTError(Status); return FALSE; } else { return TRUE; } }
посмарел под отладчегом. вот что выдал анализ бсода : Код (Text): SI>lastfault -a BUGCHECK: 30 SET_OF_INVALID_CONTEXT The stack pointer in a trap frame had an invalid value. This bug check occurs when some routine attempts to set the stack pointer in the trap frame to a lower value than the current stack pointer value. If this error were not caught, it would cause the kernel to run with a stack pointer pointing to stack which is no longer valid. Parameter 1 : 0x0006fde0 New stack ptr Parameter 2 : 0xf515edd8 Old stack ptr Parameter 3 : 0xf515ed64 Trap Frame Probably caused by : 0x00870000 TrapFrame Address : 0xf515ed64 Context Instruction Ptr Stack Ptr Frame Ptr Parameters Function Table Status ----------------------------------------------------------------------------------------------------------------------- 0x00870000 0x00870000 0xf515edd8 0xf515edd4 EBP Return address is not in any image. Stack Frame Information for 0x00870000 on thread(160) Count: 16 Name Value -------------------- eax 0x74725960 ebx 0x0 ecx 0x3 edx 0x44000 esi 0x6fee8 edi 0x1014018 eip 0x870000 esp 0xf515edd8 ebp 0xf515edd4 eflags 0x246 cs 0x18 ds 0x23 es 0x23 fs 0x3b gs 0x0 ss 0x0 00870000 push ebp 00870001 mov ebp, esp 00870003 push ebx 00870004 push esi 00870005 push edi 00870006 int 03 00870007 call 008700d7 // 0x008700d7 SI>stack Context Instruction Ptr Stack Ptr Frame Ptr Status --------------------------------------------------------------------------------------------------------------- ntkrnlpa!_Section.text+0x21176 0x804f9176 0xf515eaa0 0xf515ea9c ntkrnlpa!_Section.text+0x21c37 0x804f9c37 0xf515eaa4 0xf515eabc ntkrnlpa!_Section.text+0x2582a 0x804fd82a 0xf515eac4 0xf515eae0 ntkrnlpa!_Section.text+0x25d86 0x804fdd86 0xf515eae8 0xf515eb00 ntkrnlpa!_SectionPAGE+0x6e38e 0x805d638e 0xf515eb08 0xf515eb1c ntkrnlpa!_SectionPAGE+0x6e3d1 0x805d63d1 0xf515eb24 0xf515eb3c ntkrnlpa!_Section.text+0x26bb5 0x804febb5 0xf515eb44 0xf515eb8c ntkrnlpa!_Section.text+0x2ab35 0x80502b35 0xf515eb94 0xf515ebcc ntkrnlpa!_Section.text+0x2a2b6 0x805022b6 0xf515ebd4 0xf515ec2c ntkrnlpa!_Section.text+0x2ab35 0x80502b35 0xf515ec34 0xf515ec6c win32k!_Section.text+0x2b44 0xbf802ec4 0xf515ec74 0xf515eca8 win32k!_Section.text+0x1728 0xbf801aa8 0xf515ecb0 0xf515ecec win32k!_Section.text+0xed86 0xbf80f106 0xf515ecf4 0xf515ed4c ntkrnlpa!_Section.text+0x6860c 0x8054060c 0xf515ed54 0xf515ed64 0x00870000 0x00870000 0xf515edd8 0xf515edd4 Return address is not in any image. -------------------------------- однако кодес от такой : Код (Text): Context.ContextFlags = CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS|CONTEXT_FLOATING_POINT|CONTEXT_EXTENDED_REGISTERS; Status = Int2eCall(0x55 /*NtGetContextThread*/, hThread, &Context); DbgPrint("[SwitchEIP] : NtGetContextThread() returns %p\n", Status); DbgPrint("[SwitchEIP] : Target EIP is %p\n", Context.Eip); DbgPrint("[SwitchEIP] : Target EIP is %p\n", Context.Eip); DbgPrint("[SwitchEIP] : Target ESP is %p\n", Context.Esp); DbgPrint("[SwitchEIP] : Target EBP is %p\n", Context.Ebp); DbgPrint("[SwitchEIP] : Target SS is %p\n", Context.SegSs); DbgPrint("[SwitchEIP] : Target DS is %p\n", Context.SegDs); DbgPrint("[SwitchEIP] : Target CS is %p\n", Context.SegCs); DbgPrint("[SwitchEIP] : Target FS is %p\n", Context.SegFs); говорит что все вроде тру : Код (Text): NtGetContextThread() returns 00000000 Target EIP is 7C90EB94 Target EIP is 7C90EB94 Target ESP is 0006FDE0 Target EBP is 0006FDFC Target SS is 00000023 Target DS is 00000023 Target CS is 0000001B Target FS is 0000003B
patolog Вообще достаточно флага CONTEXT_FULL А так - потренься в юзермоде вначале А еще проверь вариант с аттачем (то есть KeAttach к процессу. и изменить , находясь в его контексте)
patolog Обязательно проверю. Самому интересно. Как будет возможность правда Но почему то мне кажется, что с Аттачем точно должно работать .