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调试工具(这个工具可以在微软网站上免费找到)。这是升级工程师的首选工具。
使用附加进程选项或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"