首页
社区
课程
招聘
[求助]把ObReferenceObjectByHandle HOOK了咋个还是不能防止进程被结束呢?
发表于: 2009-3-5 10:06 12967

[求助]把ObReferenceObjectByHandle HOOK了咋个还是不能防止进程被结束呢?

2009-3-5 10:06
12967
前段时间拜读了Sysnap  的
<简单inline hook ObReferenceObjectByHandle保护进程和屏蔽文件执行>

觉得这个函数很是方便  于是准备实现下
但是实现方法有所不同 , Sysnap的方法有些麻烦
我就干脆直接把ObReferenceObjectByHandle的最后7个字节给改了
然后在判断是不是我们要保护的进程,不是就把原状态返回
是就返回个 c0000008(STATUS_INVAILD_HANDLE)

但是没发防止进程被结束~~到底怎么回事咧?哪里出错了?

关键代码如下

int
AyObReferenceObjectByHandle(
    IN HANDLE  Handle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_TYPE  ObjectType  ,
    IN KPROCESSOR_MODE  AccessMode,
    OUT PVOID  *Object,
    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  
    )
{
       
        //NTSTATUS status = STATUS_SUCCESS  ;
        ULONG PID , i , count = 0 ;
        unsigned char *ProName , ImaName[] = "INSTDRV.EXE" ;

        if( ObjectType != *PsProcessType)
                return   0 ;

        ProName = (unsigned char *)(*Object)+GetPlantformDependentInfo(OFFSET_EPROCESS_IMAGENAME) ;
        /*for( i = 0 ; i < 16 ; i++ , ProName++ )
        {
                if( *ProName == ImaName[i] )
                        count++ ;
                if( *ProName == '\0' && ImaName[i] == '\0' )
                        break ;
        }
        */
       
        PID = (ULONG)((unsigned char *)(*Object)+GetPlantformDependentInfo(OFFSET_EPROCESS_PID)) ;
        //DbgPrint("process PID %x\n" , PID) ;

        if( strlen(ProName) == RtlCompareMemory( ProName , &ImaName[0] , strlen(ProName) ) )
        {
                DbgPrint("name:%s" , ProName) ;
                DbgPrint("PID:%d" , PID) ;
                DbgPrint("STATUS_INVALID_HANDLE        :%x", STATUS_INVALID_HANDLE        ) ;
                return 1 ;
        }
        //DbgPrint("AyHook For ObReferenceObjectByHandle\n") ;
        return 0 ;
}

__declspec(naked)
T_ObReferenceObjectByHandle( )
{
        __asm
        {
                push eax
                push [ebp+1ch]
                push [ebp+18h]
                push [ebp+14h]
                push [ebp+10h]
                push [ebp+0ch]
                push [ebp+08h]
                call AyObReferenceObjectByHandle ;应该是以ret 18h返回 调用完ebp指针跟原先不变
                pop edx //弹出原先eax的值到edx
                cmp eax , 1
                jnz end
                mov edx , 0xC0000008L
        //        mov [ebp+18h] , 0x0L
end :
                mov eax , edx
                pop edi
                pop esi
                pop ebx
                _emit 0xc9  //leave
                ret 18h
        }
       
}

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

收藏
免费 0
支持
分享
最新回复 (35)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
mov [ebp+18h],0L那一句有问题,你把指针给清零了,但指针指向的内容没有变啊。应该是mov eax,[ebp+18h]    mov  [eax],0
2009-3-5 12:34
0
雪    币: 66
活跃值: (940)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个东东不稳定。容易BSOD
2009-3-5 15:24
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
引用某人的一句话:稳定不稳定,关键看你怎么实现!
2009-3-5 15:39
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
发现楼猪的马甲了。
2009-3-5 15:45
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=achillis;587174]mov [ebp+18h],0L那一句有问题,你把指针给清零了,但指针指向的内容没有变啊。应该是mov eax,[ebp+18h]    mov  [eax],0[/QUOTE]

