首页
社区
课程
招聘
[求助]请教一下这段InlineHook为什么会蓝屏呢
发表于: 2015-5-4 23:42 5105

[求助]请教一下这段InlineHook为什么会蓝屏呢

2015-5-4 23:42
5105
extern "C" NTSTATUS __declspec(naked)(__stdcall MyNtOpenProcess)(
                                                    PHANDLE ProcessHandle,
                                                                                                ACCESS_MASK DesiredAccess,
                                                                                                POBJECT_ATTRIBUTES ObjectAttributes,
                                                                                                PCLIENT_ID ClientId)
{
        NTSTATUS rc;
        HANDLE PID;
        if( (ClientId != NULL) )
        {
                PID = ClientId->UniqueProcess;
                if(PID==MyPID)
                {
                        //KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
                        // 如果是被保护的PID,则拒绝访问,并将句柄设置为空
                        ProcessHandle = NULL; //这个是关键
                        rc = STATUS_ACCESS_DENIED; //这个返回值
                        __asm
                        {
                                retn 0x10   //执行保护后的返回
                        }
                }

        }

        __asm
        {
                push  0x0C4
                mov edx,RealNtOpenProcess
                add edx,5
                jmp edx
        }

}

大概一分钟左右就蓝屏。ClientId->UniqueProcess也不是这个引起的。

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
很明显,语法问题,__declspec(naked)修饰符告知编译器不需要添加任何汇编代码
再直接引用参数就会出现严重错误
2015-5-5 00:49
0
雪    币: 180
活跃值: (80)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
应该是栈平衡的问题吧,这个push 0x0C4,pop过没有啊
2015-5-5 01:05
0
雪    币: 581
活跃值: (215)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
http://blog.csdn.net/hgy413/article/details/7921776,这个应该可以解决你问题
2015-5-5 08:56
0
雪    币: 60
活跃值: (444)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
5
如果我要使用这个参数应该怎么办呢?
ClientId->UniqueProcess;
2015-5-5 19:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
栈平衡问题不说了,楼主也不会玩指针,另外这函数根本用不着裸奔的。。。
2015-5-5 23:17
0
雪    币: 60
活跃值: (444)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
7
为什么是栈平衡问题呢?该平衡哪里呢,请明示。
2015-5-6 00:04
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
先学下R3怎么玩吧,直接R0。。。眼高手低`~~`
2015-5-6 19:08
0
雪    币: 60
活跃值: (444)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
9
解决了,自己动手丰衣足食,AioliaSky的回答是正确的。
2015-5-7 21:01
0
雪    币: 6911
活跃值: (9074)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
10
有__declspec(naked) 编译器不会给你这个函数生成框架。
你用了局部变量需要开辟栈空间
_asm{
   push ebp
   mov ebp,esp
    sub esp,0x100   //这个你看着写吧,留一段栈给变量用
}
你的其他代码

返回方法:
直接返回:
_asm{
   mov esp,ebp
   pop ebp
   retn 参数字节长度
}
如果要跳回原函数:
_asm
{
   add esp,0x100  //与上面对应,要平衡
   jmp 源地址
}

大概这样吧,手写的,应该八九不离十了
2015-5-8 21:32
0
雪    币: 6911
活跃值: (9074)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
11
__asm
  {
    push  0x0C4
    mov edx,RealNtOpenProcess
    add edx,5
    jmp edx
  }
这里好像也有些问题哦。
你push干什么?改参数?该参数直接对ebp+XXX赋值啊
2015-5-8 21:35
0
游客
登录 | 注册 方可回帖
返回
//