首页
社区
课程
招聘
[求助]关于inline hook ObReferenceObjectByHandle蓝屏
发表于: 2009-12-27 01:41 4639

[求助]关于inline hook ObReferenceObjectByHandle蓝屏

2009-12-27 01:41
4639
近来学习进程保护,写了个代码,结果一旦满足条件就蓝屏,请大牛指点

代码片段如下
////////////////////// MyObReferenceObjectByHandle /////////////////////////////////////////////////
__declspec(naked)  MyObReferenceObjectByHandle(
    IN HANDLE  Handle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_TYPE  ObjectType  OPTIONAL,
    IN KPROCESSOR_MODE  AccessMode,
    OUT PVOID  *Object,
    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
    )
{
        __asm
        {
        ///////////////执行原先被修改的字节码
                mov     edi,edi
                push    ebp
                mov     ebp,esp
        // 因为调用了我们这个函数,所以栈现在的情况是
        // 参数1-->>参数2-->>参数3-->>参数4-->>参数5-->>参数6-->>返回地址-->>老的EBP(push    ebp)
        // 执行完mov     ebp,esp 后,ebp指向了栈顶,这个时候我们就可以用ebp来引用参数了
        // 如下面的push   [ebp+0x1c]就是用ebp来引用栈中参数
        // 保存相关寄存器的值
                pushad

                push   [ebp+0x1c]
                push   [ebp+0x18]
                push   [ebp+0x14]
                push   [ebp+0x10]
                push   [ebp+0xc]
                push   [ebp+8]
          
        //开始调用过滤函数
                mov    eax, ObjectType
                push   eax
                mov    eax, Handle
                push   eax
                call   FilterFunction1   
                cmp   eax,1    //是否匹配 <----------一旦这里相等跳到end处就会蓝掉
        //上面的这个过程可以看做是透明的..虽然有很多push..但不会影响到我们的栈
                jz     end  
        //过滤不匹配...调用原来的地址+5个字节.ObReferenceObjectByHandle正常执行
                mov   eax,ObReferenceObjectByHandle      
                add   eax,5            
                jmp   eax
        //否则   
        end:
                popad
        /*   mov   [ebp+8],-1 //--------->>无效句柄
           mov   eax,ObReferenceObjectByHandle      
           add   eax,5            
           jmp   eax    */
        //下面我们用栈会溯来解决问题
                mov esp,ebp //esp指向栈顶
                pop ebp      //ebp指向原来的栈底
                mov eax, 0xC0000022L; //STATUS_ACCESS_DENIED = 0xC0000022L
                ret 0x18 //返回..0x18 == 24 == 6个参数*4个字节 这样esp才能指向正常.程序才不会崩溃
        ///这个地方也可以用来抵抗调试..这样肯定会到XX去..
        }
}

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己占沙发
注 :代码是参考sysnap大牛的代码
2009-12-27 01:43
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请参考sd老师的代码
2009-12-27 09:43
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
曾经写过一次,因为效率问题(系统调用 ObReferenceObjectByHandle 是很频繁的)使用了大量内联汇编,不知道对你有帮助没:
http://bbs.pediy.com/showthread.php?t=95248
2009-12-27 13:57
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢,我先试试看
2009-12-27 16:42
0
游客
登录 | 注册 方可回帖
返回
//