首页
社区
课程
招聘
[求助]Hot Patch 帖子中代码的疑问
发表于: 2011-6-29 13:38 5886

[求助]Hot Patch 帖子中代码的疑问

2011-6-29 13:38
5886
看了这个帖子,微软的Hot Patch代码
没写过驱动,水平太菜,不是很明白。在帖子后面问了问题也没人理,干脆重新开个。

1. WPOFF和WPON有什么用?
2. 在多核系统中,Hook函数的时候不怕有程序正在使用这个函数嘛?
3. 函数开头的5个字节已经是固定的了
mov edi, edi,
push ebp
mov ebp, esp

为什么需要使用前面的5个nop,不直接在这inline hook?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
2
1. CR0寄存器中有一个WP(WRITE PROTECT)位. 它控制是否允许处理器写入标记为只读属性的内存页. 默认情况下是1 即禁止写入,  我们这里要改写函数, 所以要修改这个WP位, 你看下inline hook的做法就知道了,  原理是一样一样的. 嚎~
2. 这个问题原帖中讨论了, 在这里是有点问题.
3. 由于比较水, 我也不是很清楚, 微软的做法就是这样的. 我只是学习了下MJ提到的方法.   
2011-6-29 14:06
0
雪    币: 113
活跃值: (100)
能力值: ( 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也需要改动,不过只改一点,应该是更简单的了。
我没写过驱动,没这方面的经验,楼上的能否试试?
2011-6-29 14:20
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
4
晕, 你这不就是inline hook吗!
这个方法还是有点区别的, 你去看下MJ的原帖吧.
2011-6-29 14:27
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
5
InlineHook,有好几种方式,3楼的也是InlineHook,MJ的那个比较猥琐,ARK检测起来比较麻烦一点.充分利用了微软为了热补丁而做的每个函数开始前5字节为nop 或者int 3以及mov edi ,edi这条占位指令.  3楼的是比较直接的InlineHook.不要纠结一千个人眼中,有一千个哈姆雷特.
2011-6-29 14:32
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6
我也来看看,太多东西看不懂
2011-6-29 14:34
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
7
真理啊
2011-6-29 14:35
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
应用做的多,hook接触的少。

原来只是觉得3楼的方式更简单直接,需求依赖更少。MJ的方法多跳了一层,也多了些限制。所以不大明白为什么多此一举,如果原因是为了逃避ARK检测,那就可以理解了。如果只是应用的需求,通用性,简单性应该更重要吧,
2011-6-29 15:43
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
MJ那样做不是为了逃避检测,而是为了更安全地进行hook,要知道,修改长度超过机器字长的数据是不能在一条指令中完成的,在多条指令中完成就会有同步问题……而MJ的做法对正在执行的指令只修改了2字节(那5个字节在hook前是执行不到的,不存在同步隐患),因而从同步角度上讲是非常安全的,这才是根本原因……
2011-6-29 22:02
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
10
多谢教主兄弟科普~
2011-6-29 23:42
0
游客
登录 | 注册 方可回帖
返回
//