首页
社区
课程
招聘
[求助]最近学习inline hook,看不懂啊。
发表于: 2009-7-13 23:12 7121

[求助]最近学习inline hook,看不懂啊。

2009-7-13 23:12
7121
以下代码是sysnap早期发表的inlinehook ObReferenceObjectByHandle()的代码。大部分看懂了,但是有些看不懂,google也查了,qq群也问了。哪位高手有时间给科普下哈~ 可怜下偶们菜鸟吧。。。

__declspec(naked) T_ObReferenceObjectByHandle(
                                                                                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        //执行被修改的前5个字节
                push ebp
                mov ebp,esp
               
                push [ebp+0x1c]  //参数压栈
                push [ebp+0x18]
                push [ebp+0x14]
                push [ebp+0x10]
                push [ebp+0xc]
                push [ebp+8]  //this parameter is object handle
  
                call MyObReferenceObjectByHandle  //调用我们的功能函数
                cmp eax,1   
                jz end
   
                mov eax,ObReferenceObjectByHandle  //正常运行原来的函数
                add eax,5           
                jmp eax   
       
        end:
                mov [ebp+8],-1  //如果不想让这个函数正常运行..无效句柄就可以
                mov eax,ObReferenceObjectByHandle     
                add eax,5  //protected the function can success runing           
                jmp eax  //start run ObReferenceObjectByHandle
}

//对原来函数是否要让其正常运行的判断由MyObReferenceObjectByHandle完成
int 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
                                                )
{
        PEPROCESS Process;
        KIRQL  oldIrql;
        int JmpOffSet;
        unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec};  //mov edi,edi push ebp mov ebp,esp
        unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 };  //jmp address
       
        if(*PsProcessType == ObjectType) //判断句柄所属对象类型是不是*PsProcessType
        {
                oldIrql = KeRaiseIrqlToDpcLevel();
               
                __asm
                {
                        CLI           
                        MOV eax, CR0     
                        AND eax, NOT 10000H
                        MOV CR0, eax
                }
               
                RtlCopyMemory(ObReferenceObjectByHandle,Code,5);//恢复inline hook以便正确调用ObReferenceObjectByHandle  
                ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&Process,NULL);
                 
                //Procee + 0x174 is this process file name
                //this file is im protected
                if(_stricmp((char*)((char*)Process+0x174), ProtectName) == 0 )//判断是不是我们要保护的进程
                {
                        //JmpOffset is int type
                        //JmpOffset Pointer the function qian 5 byte
                        JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
                       
                        //get jmp address to jmp+1 - jmp+4
                        RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
                        RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );
                       
                        __asm
                        {
                                MOV eax, CR0
                                OR eax, 10000H
                                MOV CR0, eax
                                STI
                        }
      
                        KeLowerIrql(oldIrql);
                        return 1;
                }
  
                //否则再次HOOK这个函数
                JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
                RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
                RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );
  
                __asm
                {
                        MOV eax, CR0
                        OR eax, 10000H
                        MOV CR0, eax
                        STI
                }
  
                KeLowerIrql(oldIrql);
        }
        return 0;
}

PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

__asm
                {
                        CLI           
                        MOV eax, CR0     
                        AND eax, NOT 10000H
                        MOV CR0, eax
                }



__asm
                        {
                                MOV eax, CR0
                                OR eax, 10000H
                                MOV CR0, eax
                                STI
                        }

是什么意思,大概在google上查了下,貌似和打开/管理 中断请求有关系。。。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀?

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
多打基础,就会懂了. 比如你不清楚-5的意思,需要了解Intel指令相关...
不要一口吃个胖子.
2009-7-13 23:27
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
emc
3
to sudami:

好吧,我在看看,但是,希望你能帮我解释下,我提出的问题 谢谢。
2009-7-14 00:51
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
代码写的有点复杂 中间还夹带了一些汇编 对于新手 确实不大容易理解  
建议LZ 去网上找个C写的R3的detours HOOK   单步调试一下就知道了
2009-7-14 14:00
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

进程类型咯..一般用0就行了.我也不是很清楚这个意思,你参考下就好
-------------------------------------------------------------------------------
oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

保存当前IRQL级别并提高IRQL级别,就是为了不让其他线程调度进来用的...就是提高IRQL中断级别,防止其他线程调度而产生的中断.不过我也不太明白,他这里用了cli关中断了,为什么还要提高IRQL的权限,不太明白,cli关中断的原理不太明白.他这里的IRQL提权是关了软中断,我想cli也是这个意思吧..

-------------------------------------------------------------------------
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀?

这个我也不知道怎么解释了,自己HOOK一下,算一下应该就明白了!
2009-7-14 18:26
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
6
如果楼主从没接触过inline hook,那么就如4楼所说应该从Ring3的inline hook开始学,而不是Ring0。
楼主的疑问,并不只是对怎样进行inline hook的疑问,还有一些是不熟悉驱动编程导致的。

PsProcessType是ObReferenceObjectByHandle传入的ObjectType参数,在得到进程的Object的时候使用,楼主参考DDK中关于ObReferenceObjectByHandle的描述,就会知道它是怎么回事了。

oldIrql = KeRaiseIrqlToDpcLevel();
同样参考DDK就会知道这个函数的作用,以及它的返回值(旧的IRQL)

操作CR0的那段则是暂时禁用写保护。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么减5,这涉及到机器码jmp命令的偏移是怎么计算的,这是inline hook的基础,楼主如果搞不清楚这个,可以说楼主根本没接触过inline hook。

另外这一段代码也做得并不是很好,因为需要在替代函数中反复HOOK和UNHOOK,这是比较容易出问题的一种方式,不是inline hook提倡的方式。
2009-7-14 18:35
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
emc
7
谢谢4喽和5喽的解释。

to 轩辕小聪:

我之前学习驱动,只是看了“楚狂人”所写的“windows驱动编程基础教程”,并且调试了helloworld和ioctrl的那2个代码。
之前我有参考ddk document中的ObReferenceObjectByHandle()中,但是没有找到"PsProcessType"的解释,而且参看sysnap的代码中并没有定义和解释PsProcessType,现在我只是知道用它来判断一个对象是不是一个进程。
不过谢谢大家的解释了,我自己在google下吧。
2009-7-14 21:34
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
Hook完全可以在ring3下练习~
2009-7-14 22:17
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
emc
9
to achillis:

inline hook 可以在ring3写练习?
2009-7-14 23:05
0
雪    币: 229
活跃值: (508)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
10
看来你还没明白什么是inline
2009-7-15 00:20
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
-5  不就是因为写入了5个字节长度的跳转指令呗。。。
一个比一个神秘
2009-7-15 00:45
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
inline hook意思就是在函数体内hook 进入到过滤函数,比如可以通过jmp ,call,push等.实现转入过滤函数(就是你写的判断函数)...这就是inline hook   和R0   R3没关系,只是一种方式而已...

inline反正意思就是在函数体内挂钩..
2009-7-15 10:57
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
那么多的hook教程,似乎没有一篇足够凝炼~
2009-7-15 17:53
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
emc
14
to 13#:

貌似那些hook教程都直接是code....
2009-7-16 09:09
0
游客
登录 | 注册 方可回帖
返回
//