Прочитал цикл статей про сплайсинг, решил попробовать с ZwTermnateProcess, но почему-то не работает код: Code (Text): typedef struct TermProcessCode { UCHAR First; PVOID Next; UCHAR Last; } OldTerminateProcessCode , *pOldTerminateProcessCode; typedef struct Jm { UCHAR Jmp; PVOID Adress; } JmpOp , *pJmpOp; PVOID NewTerminateProcessAddr; OldTerminateProcessCode OldCode; UNICODE_STRING ToHook; ............................ ............................ RtlInitUnicodeString(&ToHook,L"ZwTerminateProcess"); .......................... VOID HOOK() { pOldTerminateProcessCode OriginalCode; pJmpOp NewCode; ULONG CR0Reg; OriginalCode = (pOldTerminateProcessCode)MmGetSystemRoutineAddress(&ToHook); NewCode = (pJmpOp) MmGetSystemRoutineAddress(&ToHook); if(OriginalCode == NULL || NewCode == NULL) { DbgPrint ("ERROR INCORRECT ADDR\n"); return STATUS_UNSUCCESSFUL; } NewTerminateProcessAddr = MyFunc; __try { __asm { cli mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0, eax } OldCode.First = OriginalCode->FirstPart; OldCode.Next = OriginalCode->TwoPart; OldCode.Last = OriginalCode->NextPart; NewCode->Jmp = 0xE9; // jmp NewCode->Adress = NewTerminateProcessAddr; __asm { mov eax, CR0Reg mov cr0, eax sti } return STATUS_SUCCESS; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_UNSUCCESSFUL; } } Это сам хук, видимо что-то неправильно в нём, потому что код моей ф-ции не выполняется. Посмотрите пожайлуста.
Code (Text): typedef struct TermProcessCode { UCHAR First; PVOID Next; UCHAR Last; } OldTerminateProcessCode , *pOldTerminateProcessCode; typedef struct Jm { UCHAR Jmp; PVOID Adress; } JmpOp , *pJmpOp; PVOID NewTerminateProcessAddr; OldTerminateProcessCode OldCode; UNICODE_STRING ToHook; ............................ ............................ RtlInitUnicodeString(&ToHook,L"ZwTerminateProcess"); .......................... NTSTATUS HOOK() { pOldTerminateProcessCode OriginalCode; pJmpOp NewCode; ULONG CR0Reg; OriginalCode = (pOldTerminateProcessCode)MmGetSystemRoutineAddress(&ToHook); NewCode = (pJmpOp) MmGetSystemRoutineAddress(&ToHook); if(OriginalCode == NULL || NewCode == NULL) { DbgPrint ("ERROR INCORRECT ADDR\n"); return STATUS_UNSUCCESSFUL; } NewTerminateProcessAddr = MyFunc; __try { __asm { cli mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0, eax } OldCode.First = OriginalCode->FirstPart; OldCode.Next = OriginalCode->TwoPart; OldCode.Last = OriginalCode->NextPart; NewCode->Jmp = 0xE9; // jmp NewCode->Adress = NewTerminateProcessAddr; __asm { mov eax, CR0Reg mov cr0, eax sti } return STATUS_SUCCESS; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_UNSUCCESSFUL; } } Фиксед
shinigami1 Разумно спросить варианты решения задачи, а не проблемы решения которое вы нашли, ибо оно не лучшее Итак по порядку. 1. Отключение аппаратной защиты страниц, сбросом бата WP. Ваш код юзается на нулевом IRQL, это значит что память выгружаемая, а обработчик может быть где угодно(хотя нормально секции кода ядра не свопятся). Более того, вы запрещеате прерывания, а это эквиваленнтно высочайшему уровню IRQL(0xFF). Посему всегда обращайтесь к памяти перед подобной манипуляцией(перед Cli), просто попыткой чтения её. Иначе это может вызвать крах. 2. Это относительное ветвление, а не абсолютное(Far), посему следует записать смещение относительно инструкции, а не относительно базы сегмента. 3. Атомарно изменяйте код посредством lock cmpxchg8b. Иначе иной поток(на другом камне) может выполнить не до конца изменённую инструкцию, что приведёт к краху.
Clerk, а адрес процедуры я правильно получаю? Просто у меня такое ощущение что я вообще пишу чёрт знает куда, ибо ни бсодов ни соощений debugview не наблюдается
Понял, попробую реализовать все рекомендации. з.ы. На семёрке как я понял сплайсинг единственный способ перехвата Api ядра?
Code (Text): _declspec(dllimport) NTSTATUS ZwTerminateProcess ( IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus ); PVOID OrigFuncAddres =&ZwTerminateProcess; ....................... NTSTATUS HOOK() { pOldTerminateProcessCode OriginalCode; pJmpOp NewCode; ULONG CR0Reg; OriginalCode = (pOldTerminateProcessCode)OrigFunction; NewCode = (pJmpOp) OrigFunction; __try { OrigFuncAddres =&ZwTerminateProcess; __asm { cli mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF mov cr0, eax } OldCode.First = OriginalCode->FirstPart; OldCode.Next = OriginalCode->TwoPart; OldCode.Last = OriginalCode->NextPart; NewCode->Jmp = 0xE9; // jmp NewCode->Adress = (PVOID) ((ULONG)NewZwTerminateProcessAddr-(ULONG)OrigFuncAddres-5); __asm { mov eax, CR0Reg mov cr0, eax sti } return STATUS_SUCCESS; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_UNSUCCESSFUL; } } Немного подправил, всё равно не переходит на мою ф-цию, мне кажется что я адрес ZwTerminateProcess неправильно получаю.
вот же -> Code (Text): NewCode->Adress = (PVOID) ((ULONG)NewZwTerminateProcessAddr-(ULONG)OrigFuncAddres-5); Где -> NewZwTerminateProcessAddr = MyFunction; , адрес моей ф-ции.
с отладчиком тоже трабл есть, softice к сожалению никак не хочет работать - при запуске ntice.bat выдаёт System error 1058 has occurred. The service cannot be started, either because it is disabled or because it has no enabled devices ssociated with it.