当我们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,即为保存索引号的地址。之后用*取值就得到了索引号。