能力值:
(RANK:400 )
2 楼
1. CR0寄存器中有一个WP(WRITE PROTECT)位. 它控制是否允许处理器写入标记为只读属性的内存页. 默认情况下是1 即禁止写入, 我们这里要改写函数, 所以要修改这个WP位, 你看下inline hook的做法就知道了, 原理是一样一样的. 嚎~
2. 这个问题原帖中讨论了, 在这里是有点问题.
3. 由于比较水, 我也不是很清楚, 微软的做法就是这样的. 我只是学习了下MJ提到的方法.
能力值:
( LV4,RANK:50 )
3 楼
Thanks for quick response.
第1个问题明白了。
第2个问题是复杂的问题,先不谈。
关于第3个问题,
以前是大多数的函数都是这么开头的,只有3个字节的序言,
push ebp
mov ebp, esp
微软为了hot patch,加了一个mov edi, edi
即函数的开头是如下5个字节。
mov edi, edi
push ebp
mov ebp, esp
一条jmp指令就5个字节,我的想法如果成立,函数开头的5个字节正好放一条jmp,就没有必要去管函数前面是不是nop或者是int。
代码可以这样来写。
declspec (naked)
NTSTATUS
OriginalObReferenceObjectByHandle(
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
push ebp
mov ebp, esp
mov eax,ObReferenceObjectByHandle
add eax,5
jmp eax
}
}
当然,那个InlineHookFuncXP也需要改动,不过只改一点,应该是更简单的了。
我没写过驱动,没这方面的经验,
楼上的能否试试?
能力值:
(RANK:400 )
4 楼
晕, 你这不就是inline hook吗!
这个方法还是有点区别的, 你去看下MJ的原帖吧.
能力值:
( LV12,RANK:320 )
5 楼
InlineHook,有好几种方式,3楼的也是InlineHook,MJ的那个比较猥琐,ARK检测起来比较麻烦一点.充分利用了微软为了热补丁而做的每个函数开始前5字节为nop 或者int 3以及mov edi ,edi这条占位指令. 3楼的是比较直接的InlineHook.不要纠结
一千个人眼中,有一千个哈姆雷特.
能力值:
( LV11,RANK:190 )
6 楼
我也来看看,太多东西看不懂
能力值:
(RANK:400 )
7 楼
真理啊
能力值:
( LV4,RANK:50 )
8 楼
应用做的多,hook接触的少。
原来只是觉得3楼的方式更简单直接,需求依赖更少。MJ的方法多跳了一层,也多了些限制。所以不大明白为什么多此一举,如果原因是为了逃避ARK检测,那就可以理解了。如果只是应用的需求,通用性,简单性应该更重要吧,
能力值:
( LV9,RANK:610 )
9 楼
MJ那样做不是为了逃避检测,而是为了更安全地进行hook,要知道,修改长度超过机器字长的数据是不能在一条指令中完成的,在多条指令中完成就会有同步问题……而MJ的做法对正在执行的指令只修改了2字节(那5个字节在hook前是执行不到的,不存在同步隐患),因而从同步角度上讲是非常安全的,这才是根本原因……
能力值:
(RANK:400 )
10 楼
多谢教主兄弟科普~