前言
怎么用 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