郁金香过驱动教程45课内联hook有蓝屏的bug,不知道大家有没有遇到,我把我遇到的bug解决了贴出来和大家一起学习研究。
出错函数:extern "C" NTSTATUS __declspec(naked) __stdcall MyNtOpenProcess修改如下:
//定义此宏将EBP保存能避免蓝屏但获取的PID不正确一直是8,不定义此宏是源代码我这边会蓝屏
#define PUSHEBP
// 自定义的NtOpenProcess函数 ZwOpenProcess
#pragma PAGECODE
NTSTATUS __declspec(naked) __stdcall MyNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId )
{
#ifdef PUSHEBP
__asm{
push ebp
mov ebp,esp
pushad
pushfd
}
NTSTATUS rc;
if( (ClientId != NULL) )
{
HANDLE PID = ClientId->UniqueProcess;
LONG testPid = LONG(ClientId->UniqueProcess);
KdPrint(( "MyNtOpenProcessPid------------------------- PID=%u--------------\n",testPid ));
// 如果是被保护的PID,则拒绝访问,并将句柄设置为空
if(PID == MyPID)
{
KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
//调试输出 类似C语言的 Printf
ProcessHandle = NULL; //这个是关键
rc = STATUS_ACCESS_DENIED; //这个返回值
//PsLookupProcessByProcessId((ULONG)PID,&EP);
EP=PsGetCurrentProcess();
KdPrint((" ACESS Process Name --:%s-- \n",(PTSTR)((ULONG)EP+0x174)));
__asm
{
popfd
popad
mov esp,ebp
pop ebp
retn 0x10
}
}
}
__asm
{
popfd
popad
mov esp,ebp
pop ebp
push 0C4h
mov eax,RealNtOpenProcess //
add eax,5
jmp eax
}
#else
NTSTATUS rc;
if( (ClientId != NULL) )
{
HANDLE PID = ClientId->UniqueProcess;
KdPrint(( "------------------------- PID=%d--------------\n",(int*)PID ));
// 如果是被保护的PID,则拒绝访问,并将句柄设置为空
if(PID == MyPID)
{
KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
//调试输出 类似C语言的 Printf
ProcessHandle = NULL; //这个是关键
rc = STATUS_ACCESS_DENIED; //这个返回值
//PsLookupProcessByProcessId((ULONG)PID,&EP);
EP=PsGetCurrentProcess();
KdPrint((" ACESS Process Name --:%s-- \n",(PTSTR)((ULONG)EP+0x174)));
__asm
{
retn 0x10
}
}
}
__asm
{
push 0C4h
mov eax,RealNtOpenProcess //
add eax,5
jmp eax
}
#endif
//return rc;
}
希望能帮到和我一样的菜鸟~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!