首页
社区
课程
招聘
[旧帖] SSDT 内联HOOK 蓝屏了帮看下 0.00雪花
发表于: 2011-10-21 22:47 5811

[旧帖] SSDT 内联HOOK 蓝屏了帮看下 0.00雪花

2011-10-21 22:47
5811
加载SYS , 打开一个笔记本 进程 看下PID  然后运行EXE 程序填写PID
之后就蓝屏了
帮看下
在 hook.h  里的 MyNtOpenProcess 函数里的  __asm
                        {
                                retn 0x10
                        }
retn 这句 蓝屏的   写0x14也蓝
是不是堆栈没有平衡??

extern "C" NTSTATUS __declspec(naked) __stdcall MyNtOpenProcess(
        OUT     PHANDLE ProcessHandle,
        IN     ACCESS_MASK DesiredAccess,
        IN     POBJECT_ATTRIBUTES ObjectAttributes,
        IN     PCLIENT_ID ClientId )
{
        NTSTATUS     rc;
        HANDLE       PID;

        //KdPrint(("++++++++++++Entry MyNtOpenProcess int   ++++++++++++++\n"));  

        //rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );        

        if( (ClientId != NULL) )
        {
                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
                        }

                }

代码 下载!!! InLineHook SSDT .rar

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
囧~~~naked函数不是这样写的~~~把naked和后面的内联汇编去掉~~~
2011-10-21 23:19
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也觉得后面的内联汇编得去掉
2011-10-22 09:11
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那返回值怎么写
2011-10-22 09:59
0
雪    币: 27
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用naked如果不自己处理的话,ebp的值并非指向栈底,但是系统还是会将ebp当成栈底来存放局部变量。所以,用naked要自己管理堆栈。push ebp;mov ebp,esp必不可少。

而且,我不知道你为什么要用naked,能带来什么好处。
2011-10-23 23:51
0
雪    币: 213
活跃值: (1190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不知道楼主的问题解决了吗?我这里也遇到了同样的情况
2012-5-26 14:34
0
雪    币: 36
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
回复看钱
2012-5-31 09:29
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
__declspec(naked)  删掉,如果你最后一句是jmp  原来的函数,那么需要这个申明,否则不需要

      __asm
       {
         retn 0x10
       }

改成 return    rs;

还有 extern "C" 是干嘛的?你又不导出函数名写得这么奇怪干嘛。
直接把DDK Document的声明复制过来函数名改下就好拉。
定义成
NTSYSAPI
NTSTATUS
NTAPI
MyNtOpenProcess(
  OUT     PHANDLE ProcessHandle,
   IN     ACCESS_MASK DesiredAccess,
   IN     POBJECT_ATTRIBUTES ObjectAttributes,
   IN     PCLIENT_ID ClientId )
{
  NTSTATUS     rc;
   HANDLE       PID;

   //KdPrint(("++++++++++++Entry MyNtOpenProcess int   ++++++++++++++\n"));  

   //rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );   

   if( (ClientId != NULL) )
   {
     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)));
    }
   return rs;
}
这样不好么?
2012-5-31 11:36
0
雪    币: 870
活跃值: (1426)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

楼上正解
2012-6-1 13:49
0
游客
登录 | 注册 方可回帖
返回
//