首页
社区
课程
招聘
[求助]Ring0 inline Hook 有时成功,有时不成功,有些什么影响因素??
发表于: 2009-9-9 11:06 5950

[求助]Ring0 inline Hook 有时成功,有时不成功,有些什么影响因素??

2009-9-9 11:06
5950
最近在学习Ring0 inline Hook,看了很多大侠的code,并实验通过了。今天想写个hook ZwQueryValueKey的inline Hook,发现打出来的信息和SSDT HOOK打出来的东西不对,

由于系统对ZwQueryValueKey的调用很频繁,inline 总是比SSDT少打了东西出来,请问Ring0 inline Hook 要注意些什么?

NTSTATUS NTAPI
HookedNtQueryValueKey(
                                          IN HANDLE               KeyHandle,
                                          IN PUNICODE_STRING      ValueName,
                                          IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                          OUT PVOID               KeyValueInformation,
                                          IN ULONG                Length,
                                          OUT PULONG              ResultLength
                                          )
{

//这个地方就是打的调试信息
KdPrint(( "SubKey Name: %ws \n", ValueName->Buffer ));  
..........
.....
.....
}

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
貌似没人回答是因为你提供的信息太少。。。
2009-9-9 15:41
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
把你的CODE发来,我帮你调调。
2009-9-9 17:38
0
雪    币: 134
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是这样的,有可能我是没有说清楚吧,我详细的说一下哈。

我想写个注册表监视的驱动,同时用了SSDT和Inline Hook,去HOOK了ZwQueryValueKey,SSDT用的网上流传很多的常用的一个宏,Inline是在函数的前五个字节去跳转的,也是网上

的大侠们共享出来的,同时进入我的HookedNtQueryValueKey,也就是这句代码
        if ( !_strnicmp( szipmsg, pName, strlen(szipmsg) ) )//测试用的ipmsg.exe
        {
                DbgPrint( "-------I am ipmsg.exe !!!---------" );
                KdPrint(( "SubKey Name: %ws \n", valueName->Buffer ));
        }
发现打出来的信息不相同,SSDT比较全,应该是对的,inline打出来的就太少了,相对比之下总觉得inline有哪儿不对,可是又找不到原因,唯一我可以想到的就是inline和SSDT

他们的原理有点不同,还有个问题是ZwQueryValueKey这个函数系统调用很频繁,部分inline代码如下,望请大侠们帮忙看看.

//////////////////////////////////////////////////////////////////////////
VOID HookOn()
{
        //====================================================
        //                   获取函数地址
        //====================================================
        UNICODE_STRING funcName;
        RtlInitUnicodeString(&funcName,FUNC_NAME);                                                                //预hook的函数名字
       
       
        Old_FuncAddress=MmGetSystemRoutineAddress(&funcName);

        //DbgPrint("Hook [NtOpenProcess] -*Inline Hook Sample");
        //DbgPrint("NtOpenProcess -> :%x",(LONG*)Old_FuncAddress);
        //RtlFreeUnicodeString(&funcName);

        //====================================================
        //               改变原始函数头字节跳转
        //====================================================
        RtlCopyMemory(oricode,(UCHAR*)Old_FuncAddress,5);                                                        //备份前5字节
        *((ULONG*)(nowcode+1)) = (ULONG)HookFunc - (ULONG)Old_FuncAddress - 5;      //计算跳转地址

        //DbgPrint("%x -> jmp %x",Old_FuncAddress,(ULONG)HookFunc);                                        //上面计算的地址显示

        DisableWP();                                                                                                                                //关中断保护

        RtlCopyMemory((UCHAR*)Old_FuncAddress,nowcode,5);                                                        //(*)写新地址到原函数中

        RtlCopyMemory((UCHAR*)JmpFunc,oricode,5);                                                                        //备份的5个字节写入到jmpfunc里

        *((ULONG*)(jmpcode+1)) = (ULONG)Old_FuncAddress - (ULONG)JmpFunc - 5;            //生成一条JMP ****指令跳转到原函数+5的位置

        //DbgPrint("Hook Return -> jmp %x",(ULONG)Old_FuncAddress+5);                                        //上面生成的地址显示
       
        RtlCopyMemory((UCHAR*)JmpFunc+5,jmpcode,5);                                                                        //将这个指令写入到jmpfunc里

        EnableWP();                                                                                                                                        //开

中断保护

        return;
}
//////////////////////////////////////////////////////////////////////////
NTSTATUS NTAPI
HookedNtQueryValueKey(
                                          IN HANDLE               KeyHandle,
                                          IN PUNICODE_STRING      ValueName,
                                          IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                          OUT PVOID               KeyValueInformation,
                                          IN ULONG                Length,
                                          OUT PULONG              ResultLength
                                          )
{

        NTSTATUS status = STATUS_SUCCESS;
       
        PEPROCESS pProcess;
        char* pName = NULL;       
       
        pProcess = PsGetCurrentProcess();
        pName = ((char *)pProcess+g_ProcessNameOffset);

//        DbgPrint( "-------I am here!!!---------" );

        if ( !_strnicmp( szipmsg, pName, strlen(szipmsg) ) )//测试用的ipmsg.exe
        {
                DbgPrint( "-------I am ipmsg.exe !!!---------" );
                KdPrint(( "SubKey Name: %ws \n", valueName->Buffer ));
        }

        status = JmpNtQueryValueKey(KeyHandle,ValueName,KeyValueInformationClass,KeyValueInformation,Length,ResultLength);
        return status;

}

//*************************************************//
__declspec(naked)
//这里声明做一个编译器免优化指令 《__declspec(naked)》
NTSTATUS NTAPI
JmpNtQueryValueKey(
                                   IN HANDLE               KeyHandle,
                                   IN PUNICODE_STRING      ValueName,
                                   IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
                                   OUT PVOID               KeyValueInformation,
                                   IN ULONG                Length,
                                   OUT PULONG              ResultLength
                                          )
{
        //***********************************//
        __asm
        {
                //伪指令
                //0x90 = nop
                //nop用于写入指令
                _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
                        _emit 0x90
        }
        //***********************************//
}
2009-9-10 09:16
0
游客
登录 | 注册 方可回帖
返回
//