Rover12421's Blog

The End.

关于SSDT HOOK 取得索引号(function2hook + 1 )

当我们HOOK SSDT 时,要做的很重要的事情就是要获得NtXXX函数在SSDT中的索引号,以方便替换和调用。

取得索引号会使用宏:

define HOOK_INDEX(function2hook) *(PULONG)((PUCHAR)function2hook + 1)

但为什么要function2hook +1 呢 ?
一定要注意本质问题,这里的function2hook不是我们想要HOOK的NtXXX,而是对应的ZwXXX。

我们反汇编下ZwXXX,以ZwWriteFile为例:

0: kd> u nt!ZwWriteFile
nt!ZwWriteFile:
805022a4 b812010000      mov     eax,112h
805022a9 8d542404          lea       edx,[esp+4]
805022ad 9c                      pushfd
805022ae 6a08                  push    8
805022b0 e8ac010400      call       nt!KiSystemService (80542461)
805022b5 c22400              ret       24h

其中805022a4为ZwWriteFile的入口地址,我们再查看下这个入口地址之后的内存值:

0: kd> dd 805022a4
805022a4    000112b8 24548d00 086a9c04 0401ace8
805022b4    0024c200 000113b8 24548d00 086a9c04
805022c4    040198e8 0024c200 000114b8 24548d00
805022d4    086a9c04 040184e8 0018c200 000115b8

0: kd> dd 805022a4+1
805022a5  00000112 0424548d e8086a9c 000401ac
805022b5  b80024c2 00000113 0424548d e8086a9c
805022c5  00040198 b80024c2 00000114 0424548d
805022d5  e8086a9c 00040184 b80018c2 00000115

注意:mov eax,112h ,即ZwWriteFile函数入口处向后偏移1的地址保存了NtWriteFile的索引值,即112h 。所以我们使用ZwWriteFile 函数名,即函数入口指针 + 1,即为保存索引号的地址。之后用*取值就得到了索引号。

Comments