如何快速获得关于SSDT,GDT和IDT的所有详细信息

service-descriptor-table
service-descriptor-table

几天前,我一直在寻找一些东西向我展示SSDTGDT(这在恶意软件分析中确实很重要,因为大多数rootkit都对连接和更改这些东西感兴趣。)

•SSDT(系统服务描述符表)
•GDT(全局描述符表)
IDT(中断描述符表)

它们是操作系统中非常重要的表,例如,SSDT在用户模式应用程序中类似于IAT(导入地址表),它包含指向所有.dll程序集的导出函数的指针,在这种情况下,SSDT包含指向本机Windows API的指针。

您可以想象,每次使用此功能时,攻击者如何可以更改或挂钩它们,并启动和过滤参数。然后我发现了类似的东西:

lkd> u dwo(nt!KiServiC++eTable)+nt!KiServiceTable L1
 nt!NtMapUserPhysicalPagesScatter:
 fffff800‘013728b0 488bc4 mov rax,rsp
 lkd> u dwo(nt!KiServiceTable+4)+nt!KiServiceTable L1
 nt!NtWAItForSingleObject:
 fffff800‘012b83a0 4c89442418 mov [rsp+0x18],r8

这不是我真正想要的,但是当我读到一篇有关Patchguard绕过的文章时,它可以以某种方式帮助我解决问题,

它说 :

在Windows x64内核上,nt!KeServiceDescriptorTable传达了本机系统调用接口的实际调度表的地址和调度表中的条目数。在这种情况下,实际的分派表将作为相对偏移量数组存储在nt!KiServiceTable中。”

如果您不了解SSDT,GDT和IDT,那么我想向您展示一个名为SwishDbgExt的工具,它是开源的,免费的!

可用在:https://github.com/comaeio/SwishDbgExt

它对我有很大帮助!从源代码编译后,您需要像这样加载dll:

!load C:userssinadesktopSwishDbgExt.dll

然后只需在Windbg中使用!ms_ssdt和!ms_gdt和!ms_idt即可获取有关下表的信息的完整列表。

注意:Windows内核还使用Patchguard来保护其内核免遭此类更改,但它的安全性相对于晦涩难懂,因为内核驱动程序以与内核相同的特权运行,并且有大量文章介绍了如何绕过Patchguard,x86中没有类似的保护措施系统,因为它们没有补丁保护之类的东西(但我不知道Windows是否具有任何特殊的机制来保护x86计算机中的这些表。)

就是这样。在此Windbg扩展中可以找到很多好东西,您可以在自述文件或Github页面中找到它们,这确实值得测试

标签