Windows调试技巧:捕获WMI查询

Windows Management Instrumentation (WMI) 是一种扩展Windows驱动模型的接口,它允许操作系统通过各种组件提供信息和通知。WMI是微软对分布式管理任务组(DMTF)的Web-Based Enterprise Management (WBEM) 和Common Information Model (CIM) 标准的实现。本文不是关于WMI的教程,而是展示如何使用汇编语言和强大的调试器来捕获系统发送的WMI查询的明文。

市场上可能没有现成的WMI分析器,但本文的目的是展示如何从应用程序中做到这一点。实现这一目标的方法有很多,有时可能取决于客户端应用程序。如果需要特定帮助,请不要犹豫联系。针对不同应用程序的解决方法可能完全不同。本文面向中级到高级的Windows调试器用户和升级工程师。

开始之前

首先,让检查一下微软著名的信息系统(西班牙语为Información del sistema)。打开系统信息。开始->程序->附件->系统工具->系统信息。该进程是:

helpctr.exe

打开Windows调试工具(这个工具可以在微软网站上免费找到)。这是升级工程师的首选工具。

使用Windbg调试器

使用附加进程选项或F6将此进程附加到Windbg。

经过深入研究,尝试搜索如ExecuteQuery、ExecWmi等函数,发现fastprox库中包含的CWbemSvcWrapper::XWbemServices::ExecQuery可能很有用。让在那里设置一个断点:

bp fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery

使用G或F5继续运行应用程序。

浏览系统信息界面。如果界面冻结,说明已经触发了一个断点,返回到Windows调试器控制台。

检查线程堆栈

使用以下命令检查最近执行的线程的堆栈:

ddu esp

这意味着从堆栈顶部开始,给所有Unicode字符串(对于ANSI字符使用dda)。

很好,在特定位置找到了一个不错的字符串:

031dfe58

地址。但如果在下一次迭代中它改变了怎么办?是否更希望有一个可计算的位置?问题是:从ESP寄存器到参数有多少字节?可以计算它。

好的,有0xc字节从ESP。为了验证这个理论,执行:

.printf "%mu",poi(esp+c)

很好,有从内存中提取信息的方法。请记住,仍然在函数的入口点:

fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery

可以设置一个确定性的断点:

bp fastprox!CWbemSvcWrapper::XWbemServices::ExecQuery ".printf "%mu\n", poi(esp+c);gc"
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485