首页
社区
课程
招聘
[旧帖] [分享]郁金香过驱动教程45课的运行蓝屏的原因 0.00雪花
发表于: 2013-7-1 23:24 2074

[旧帖] [分享]郁金香过驱动教程45课的运行蓝屏的原因 0.00雪花

2013-7-1 23:24
2074
郁金香过驱动教程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;
}

希望能帮到和我一样的菜鸟~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我都弄不到他完整的过驱动保护课程
2013-7-2 20:13
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
百度找,我就在百度找的呢,IT这个必须能找到的
2013-7-2 22:11
0
游客
登录 | 注册 方可回帖
返回
//