使用 Windbg 查看 Win7 x64 位的 SSDT

前言

怎么用 Windbg 调试虚拟机内核看 这里

我的虚拟机是 64 位的,查看方式跟 32 位的有点区别

介绍

什么是 SSDT?

SSDT 就是系统服务描述符表

那什么是系统服务描述符表?

是 SSDT

简单讲就是一个偏移量数组,实现了用户层到内核层的映射

Service Descriptor Table

keservicedescriptortable​ 的第一个成员 nt!KiServiceTable​ 就是指向 SSDT 本身的地址

1
2
3
4
5
kd> dps nt!keservicedescriptortable L4
fffff800`040e6900 fffff800`03ee0400 nt!KiServiceTable
fffff800`040e6908 00000000`00000000
fffff800`040e6910 00000000`00000191
fffff800`040e6918 fffff800`03ee108c nt!KiArgumentTable

这里打印两行偏移值

1
2
3
kd> dd /c1 fffff800`03ee0400 L2
fffff800`03ee0400 03bf9500
fffff800`03ee0404 02607b00

函数的绝对地址经过下列公式计算就是了

$$
函数绝对地址=KiServiceTable地址+(SSDT里的偏移值>>>4)
$$

这里不需要自己运算,windbg 有运算功能,直接查看这个函数绝对地址上是什么函数

1
2
3
4
5
6
7
8
9
10
kd> u fffff800`03ee0400 + (03bf9500>>>4)
nt!NtMapUserPhysicalPagesScatter:
fffff800`0429fd50 48895c2408 mov qword ptr [rsp+8],rbx
fffff800`0429fd55 4c89442418 mov qword ptr [rsp+18h],r8
fffff800`0429fd5a 55 push rbp
fffff800`0429fd5b 56 push rsi
fffff800`0429fd5c 57 push rdi
fffff800`0429fd5d 4154 push r12
fffff800`0429fd5f 4155 push r13
fffff800`0429fd61 4156 push r14

我这里的第一个函数是 NtMapUserPhysicalPagesScatter​,然后确认下函数地址有没有计算出错,可以通过查看第一行是不是一样的来确认

1
2
3
kd> u nt!NtMapUserPhysicalPagesScatter L1
nt!NtMapUserPhysicalPagesScatter:
fffff800`0429fd50 48895c2408 mov qword ptr [rsp+8],rbx

导出所有函数名和绝对地址

这里是我直接贴原文的代码过来

1
2
3
4
5
6
7
8
9
10
11
0: kd> .foreach /ps 1 /pS 1 ( offset {dd /c 1 nt!KiServiceTable L poi(nt!KeServiceDescriptorTable+10)}){ r $t0 = ( offset >>> 4) + nt!KiServiceTable; .printf "%p - %y\n", $t0, $t0 }
fffff80191dcb4ec - nt!NtAccessCheck (fffff801`91dcb4ec)
fffff80191cefccc - nt!NtWorkerFactoryWorkerReady (fffff801`91cefccc)
fffff8019218df1c - nt!NtAcceptConnectPort (fffff801`9218df1c)
fffff801923f8848 - nt!NtMapUserPhysicalPagesScatter (fffff801`923f8848)
fffff801921afc10 - nt!NtWaitForSingleObject (fffff801`921afc10)
fffff80191e54010 - nt!NtCallbackReturn (fffff801`91e54010)
fffff8019213cf60 - nt!NtReadFile (fffff801`9213cf60)
fffff801921b2e80 - nt!NtDeviceIoControlFile (fffff801`921b2e80)
fffff80192212dc0 - nt!NtWriteFile (fffff801`92212dc0)
.....cut for brewity.....


System Service Descriptor Table - SSDT