找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1072|回复: 10

《WIN64驱动教程》补充[13]:WIN64系统6字节的内联挂钩

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-7-3 11:48:50 | 显示全部楼层 |阅读模式
作者:Tesla.Angela

虽然说WIN64系统不让搞内核INLINE HOOK了,不过这些技术在“内核越狱”后还是能大显神通的。
但是公开教程的14字节INLINE HOOK太长了,严重限制了它的应用。
比如要实现内核级变速齿轮,要HOOK的一个关键函数是HAL!KeQueryPerformanceCounter。
但问题是,HAL!KeQueryPerformanceCounter在小于14字节的地方,有一个偏移地址。
换句话说,直接使用公开教程的INLINE HOOK引擎挂钩,唯一的结果就是BSOD:
  1. lkd> u hal!kequeryperformancecounter
  2. hal!KeQueryPerformanceCounter:
  3. fffff800`01e0a6f4 48895c2410      mov     qword ptr [rsp+10h],rbx
  4. fffff800`01e0a6f9 57              push    rdi
  5. fffff800`01e0a6fa 4883ec20        sub     rsp,20h
  6. fffff800`01e0a6fe 8b1590ae0100    mov     edx,dword ptr [hal!HalpQueryPerformanceCounterSource (fffff800`01e25594)]  <--这是偏移地址
  7. fffff800`01e0a704 488bf9          mov     rdi,rcx
  8. fffff800`01e0a707 83ea01          sub     edx,1
  9. fffff800`01e0a70a 0f8482000000    je      hal!KeQueryPerformanceCounter+0x9e (fffff800`01e0a792)
  10. fffff800`01e0a710 83ea01          sub     edx,1
复制代码

为什么一定会BSOD呢?因为8b1590ae0100中的90ae0100是动态变化的,不是一个“死的”机器码(需要重定位)。
如果需要重新计算机器码,这就非常麻烦了。但幸好微软没有把事情做绝。我们看一下KeQueryPerformanceCounter的前8个字节是什么:
  1. lkd> u hal!kequeryperformancecounter-8
  2. hal!HalpScaleQueryPerformanceCounter+0x40:
  3. fffff800`01e0a6ec 90              nop
  4. fffff800`01e0a6ed 90              nop
  5. fffff800`01e0a6ee 90              nop
  6. fffff800`01e0a6ef 90              nop
  7. fffff800`01e0a6f0 90              nop
  8. fffff800`01e0a6f1 90              nop
  9. fffff800`01e0a6f2 90              nop
  10. fffff800`01e0a6f3 90              nop
复制代码

正好是8个NOP。这8个字节的填充码,正好可以填入一个64位的地址。
于是我们可以把那个公开的INLINE HOOK引擎改一下,把代理函数的地址写到目标函数地址-8的位置,然后把FF2500000000改为FF25F2FFFFFF。
HOOK完的效果如下(只变了前6个字节):
  1. lkd> u hal!kequeryperformancecounter
  2. hal!KeQueryPerformanceCounter:
  3. fffff800`01e0a6f4 ff25f2ffffff    jmp     qword ptr [hal!HalpScaleQueryPerformanceCounter+0x40 (fffff800`01e0a6ec)]
  4. fffff800`01e0a6fa 4883ec20        sub     rsp,20h
  5. fffff800`01e0a6fe 8b1590ae0100    mov     edx,dword ptr [hal!HalpQueryPerformanceCounterSource (fffff800`01e25594)]
  6. fffff800`01e0a704 488bf9          mov     rdi,rcx
  7. fffff800`01e0a707 83ea01          sub     edx,1
  8. fffff800`01e0a70a 0f8482000000    je      hal!KeQueryPerformanceCounter+0x9e (fffff800`01e0a792)
  9. fffff800`01e0a710 83ea01          sub     edx,1
  10. fffff800`01e0a713 7455            je      hal!KeQueryPerformanceCounter+0x76 (fffff800`01e0a76a)
  11. lkd> dq hal!kequeryperformancecounter-8
  12. fffff800`01e0a6ec  fffff880`0d29928c 8348ffff`fff225ff
  13. ...省略无关数据...
复制代码
游客,如果您要查看本帖隐藏内容请回复

7

主题

52

回帖

0

精华

金牌会员

积分
844
发表于 2014-7-3 11:56:01 | 显示全部楼层
赞一个

0

主题

14

回帖

0

精华

铂金会员

积分
2276
发表于 2014-8-15 23:07:35 | 显示全部楼层
谢谢

0

主题

31

回帖

0

精华

铂金会员

积分
1773
发表于 2014-8-15 23:48:22 | 显示全部楼层
非常赞,顶

0

主题

37

回帖

0

精华

铜牌会员

积分
61
发表于 2024-1-1 20:05:18 | 显示全部楼层
学习了

2

主题

35

回帖

0

精华

铜牌会员

积分
173
发表于 2024-1-1 20:30:32 | 显示全部楼层
学习了

0

主题

21

回帖

0

精华

铜牌会员

积分
53
发表于 2024-1-17 15:54:05 | 显示全部楼层
超赞,感谢分享啊

0

主题

47

回帖

0

精华

贵宾会员

积分
89
发表于 2024-1-26 16:39:35 | 显示全部楼层
2024补充学习

0

主题

45

回帖

0

精华

铜牌会员

积分
53
发表于 2024-3-18 09:43:56 | 显示全部楼层
感谢分享

0

主题

2

回帖

0

精华

初来乍到

积分
12
发表于 2024-12-18 03:25:33 | 显示全部楼层
学习了

0

主题

92

回帖

0

精华

铜牌会员

积分
111
发表于 2025-1-25 21:43:57 | 显示全部楼层
好好学习一下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表