SwishDbgExt 是一个 Microsoft WinDbg 调试扩展,扩展了 Microsoft WinDbg 可用命令集,同时也修复并改进了现有命令。 该扩展由 Matt Suiche (@msuiche) 开发——如有需要,欢迎通过 [email protected] 联系我们,提出更多功能需求、提供贡献和/或报告错误。
SwishDbgExt 旨在通过一系列调试、事件响应和内存取证命令,让内核开发者、故障排查人员和安全专家的生活更轻松。 由于 SwishDbgExt 是一个 WinDbg 调试扩展,这意味着它可以在本地或远程内核调试会话、由 Microsoft LiveKd 生成的实时会话、以及由蓝屏崩溃或混合型工具(如 Comae DumpIt)生成的 Microsoft 崩溃转储上使用。
更多信息请访问 https://blog.comae.io/comae-2016-contest-swishdbgext-features-3c9a63c62209#.tnt1b9usx
您可以将 WinDbg 扩展复制到相应的(x86 或 x64)WinDbg 文件夹中,或者使用 !load 命令手动加载,如下所示。请注意,目标 dll 的完整路径中不能包含空格或引号。
!load X:\FullPath\SwishDbgExt.dll
###示例:
kd> !load E:\projects\labs\SwishDbgExt\bin\x64\SwishDbgExt.dll;
SwishDbgExt v0.7.0 (Nov 2 2016) - Incident Response & Digital Forensics Debugging Extension
SwishDbgExt Copyright (C) 2016 Comae Technologies FZE - http://www.comae.io
SwishDbgExt Copyright (C) 2014-2016 Matthieu Suiche (@msuiche)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
如果您希望使用更加 DML 友好的模板更新您的 WinDbg 模板,可以直接导入随包附带的 windbg_template.reg 文件。
显示可用的扩展命令信息。
如果不指定参数,此命令将列出所有命令;如果指定了现有命令作为参数,则将列出该命令的参数列表。
显示回调函数
查找已使用的代码洞
显示控制台命令历史记录
显示用户凭据(基于 gentilwiki 的 mimikatz)
显示驱动程序列表。 !ms_drivers 将显示当前已加载的驱动程序列表。 在此示例中,以下是该内核转储崩溃时加载的几个驱动程序: 使用此命令,我们还可以查看驱动程序内部的详细 IRP 信息: 在上图中,我们可以看到 e1cexpress.sys 的 IRP 中特定于驱动程序的 I/O 栈位置。这里我们可以看到函数代码,如 IRP_MJ_CREATE,它打开目标设备对象,表明该设备对象存在且可用于 I/O 操作。
将内存空间转储到磁盘
显示 Ex 队列工作线程。
!exqueue 在 Windows 8 上无法正常工作,因此需要实现一个可用的版本。与原始命令一样,此命令显示工作线程队列。
重置 WinDbg 中的分段(修复 "16.kd>")
显示 GDT。
!ms_gdt 显示全局描述符表。注意在 x64 上,每个选择子都是平坦的(0x0000000000000000 到 0xFFFFFFFFFFFFFFFF)。该命令对于检查 GDT 是否存在可疑挂钩特别有用,因为在 x64 上尝试挂钩会触发 bug check。这是因为 x64 禁止对 GDT 进行挂钩。
显示注册表配置单元列表。
ms_hivelist 显示注册表配置单元列表。
我们可以直接查看某个配置单元(例如 \Registry\Machine\Software)的子项、值等:

