首页
社区
课程
招聘
[求助]请教大侠 为什么同一份驱动 在不同的系统会蓝屏(没有任何处理代码 SSDT HOOK)(问题解决 )
发表于: 2010-5-12 20:19 4710

[求助]请教大侠 为什么同一份驱动 在不同的系统会蓝屏(没有任何处理代码 SSDT HOOK)(问题解决 )

2010-5-12 20:19
4710
【求助】请教大侠 为什么同一份驱动 在不同的系统会蓝屏(没有任何处理代码 SSDT HOOK)  

XP 下 没有任何问题

WIN2003 下 HOOK 位置正确 执行返回正确

他会有 几个 cli 不知道 那出来的 中断 然后 调式器 接受到 F5 几次 就正常了

我没有任何处理 代码 也这样 如果挂调式器 蓝屏

错误处为 服务号 出现了变化 2003系统为 0X37 感谢下面的 大侠指点 不胜感激

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef NTSTATUS (*_NtCreateThread)(
                                                                        OUT PHANDLE             ThreadHandle,
                                                                        IN ACCESS_MASK          DesiredAccess,
                                                                        IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
                                                                        IN HANDLE               ProcessHandle,
                                                                        OUT PCLIENT_ID          ClientId,
                                                                        IN PCONTEXT             ThreadContext,
                                                                        IN PINITIAL_TEB         InitialTeb,
                                                                        IN ULONG              CreateSuspended
                                                                        );
_NtCreateThread Old_MyNtCreateThread;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
VOID FFCON()
{
        __asm{//去掉内存保护
                cli
                        mov  eax,cr0
                        and  eax,not 10000h
                        mov  cr0,eax
        }
}

VOID FFCoff()
{
        __asm{//恢复内存保护  
                mov  eax,cr0
                        or   eax,10000h
                        mov  cr0,eax
                        sti
        }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NTSTATUS DriverEntry(
                                         PDRIVER_OBJECT pDriverObj,
                                         PUNICODE_STRING pRegistryString
                                         )
{
       
       
        dprintf("[驱动注入DLL] DriverEntry\n");
       
        //分发函数
       
        pDriverObj->DriverUnload = DriverUnload;
       
       
       
       
        hook();
       
        return STATUS_SUCCESS;
}

VOID DriverUnload(
                                  PDRIVER_OBJECT pDriverObj
                                  )
{       
        Unhook();
       
        dprintf("[驱动注入DLL] Unloaded\n");
}

///////////////////////////////////////////////////////////////////////////////

ULONG NtCreateThreadAddress;//原来的服务地址

ULONG HOOKNtCreateThread; //SSDT 表地址

////////////////////////////////////////////////////////////////////////////////
VOID hook()
{
       
        HOOKNtCreateThread = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x35 * 4;
        NtCreateThreadAddress = *(ULONG*)HOOKNtCreateThread;
       
        Old_MyNtCreateThread=(_NtCreateThread)NtCreateThreadAddress;
        DbgPrint("NtCreateThreadAddress :0x%08X \n",NtCreateThreadAddress);
       
        FFCON();
       
        *((ULONG*)HOOKNtCreateThread) = (ULONG)MYNtCreateThread;
       
        FFCoff();
       
       
       
}

VOID Unhook()
{
        FFCON();
       
        *((ULONG*)HOOKNtCreateThread) = (ULONG)NtCreateThreadAddress;
       
        FFCoff();
        DbgPrint("Unhook \n");
}

////////////////////////////////////////////////////////////////////////////////////////////////////

NTSTATUS MYNtCreateThread(
                                                  OUT PHANDLE             ThreadHandle,
                                                  IN ACCESS_MASK          DesiredAccess,
                                                  IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
                                                  IN HANDLE               ProcessHandle,
                                                  OUT PCLIENT_ID          ClientId,
                                                  IN PCONTEXT             ThreadContext,
                                                  IN PINITIAL_TEB         InitialTeb,
                                                  IN ULONG              CreateSuspended)
{
       
       
        return        Old_MyNtCreateThread(ThreadHandle,
                                                         DesiredAccess,
                                                         ObjectAttributes OPTIONAL,
                                                         ProcessHandle,
                                                         ClientId,
                                                         ThreadContext,
                                                         InitialTeb,
                                                         CreateSuspended);
       
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
挂钩、卸载时使用InterXXX系列函数,多核上你这个可能不稳定……还有服务号码可能不对了,你没有更新来反映2003的变化
2010-5-12 20:52
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢帮助 2003 服务号 是0X 37 太谢谢你了
2010-5-12 21:43
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
服务号硬编码了~~
2010-5-13 22:15
0
游客
登录 | 注册 方可回帖
返回
//