首页
社区
课程
招聘
[求助]为什么inline hook 总是蓝屏!!!
发表于: 2009-2-14 19:17 6411

[求助]为什么inline hook 总是蓝屏!!!

2009-2-14 19:17
6411
我在写一个inline hook NtOpenProcess的驱动总是蓝屏,不知道什么原因,搞了半天还没找出到底哪的问题!!!大牛给看下!!!
(没装杀毒软件,内核是干净的)
进行hook操作的函数如下:
void  InlineHookZwOpenProcess()
{
        ULONG ServiceIndex;
    PMDL pmdl;
    ServiceIndex=*(ULONG *)((PCHAR)&ZwOpenProcess+1);

        if(ServiceIndex>KeServiceDescriptorTable.NumberOfServices )
        {
                DbgPrint("Serviceindex is error:%x\n",ServiceIndex);
                DbgPrint("ZwOpenProcessAddr is:%x\n",&ZwOpenProcess);
                return;
        }

        pmdl=MmCreateMdl(NULL,KeServiceDescriptorTable.ServiceTableBase,4*KeServiceDescriptorTable.NumberOfServices);

        if(pmdl==NULL)
        {
                DbgPrint("CreateMdl fail\n");
                return;
        }

        MmBuildMdlForNonPagedPool(pmdl);
        pmdl->MdlFlags=pmdl->MdlFlags |MDL_MAPPED_TO_SYSTEM_VA ;
        PULONG BaseAddr=(ULONG *) MmMapLockedPages(pmdl,KernelMode);
        OldNtOpenProcessAddr=BaseAddr[ServiceIndex];

        DbgPrint("Old NtOpenrocess addr is%x",OldNtOpenProcessAddr);

        MmUnmapLockedPages((PVOID)BaseAddr,pmdl);
        IoFreeMdl(pmdl);
   
        RtlCopyMemory(&SaveLog,(UCHAR *)OldNtOpenProcessAddr,5);
   
        KeInitializeSpinLock(&SpinLock);
        KeAcquireSpinLock(&SpinLock,&kirql);
        *(PUCHAR)OldNtOpenProcessAddr=0xE9;
        *(PULONG)(OldNtOpenProcessAddr+1)=(ULONG)&NewZwOpenProcess;
    KeReleaseSpinLock(&SpinLock,kirql);
}

跳转到的函数如下,这个只是简单的跳转,想不到都会蓝屏!!!
__declspec(naked)
NewZwOpenProcess(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId OPTIONAL
    )
{
        __asm
        {   
            mov  eax,NtOpenProcess
                add  eax,5
                push 0C8h
                jmp  eax
        }
}
拜托高手给看下那错了啊!!!

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 184
活跃值: (75)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
__asm
        {//去掉内存保护
                        cli
                        mov  eax,cr0
                        and  eax,not 10000h
                        mov  cr0,eax
        }
//code in here
        __asm
        {//恢复内存保护  
                        mov  eax,cr0
                        or   eax,10000h
                        mov  cr0,eax
                        sti
        }
2009-2-14 19:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
你那个MDL所描述的区域是SSDT表所在内存,而不是NtOpenProcess函数所在的内存区域啊,写保护不去掉就这么改不蓝才怪
2009-2-14 19:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
把2楼那两段代码分别加在改之前和改之后,或者修改一下你那个Mdl的区域。还有个最严重的错误,你的0xE9后面四字节根本就是错的,你还不会计算跳转呢
2009-2-14 19:41
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
最后再说一句:自旋锁不是这么用的
2009-2-14 19:58
0
雪    币: 2512
活跃值: (672)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
楼上大牛说的对!!!感谢!!感谢!!问题已解决!!!
2009-2-14 20:02
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
新时代中inline hook已经落伍了~
OpenProcess这么重要的事情一定会有XX的事情...哎~~
2009-2-14 20:32
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我感觉你直接修改 SSDT表的地址,不用0XE9要不还得计算;
还有楼上两位老大说的很对啊,膜拜
2009-2-14 20:38
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
学MJ用Object Hijack吧~
2009-2-14 21:39
0
游客
登录 | 注册 方可回帖
返回