首页
社区
课程
招聘
[原创]详谈内核三步走Inline Hook实现
发表于: 2009-9-25 18:52 100294

[原创]详谈内核三步走Inline Hook实现

2009-9-25 18:52
100294
收藏
免费 7
支持
分享
最新回复 (75)
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
支持楼主,感谢楼主分享学习笔记

804e6d1b e8523fffff        call    nt!KiInsertQueueApc (804dac72)
804e6d20 8ad8 (错误)  mov     bl,al
特征码就是sp_code1=0x28 sp_code2=0xe8 sp_code3=0xd88a(windbg显示有误,应该是d88a


804e6d20 8ad8 (错误)  mov     bl,al
说说这个,你说是windbg的错误,我不这么认为.  做为 mov bl,al 的机器码 8ad8 windbg并没有显示错误, 而你的 sp_code3=0xd88a . 如果你的 sp_code3 是 WORD 的话.那么你指向这块内存后.应该是 d88a . 要遵循高高低低原则嘛

如果我理解错的话,还请指出.
2009-9-27 10:02
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
27
wakaka挺细心啊,看来楼主需要部的东西挺多~
2009-9-27 12:22
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
28
LZ 可以再补充下以下方面

HOOK 时可能遇到的 当前环境偏移的一些问题   类似JMP CALL
HOOK  FASTCALL类型函数时 需要注意的地方
还有两个程序同时INLINE HOOK一个函数地址  实时检查自身HOOK 等问题

BTW :能用C实现的 建议不要用汇编代替  这样 像我这样的菜鸟 看起来才更易懂  
2009-9-27 15:09
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
29
多谢大家指出问题
2009-9-27 17:38
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
30
Irql=KeRaiseIrqlToDpcLevel();
所谓DpcLevel,并不是这个IRQL级别叫Dpc,而是提高到和Dpc同一个IRQL级别。相应级别其实是DISPATCH_LEVEL,在这DDK里写得很清楚:
The KeRaiseIrqlToDpcLevel routine raises the hardware priority to IRQL = DISPATCH_LEVEL, thereby masking off interrupts of equivalent or lower IRQL on the current processor.
2009-9-27 18:18
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
31
已经修改了
2009-9-27 20:00
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
32
提高中断级别到DISPATCH_LEVEL,禁止线程切换产生的中断

哎,还是很囧!
2009-9-27 23:21
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
33
MJ大神请详细解析下把我投降了
2009-9-28 01:04
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
34
其实也没什么大错误..

感觉不必要为这个咬文嚼字..

一个内核模式的线程..把自己所在的处理器的IRQL提高至IRQL为2的DPC/DISPATCH 级别之后..
CPU的IRQL设置一旦改变(在PCR里面保存着)...则当前处理器.就不会再接受同等级别的请求
和低于此级别的请求(如果有.则插入当前处理器的DPC队列.等候处理)..注意一点: windows的线程调度以及分发工作.也不过是运行在IRQL为2的DPC/DISPATCH级别....所以..线程调度请求.通知当前处理器处理的时候.会被暂时屏蔽(保留起来).或者线程分发器交给其他处理器处理.....如果当前系统是单处理器.则实际上线程调度也就暂时被延迟了....所以不能说是禁止了线程调度产生的中断..(虽然我知道你想表达的也是这个意思)....

说这个了.把那个指令也啰嗦下.虽然大家都知道了..

就是sti 和cli..因为处理器要处理的请求..不仅仅来自软件请求..(比如说那个线程分发).

还有大量的硬件请求..

其中通过INTR引脚或者本地APIC传递到处理器的外部硬件中断都是可屏蔽中断..

为了减少CPU处理事情时候被打扰..这些可屏蔽的硬件中断.适当的使用指令(实质就是修改CPU的EFLAGES寄存器的IF位)屏蔽下也没太大坏处....

说这么多了..最后把楼主的帖子说一下吧..

其实这一篇写的不错的..毕竟面向的对象不一样..

纵然是天上的天阳般万丈光芒.也不见得会得到所有人的喜欢..

所以..知道自己发帖的目的.和对象即可..不必要过于仅仅计较了..呵呵.

万事物极必反..

我就在后面跟上Anti 这种InLine的办法吧..新手可以用一下..

这种Hook大多针对的对象是那种 函数头前5字节.特别是stdcall约定的函数.

函数头大多喜欢是这样

80820cc1 8bff            mov     edi,edi
80820cc3 55              push    ebp
80820cc4 8bec            mov     ebp,esp

这样的指令..完全可以自己实现一下这三句

比如写成这样

__declspec(naked)
PVOID
g_Safe_ExAllocatePoolWithTag(
                                          IN POOL_TYPE  PoolType,
                                          IN SIZE_T  NumberOfBytes,
                                          IN ULONG  Tag
                                          )
{
        __asm
        {
                    mov     edi,edi
                        push    ebp
                        mov     ebp,esp
                        mov     eax,g_ExAllocatePoolWithTag 这里你可以随意按需要修改.就是被挂钩的函数的地址..
                        add     eax,5因为上面自己实现前5字节了.这里直接转移到5子节后执行..也就绕过了那5个字节的Hook.. ..当然了.还有一点切记..有些函数会检查调用者的PreviousMode..注意修改.这两个东西.论坛都有专门的文章解释..就不废话了.
                        jmp     eax

        }

}
2009-9-28 03:29
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
35
写这篇文章就是为了对刚接触inline,对inline还没概念的读者一个总结,的确修改函数头5个字节早过时了,但是inline的过程是不变的,inline要注意的事项也是通用的。由于个人对操作系统线程调度及底层知识不足,文章出现几大错误,感谢大家指正。
2009-9-28 10:15
0
雪    币: 486
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
不错,总结得很好,虽然不是很懂!
2009-9-29 08:47
0
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
下载回来学习。
2009-10-1 11:23
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
怎么后退转不回去了
2009-12-9 16:25
0
雪    币: 299
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
39
标记一下 MARK
2009-12-10 09:24
0
雪    币: 56
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
恩。。下来看看先
2009-12-10 11:57
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
*( (ULONG*)(JmpAddress + 1) ) = (ULONG)DetourMyKiInsertQueueApc - (ULONG)g_KiInsertQueueApc - 5;
*(ULONG *)(JmpAddress+1)=(ULONG)DetourMyObReferenceObjectByHandle-((ULONG)ObReferenceObjectByHandle+5);
这个是你两个例子里的,为什么一个是加一个是减
这样操作对JmpAddress起到什么做用,
这样新函数减原函数起到什么作用,为什么最后JmpAddress是jmp到了新函数
2009-12-10 18:03
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
42
看清楚啊  括号去掉就都是减啊
2009-12-10 23:10
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
天,我犯了一个小学1年级的数学错误,其实还是想问这样减的意思,E9后面的地址这样减为什么能得到新函数的地址
2009-12-11 02:34
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
竹君.你确定这样减JmpAddress能指向DetourMyObReferenceObjectByHandle的地址?好象减了后JmpAddress的值和DetourMyObReferenceObjectByHandle没什么关系啊,
请帮解惑下
2009-12-11 02:47
0
雪    币: 38
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
45
说真的,我就一直看到这这位大侠在那儿囧,囧了三四次了,
就是不愿说说真正的理解。真是汗。。
2009-12-12 14:38
0
雪    币: 38
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
46
楼主写得很好啊,加油加油。
我也是个菜鸟,也最近一个月才真正地理解到INLINEHook
2009-12-12 14:39
0
雪    币: 1685
活跃值: (704)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
[QUOTE=竹君;691973]  if( _stricmp((char *)((ULONG)(*Object)+0x174),"notepad.exe")==0)
...[/QUOTE]

请教一下.这个0X174是怎么得来的
2009-12-18 17:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
48
0x174是个硬编码,自己dt _EPROCESS看一下就知道了~
2009-12-19 10:18
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
谢谢分享这么好的资料
2010-1-20 15:50
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
提高优先级可以避免线程切换出错,重入问题呢?
2010-1-20 16:10
0
游客
登录 | 注册 方可回帖
返回
//