跟踪 WMI 查询





5.00/5 (3投票s)
本文的目的是展示如何使用汇编语言和强大的调试器捕获发送到系统的 WMI 查询,并以纯文本形式显示。
WMI 查询追踪
根据定义:Windows Management Instrumentation (WMI) 是对 Windows 驱动程序模型的扩展,它提供了一个操作系统接口,通过该接口,仪器化的组件提供信息和通知。WMI 是微软对分布式管理任务组 (DMTF) 的基于 Web 的企业管理 (WBEM) 和通用信息模型 (CIM) 标准的实现。
这不是一篇关于 WMI 的教程。 本文的目的是展示如何使用汇编语言和强大的调试器捕获发送到系统的 WMI 查询,并以纯文本形式显示。 不确定市场上是否有任何 WMI 分析器,但目的只是展示如何从您的应用程序中实现这一点。 实现方法有很多种,有时可能取决于客户端应用程序。 如果您需要具体帮助,请随时与我联系。 针对不同应用程序的解决方法可能完全不同。 本文面向 Windows 调试器中级到高级用户和升级工程师。
首先,让我们检查微软著名的信息系统(西班牙语为 Información del sistema)。
- 打开系统信息。 开始 -> 程序 -> 附件 -> 系统工具 -> 系统信息。 进程是:helpctr.exe
- 打开 Windows 调试器工具(该工具可以在微软网站上免费找到)。 这是升级工程师的首选工具。
- 使用“附加进程”选项或 F6 将此进程附加到
Windbg
。 - 经过深入研究,尝试搜索诸如
ExecuteQuery
、ExecWmi
或其他相关词语的函数后,我发现 fastprox 库中包含的CWbemSvcWrapper::XWbemServices::ExecQuery
可能有用。 让我们在那里设置一个断点bp fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery
- 使用 G 或 F5 继续运行应用程序
- 浏览系统信息界面。
- 如果界面冻结,则已启动断点,返回到 Windows 调试器控制台。
- 使用
ddu esp
检查最近执行的线程的堆栈,这意味着从堆栈顶部开始,给我堆栈中的所有 Unicode 字符串(dda
用于 ANSI 字符)ddu esp
- 很好,我们在特定位置找到了一个不错的字符串:
031dfe58
地址。 但是,如果在下一次迭代中,它会改变怎么办? 是否最好有一个可计算的位置? 问题是:ESP 寄存器到参数有多少字节? 我们可以计算出来。 - 很好,我们有 0xc 字节来自 ESP。 为了确保这个理论,执行
.printf “%mu”,poi(esp+c)
- 很好,我们有了从内存中提取信息的方法。 请记住,我们仍然处于函数入口点
fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery
- 我们可以设置一个明确的断点
bp
断点,.printf
打印%mu
Unicode,gc
继续执行bp fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery ".printf \"%mu\\n\", poi(esp+c);gc"