前面的驱动编程相关内容都是在32位环境下进行的,驱动程序与应用程序不同,32位的驱动只能运行在32位系统中,64位驱动只能在64位系统中运行,在WIN32环境下,我们可以各种Hook挂钩各种系统函数,
而恶意程序也可以通过加载驱动进行内核层面的破坏(Rootkit),大家都可以乱搞,把好端端的Windows系统搞得乱七八糟,严重影响了系统安全性与可靠性。

为了确保系统的安全性与稳定性,微软从 Windows Vista X64 开始对系统内核增加了一定的限制,其主要增加了两种保护措施,一是KPP (内核补丁保护),KPP是机制其利用了PG(PatchGuard)技术,PG技术在x64系统下加入了内核哨兵,用于检测系统内核是否被恶意篡改(打补丁),如果发现被打了补丁,则会导致关键结构损毁直接蓝屏,二是DSE (驱动强制签名),DSE技术则是拒绝加载不包含正确签名的驱动。

在前面的章节《驱动保护:挂接SSDT内核钩子》我们通过代码的方式直接读取 KeServiceDescriptorTable 这个被导出的表结构从而可以直接读取到SSTD表的基址,而在Win64系统中 KeServiceDescriptorTable
这个表并没有被导出,所以要想HOOK首先我们必须要手动搜索到它的地址。

1.这里我们可以通过MSR(特别模块寄存器),读取C0000082寄存器,从而得到KiSystemCall64的地址,在内核调试模式下直接输入 rdmsr c0000082 即可读取到该地址,反汇编可看到 nt!KiSystemCall64 函数。

kd> rdmsr c0000082
msr[c0000082] = fffff800`03c72ec0

kd> u fffff800`03c72ec0
nt!KiSystemCall64:
fffff800`03c72ec0 0f01f8          swapgs
fffff800`03c72ec3 654889242510000000 mov   qword ptr gs:[10h],rsp
fffff800`03c72ecc 65488b2425a8010000 mov   rsp,qword ptr gs:[1A8h]
fffff800`03c72ed5 6a2b            push    2Bh
fffff800`03c72ed7 65ff342510000000 push    qword ptr gs:[10h]
fffff800`03c72edf 4153            push    r11
fffff800`03c72ee1 6a33            push    33h
fffff800`03c72ee3 51              push    rcx
02-13 17:57