如何调试服务的ServiceMain函数?

逆向工程 视窗 ollydbg 风袋 登录
2021-06-15 10:49:22

我有一个正在检查键盘类型和区域设置信息的恶意软件。

之后,它会创建一个以 BinaryPathName 作为恶意软件的 exe 地址的服务。创建服务后,恶意软件启动它并调用StartServiceCtrlDispatcher并停留在那里。之后不再评估其他代码。

我已经在 OllyDbg 和 ImmDbg 中完成了所有这些分析。

我想调试这个恶意软件安装的服务的 ServiceMain 函数。

在谷歌搜索了很多之后,我找到了这篇文章。我尝试执行第二个方法“配置服务以从附加的 WinDbg 调试器开始”,但不知何故我的 VM 冻结了。

所以我的问题(一般来说),如何调试任何服务的 ServiceMain 功能?

3个回答

这个答案忽略了共享服务的情况,因为它更复杂,OP 没有具体提到这一点。

服务通常是与任何其他进程一样的正常进程,但是它们由操作系统执行,而不是创建/启动进程,这可能会引起一些混乱。

如何调试服务?

像任何其他进程一样,您可以在运行大多数(阅读:所有体面的)调试器支持附加(并将受保护的进程服务放在一边)可以附加到它之后附加到它。如果您担心在附加之前会错过执行的某些关键部分,则可以使用可让您调试衍生进程的工具。Ollydbg 也支持 x64。在检测和附加到新进程方面,Rohitab 的 API Monitor 具有不错的功能。

但为什么调用后停止执行StartServiceCtrlDispatcher

但是,在处理大多数恶意软件样本时,自己创建进程并跳过任何与服务相关的功能就足够了。

您的具体问题似乎与StartServiceCtrlDispatcher函数的执行有关,该函数是服务入口点调用的函数,以便将连接注册回服务管理器。与服务管理器的连接是服务报告它已成功加载和运行的方式,它如何获取关闭、重新启动等命令。

StartServiceCtrlDispatcher有一个参数,即SERVICE_TABLE_ENTRY结构。它有两个成员,其中第二个是 typeLPSERVICE_MAIN_FUNCTION并称为lpServiceProc该参数实际上是指向该ServiceMain函数的函数指针拿起它,解析结构,您将到达执行将返回给服务以继续执行的地方!

VM,你为什么不跑?!

好吧,不幸的是你没有提供足够的细节来诊断那个。

我更喜欢使用 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Debugger在这里查看更多指定调试器进程,它在服务进程启动后立即启动。这样我就可以在一开始就设置断点。

其他人已经描述了这样做的优雅方式,所以我将发布一个肮脏(但非常通用)的技巧:

在十六进制编辑器中打开二进制文件,并用 EB FE(跳转到自身)替换要调试的函数的前两个字节。正常运行二进制文件(例如启动服务),一旦进程开始消耗 100% 的 CPU(好吧,100% 的一个内核),连接调试器,在你的小无限循环上放置一个断点,点击运行,修补原始字节,您就可以开始调试了。

它真的很丑而且很不切实际,但它可以处理从 DLL 到驱动程序的所有内容。