找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 43426|回复: 86

[原创]在WIN64系统上定位未导出的Zw函数

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2014-5-13 15:53:59 | 显示全部楼层 |阅读模式
在做某神奇工程的时候,需要在驱动里使用到ZwProtectVirtualMemory,可惜这个函数没有被ntoskrnl.exe导出。于是这就涉及到一个定位的问题。

不知道是否有人在意到,WIN64(2003、7、8、8.1)系统上所有nt!Zw函数,都是32个字节:
  1. 2003
  2. =======
  3. lkd> u nt!zwopenfile l b
  4. nt!ZwOpenFile:
  5. fffff800`0102a4d0 488bc4          mov     rax,rsp
  6. fffff800`0102a4d3 fa              cli
  7. fffff800`0102a4d4 4883ec10        sub     rsp,10h
  8. fffff800`0102a4d8 50              push    rax
  9. fffff800`0102a4d9 9c              pushfq
  10. fffff800`0102a4da 6a10            push    10h
  11. fffff800`0102a4dc 488d051d430000  lea     rax,[nt!KiServiceLinkage (fffff800`0102e800)]
  12. fffff800`0102a4e3 50              push    rax
  13. fffff800`0102a4e4 b830000000      mov     eax,30h
  14. fffff800`0102a4e9 e9d23b0000      jmp     nt!KiServiceInternal (fffff800`0102e0c0)
  15. fffff800`0102a4ee 6690            xchg    ax,ax

  16. WIN7
  17. =======
  18. lkd> u nt!zwopenfile l b
  19. nt!ZwOpenFile:
  20. fffff800`0188a240 488bc4          mov     rax,rsp
  21. fffff800`0188a243 fa              cli
  22. fffff800`0188a244 4883ec10        sub     rsp,10h
  23. fffff800`0188a248 50              push    rax
  24. fffff800`0188a249 9c              pushfq
  25. fffff800`0188a24a 6a10            push    10h
  26. fffff800`0188a24c 488d051d2c0000  lea     rax,[nt!KiServiceLinkage (fffff800`0188ce70)]
  27. fffff800`0188a253 50              push    rax
  28. fffff800`0188a254 b830000000      mov     eax,30h
  29. fffff800`0188a259 e962630000      jmp     nt!KiServiceInternal (fffff800`018905c0)
  30. fffff800`0188a25e 6690            xchg    ax,ax

  31. WIN8
  32. =======
  33. lkd> u nt!zwopenfile l b
  34. nt!ZwOpenFile:
  35. fffff802`7768f260 488bc4          mov     rax,rsp
  36. fffff802`7768f263 fa              cli
  37. fffff802`7768f264 4883ec10        sub     rsp,10h
  38. fffff802`7768f268 50              push    rax
  39. fffff802`7768f269 9c              pushfq
  40. fffff802`7768f26a 6a10            push    10h
  41. fffff802`7768f26c 488d05bd2f0000  lea     rax,[nt!KiServiceLinkage (fffff802`77692230)]
  42. fffff802`7768f273 50              push    rax
  43. fffff802`7768f274 b831000000      mov     eax,31h
  44. fffff802`7768f279 e9c2daffff      jmp     nt!KiServiceInternal (fffff802`7768cd40)
  45. fffff802`7768f27e 6690            xchg    ax,ax

  46. WIN8.1
  47. =========
  48. lkd> u nt!zwopenfile l c
  49. nt!ZwOpenFile:
  50. fffff801`1dbbf080 488bc4          mov     rax,rsp
  51. fffff801`1dbbf083 fa              cli
  52. fffff801`1dbbf084 4883ec10        sub     rsp,10h
  53. fffff801`1dbbf088 50              push    rax
  54. fffff801`1dbbf089 9c              pushfq
  55. fffff801`1dbbf08a 6a10            push    10h
  56. fffff801`1dbbf08c 488d056d6c0000  lea     rax,[nt!KiServiceLinkage (fffff801`1dbc5d00)]
  57. fffff801`1dbbf093 50              push    rax
  58. fffff801`1dbbf094 b832000000      mov     eax,32h
  59. fffff801`1dbbf099 e9e2e40000      jmp     nt!KiServiceInternal (fffff801`1dbcd580)
  60. fffff801`1dbbf09e c3              ret
  61. fffff801`1dbbf09f 90              nop
复制代码

这就为定位任意Zw函数提供了方便,只要知道它在SSDT上的INDEX即可。下面是详细步骤:
1.首先选取一个一定导出的函数,比如ZwClose,获得它的地址p
2.通过ZwClose的地址和序号index,获取0号函数的地址p0=p-32*index
3.假设你要获取N号函数的地址,那么地址计算公式就是:p0+32*N

简单WINDBG演示如下(基于WIN8.1):
  1. lkd> u nt!zwclose l b
  2. nt!ZwClose:
  3. fffff801`1dbbec00 488bc4          mov     rax,rsp
  4. fffff801`1dbbec03 fa              cli
  5. fffff801`1dbbec04 4883ec10        sub     rsp,10h
  6. fffff801`1dbbec08 50              push    rax
  7. fffff801`1dbbec09 9c              pushfq
  8. fffff801`1dbbec0a 6a10            push    10h
  9. fffff801`1dbbec0c 488d05ed700000  lea     rax,[nt!KiServiceLinkage (fffff801`1dbc5d00)]
  10. fffff801`1dbbec13 50              push    rax
  11. fffff801`1dbbec14 b80e000000      mov     eax,0Eh    //<-这个是ZwClose的INDEX
  12. fffff801`1dbbec19 e962e90000      jmp     nt!KiServiceInternal (fffff801`1dbcd580)
  13. fffff801`1dbbec1e c3              ret

  14. lkd> u nt!zwclose-e*20
  15. nt!ZwWorkerFactoryWorkerReady:     //<-这个是0号函数(可以用WIN64AST验证)
  16. fffff801`1dbbea40 488bc4          mov     rax,rsp
  17. fffff801`1dbbea43 fa              cli
  18. fffff801`1dbbea44 4883ec10        sub     rsp,10h
  19. fffff801`1dbbea48 50              push    rax
  20. fffff801`1dbbea49 9c              pushfq
  21. fffff801`1dbbea4a 6a10            push    10h
  22. fffff801`1dbbea4c 488d05ad720000  lea     rax,[nt!KiServiceLinkage (fffff801`1dbc5d00)]
  23. fffff801`1dbbea53 50              push    rax

  24. lkd> u fffff801`1dbbea40+20*100 l b
  25. nt!ZwNotifyChangeKey:     //<-这个是0x100号函数了
  26. fffff801`1dbc0a40 488bc4          mov     rax,rsp
  27. fffff801`1dbc0a43 fa              cli
  28. fffff801`1dbc0a44 4883ec10        sub     rsp,10h
  29. fffff801`1dbc0a48 50              push    rax
  30. fffff801`1dbc0a49 9c              pushfq
  31. fffff801`1dbc0a4a 6a10            push    10h
  32. fffff801`1dbc0a4c 488d05ad520000  lea     rax,[nt!KiServiceLinkage (fffff801`1dbc5d00)]
  33. fffff801`1dbc0a53 50              push    rax
  34. fffff801`1dbc0a54 b800010000      mov     eax,100h
  35. fffff801`1dbc0a59 e922cb0000      jmp     nt!KiServiceInternal (fffff801`1dbcd580)
  36. fffff801`1dbc0a5e c3              ret
复制代码

代码如下(WIN32/WIN64通用):
游客,如果您要查看本帖隐藏内容请回复

0

主题

8

回帖

0

精华

铜牌会员

积分
57
发表于 2014-5-14 10:31:43 | 显示全部楼层
学习一下,楼主辛苦了。。。

0

主题

37

回帖

0

精华

铜牌会员

积分
61
发表于 2014-5-14 11:37:10 | 显示全部楼层
谢谢分享。我来学习一下

3

主题

55

回帖

0

精华

铂金会员

积分
2015
发表于 2014-5-14 14:11:23 | 显示全部楼层
  谢谢TA大分享.来学习一下.

0

主题

51

回帖

0

精华

铜牌会员

积分
97
发表于 2014-5-16 11:49:57 | 显示全部楼层
thank you for share

1

主题

39

回帖

0

精华

铜牌会员

积分
299
发表于 2014-5-17 15:11:47 | 显示全部楼层
我都是调用MiProtectPages来直接改保护属性的。调用ZwProtectVirtualMemory不能修改内核页面的保护属性。

1

主题

39

回帖

0

精华

铜牌会员

积分
299
发表于 2014-5-17 15:19:35 | 显示全部楼层
另外,我收集了从NT4 1381 到NT6 9600 全套服务ID,包括X86,X64,安腾处理器。定义了头文件方便使用。
NT_7601.jpg
NT_1381.jpg

0

主题

36

回帖

0

精华

铜牌会员

积分
70
发表于 2014-6-17 15:19:19 | 显示全部楼层
楼上的可以把东西放出来,楼主会给一些有意思的东西给你的。

0

主题

5

回帖

0

精华

初来乍到

积分
21
发表于 2014-6-20 14:06:04 | 显示全部楼层
支持!!!!!看看由没用取内核基地址的代码

2

主题

23

回帖

0

精华

金牌会员

积分
938
发表于 2014-6-22 16:11:01 | 显示全部楼层
老大发的东西都是好东西,顶起~!

7

主题

52

回帖

0

精华

金牌会员

积分
844
发表于 2014-6-24 11:58:20 | 显示全部楼层
学习学习

4

主题

14

回帖

0

精华

钻石会员

积分
5014
发表于 2014-7-3 11:09:33 | 显示全部楼层
谢谢分享!!!

0

主题

23

回帖

0

精华

铜牌会员

积分
59
发表于 2014-7-9 10:47:50 | 显示全部楼层
看看先。是否有用

8

主题

31

回帖

0

精华

铂金会员

积分
2031
发表于 2014-8-4 04:46:31 | 显示全部楼层
必须学习

0

主题

24

回帖

0

精华

铜牌会员

积分
165
发表于 2014-8-6 06:09:37 | 显示全部楼层
学习了

1

主题

77

回帖

0

精华

铂金会员

积分
1972
发表于 2014-8-8 00:24:53 | 显示全部楼层
。。。

0

主题

55

回帖

0

精华

铜牌会员

积分
177
发表于 2014-9-19 14:24:56 | 显示全部楼层
64位的是32个字节,32位的20个字节吧

0

主题

9

回帖

0

精华

初来乍到

积分
30
发表于 2014-9-26 14:54:16 | 显示全部楼层
GetSSDTFunctionAddress 64

0

主题

5

回帖

0

精华

铜牌会员

积分
173
发表于 2014-9-27 01:15:30 | 显示全部楼层
看看,有用

0

主题

49

回帖

0

精华

铜牌会员

积分
76
发表于 2014-12-23 11:30:21 | 显示全部楼层
好东西

0

主题

20

回帖

0

精华

金牌会员

积分
1043
发表于 2014-12-25 10:28:30 | 显示全部楼层
谢谢分享

0

主题

4

回帖

0

精华

初来乍到

积分
94
发表于 2014-12-31 20:58:35 | 显示全部楼层
学习下……………………

2

主题

26

回帖

0

精华

铜牌会员

积分
174
发表于 2015-2-25 14:27:50 | 显示全部楼层
真是好方法

0

主题

42

回帖

0

精华

贵宾会员

积分
1864
发表于 2015-4-8 13:32:04 | 显示全部楼层
谢谢老大分享了 呵呵

0

主题

10

回帖

0

精华

铜牌会员

积分
38
发表于 2015-5-22 02:42:59 | 显示全部楼层
学习一下,楼主辛苦了。。。

7

主题

67

回帖

2

精华

钻石会员

积分
2565
发表于 2015-5-22 19:03:34 | 显示全部楼层
来看看呢

2

主题

165

回帖

0

精华

金牌会员

积分
944
发表于 2015-5-25 10:23:21 | 显示全部楼层
还不知道有这个规律,学习了

0

主题

21

回帖

0

精华

铜牌会员

积分
150
发表于 2015-5-25 17:07:18 | 显示全部楼层
刚下楼主分享,学习了!

1

主题

26

回帖

0

精华

铜牌会员

积分
219
发表于 2015-6-18 09:43:20 | 显示全部楼层
看看谢谢

0

主题

5

回帖

0

精华

初来乍到

积分
15
发表于 2015-10-21 14:48:35 | 显示全部楼层
我也来看看

0

主题

5

回帖

0

精华

初来乍到

积分
15
发表于 2015-10-21 14:48:54 | 显示全部楼层
我也来看看速度速度

1

主题

82

回帖

0

精华

铜牌会员

积分
156
发表于 2015-10-22 09:35:45 | 显示全部楼层
哈哈哈好代码,先收藏了~~~~
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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