我忘了删了~~呵呵  那句之前没有的
我为了看看返回无效句柄状态的时候那个object是不是还会被继续引用才加上的~
结果是蓝了  也就是说传了STATUS_INVAILD_HANDLE  object还是会被引用~晕死~
2009-3-5 16:34
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
那你不如直接看WRK呢~
2009-3-5 16:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
wrk看过了  不过没法解决问题~~逻辑上来说在ntterminateprocess中ObReferenceObjectByHandle调用失败就退出了  也就是进程结束就终止了
2009-3-5 22:14
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
9
主要应该是你的code inline太挫了钩错了地方导致人家仍然成功返回了~
2009-3-5 23:27
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
为什么说钩错地方了?
我看还好啊 只有这里有返回嘛 mj指点一下。。。
2009-3-6 12:17
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
代码很多问题
不要细看就知道很容易蓝
还有这句明显有问题
if( ObjectType != *PsProcessType)
这里会漏掉很多,应该从*Object里去取Type
2009-3-6 12:23
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我先说明下 ,我只要实现进程保护而已  而在NtTerminateProcess中的确是传了PsProcessType这个参数进来的  否则我每次关进程的时候dbgprint的语句是不会打印的

不过楼上的说法很有道理....  这么做的确很容易被绕过~我只是贪图提高效率~所以没做处理~

至于9楼的发言  我可以说我的hook应该还是正确的 我也跟了下
在NtTerminateProcess中调用ObReferenceObjectByHandle后的确跳到了我的处理函数
我的处理函数也的确返回了个c0000008回去  而NtTerminateProcess函数也跟我预想的一样
直接test eax,eax检测到eax不是0就返回了
奇怪就奇怪在这里~~
为什么我直接拿进程管理器关就关掉了呢~~NtTerminateProcess没执行阿....哭死~~难道还有别的函数?
2009-3-6 12:45
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
其实你何必做得这么复杂呢?既然你是在后面HOOK,那么Buffer已经填写了只需要判断下Type然后如果是自己的进程就把*Object=NULL;就OK了,还需要跑到你那个函数干什么?
2009-3-6 12:57
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
*Object=NULL的后果就是BSD~~~
我要跳到我的函数是为了以后方便,因为这个函数毕竟还能控制文件或者其他跟句柄有关的东西
那么到时候判断就非常复杂了,  
我把我处理写在另外一个函数第一是方便扩展 第二就是我汇编功底不够......  呵呵
还有我说的是保护进程~不一定是我自己的进程~~
2009-3-6 13:29
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
还没搞好?没那么复杂啊
2009-3-6 14:17
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
if (Object && MmIsAddressValid(*(PVOID *)Object))
        {
                POBJECT_HEADER pObjectHeader=NULL;
                pObjectHeader = OBJECT_TO_OBJECT_HEADER(*(PVOID *)Object);
                if (pObjectHeader && MmIsAddressValid(pObjectHeader))
                {
                        if (pObjectHeader->Type==*PsProcessType)
                        {
                                if ((ULONG)PsGetCurrentProcessId()!=g_AppProcessId && GetProcessId(*(PVOID *)Object)==g_AppProcessId)
                                {
                                        DbgPrint("值:0x%x\n",*(PVOID *)Object);
                                        //ObDereferenceObject(*(PVOID *)Object);
                                        *(PVOID *)Object=NULL;
                                }
                        }
                }
        }
2009-3-6 15:15
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
17
实在不行,发现是自己的object,就改为PsGetCurrentProcess()就好了~
保证不会再结束了 哈哈
2009-3-6 15:55
0
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
谁YD啊,你YD
2009-3-6 16:59
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
主要问题是hook了以后没法防止进程被结束....  
问题就出现在这里~~
我结束进程然后就
打印出进程名和进程PID
在然后进程就被结束了....根本没起到进程保护的作用....
2009-3-6 18:43
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
刚才上面的代码我专门些得测试代码和你的HOOK是一个地方,没你说的问题
2009-3-6 18:53
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
21
inline hook的注意下多CPU...路过..这个地方用call hook也可以嘛
2009-3-6 22:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
那可能真的是我没过滤完全了~?谢~!我去试试~
2009-3-7 01:31
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这个....我的确没考虑~~
的确用call hook也行~不过我没见过人家hook末尾的 所以想试试~
2009-3-7 01:32
0
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
利用了下堆栈回溯
2009-3-7 01:48
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我是来继续围观LZ的马甲的
2009-3-7 01:53
0
游客
登录 | 注册 方可回帖
返回
//