显示 IDT。
!ms_idt 显示中断描述符表。与 GDT 非常相似,如果在 x64 系统上对 IDT 进行了挂钩,则会触发 bug check。这是因为 Microsoft(通过编程方式)实现了防止内核模式驱动程序挂钩 IDT 的机制,否则驱动程序通常会拦截对 IDT 的调用并进行自己的处理。这就是在上图中,所有条目都显示为“No”的原因。
分析内存空间并返回恶意软件评分指数(MSI)——(基于 Frank Boldewin 的工作)
扫描主引导记录(MBR)
显示网络信息(套接字、连接等)
显示对象列表
显示进程列表。
!ms_process 是 !process 和 !dml_proc 的改进版本。
其中一个值得注意的优点是使用了 DML(调试器标记语言),所有带下划线的命令实际上都是指向命令的链接。
例如,下面可以看到 /vads /scan 的输出,用于扫描 VAD(虚拟地址描述符)。您会注意到其中一列给出了“恶意软件评分指数”,这对于检测 Shellcode 或堆喷射非常有用。
在下面的截图中,您可以看到多个 VAD 中异常高的分数——这是由于使用了堆喷射。只需点击分数即可运行扫描算法。
该扫描算法基于 Frank Boldewin 的 OfficeMalScanner 实用工具。
并返回关于 Shellcode 位置的信息:
/scan 选项还可以用于导出函数,以检查 EAT(导出地址表)是否已被修补,或函数序言是否被修改。
类似测试也可用于 SSDT(!ms_ssdt)。
读取键控制块
读取键节点。
!reg WinDbg 命令长期以来一直令人困扰,因为它存在一些错误。这就是 SwishDbgExt 拥有自己的注册表浏览器功能,以尽可能简化注册表数据访问的原因。
读取键值
扫描并显示可疑的 NDIS 挂钩
显示服务列表
显示服务描述符表(SDT)函数。
!ms_ssdt 显示系统服务调度表。该命令在调查通过直接内核对象操作(DKOM)进行可疑 Rootkit 挂钩时非常有用。如果您在此处看到某个低级例程被挂钩(例如 nt!NtEnumerateKey),这可以帮助您分析可能的 Rootkit 感染。
显示与存储管理器(ReadyBoost)相关的信息。
该命令允许列出操作系统当前使用的 ReadyBoost(需要 USB 3.0)缓存,同时也可以显示由存储管理器管理的内存页面的日志。 参数:/cache
显示 KTIMER 列表。
!ms_timers 显示 KTIMER 结构,这是一个不透明的结构,表示并包含各种定时器对象。该命令有助于找出哪些驱动程序创建了哪些定时器对象,哪些驱动程序调用了哪些例程等。
显示缓存的 VACB 列表
打开/关闭详细模式
以下内容基于 Alex Ionescu 发布的研究成果,可在此处获取:https://github.com/ionescu007/lxss/
该功能作为 Windows 10+ 操作系统上的可选功能,可通过以下 PowerShell 命令安装:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
您可以通过以下链接了解更多关于 Linux 的 Windows 子系统的信息:
Windows Subsystem for Linux Overview.
Instance 0xFFFFE704EEB8F010
GUID: {E29032FD-35D3-4C53-AB68-6BCEBDA7176F}
State: (1) [STARTED]
Creation Flags: 00000001
GlobalData: 0xFFFFF802ED4138A0
Root Handle: 80000834
Temp Handle: 80000838
Job Handle: 8000083c
Token: 80000818
Event Handle: 800008bc
Map Paths (0): 0xFFFFE704EF437920
VFS Context: 0xFFFFE704EEFC4710
Memory Flags: 0x2
Last PID: 35
Thread Groups: 3
Session 0xFFFFE704EDB79EC0
Instance: 0xFFFFE704EEB8F010
Console inode: 0x0
Foreground PID: -1
Process Group 0xFFFFE704EDB79AE0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EDB79EC0
Thread Group 0xFFFFE704EF4F8000
Binary Path: /init
Thread(s): 1
Owner Process Group: 0xFFFFE704EDB79AE0
Flags: 0x00000000
Main Thread: 0xFFFFE704EF5CC010
Arguments (006 bytes): 0x00007FFFC081D6E0
Process 0xFFFFE704EF2F1D70
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84EF800
NT Process Handle: 0xFFFFFFFF80000F58
VDSO Address: 0x00007FFFC0849000
Stack Address: 0x00007FFFC001E000
Session 0xFFFFE704EF5DB830
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF32D7A0
Foreground PID: 2
Process Group 0xFFFFE704EF5EF970
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF5DB830
Thread Group 0xFFFFE704EF5EE000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704EF5EF970
Flags: 0x0000000C
Main Thread: 0xFFFFE704EF5F8010
Arguments (010 bytes): 0x00007FFFDF34E418
Process 0xFFFFE704EDEF6EC0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84E6800
NT Process Handle: 0xFFFFFFFF80000D9C
VDSO Address: 0x00007FFFDF883000
Stack Address: 0x00007FFFDEB4F000
Session 0xFFFFE704EF0A8ED0
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF06B9C0
Foreground PID: 19
Process Group 0xFFFFE704F059CBC0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF0A8ED0
Thread Group 0xFFFFE704EDE51000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704F059CBC0
Flags: 0x0000000C
Main Thread: 0xFFFFE704EDC78090
Arguments (010 bytes): 0x00007FFFF78CFB78
Process 0xFFFFE704F06389B0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E618D800
NT Process Handle: 0xFFFFFFFF80001650
VDSO Address: 0x00007FFFF7C99000
Stack Address: 0x00007FFFF70D0000
使用 Yara 规则扫描进程内存。
扫描单个进程内存。
!ms_yarascan /pid 0x228 /yarafile /yarafile C:\Rules.yar
扫描所有进程内存。
!for_each_process "r? @$t0 = (nt!_EPROCESS *) @#Process; .process /r /p @$t0; !ms_yarascan /pid @@C++(@$t0->UniqueProcessId) /yarafile C:\\Rules.yar"
MsPEImageFile 包含 Windows 二进制文件(PE)使用的基本通用信息,并派生出三个不同的类: