我有一个正在检查键盘类型和语言环境信息的恶意软件。

之后,它会创建一个服务,其中BinaryPathName作为恶意软件的exe地址。创建服务后,恶意软件将其启动
,并致电StartServiceCtrlDispatcher并卡在那里。此后没有进一步的代码评估。

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

我想调试此恶意软件安装的服务的ServiceMain Function。

经过大量的搜索,我发现了这篇文章。我尝试执行第二种方法“配置服务以连接WinDbg调试器启动”,但是我的VM却冻结了。

所以我的问题(通常)是,我如何调试任何服务的ServiceMain函数?

评论

您是否使服务具有交互性?

是。通过在服务属性>“登录”选项卡上勾选“允许服务与桌面交互”。

#1 楼

此答案忽略了共享服务的情况,因为这更为复杂,OP并未具体提及。

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

如何调试服务?

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

但是为什么在调用StartServiceCtrlDispatcher之后执行停止了?

但是,当处理大多数恶意软件样本时只需自己创建进程并跳过任何与服务相关的功能就足够了。入口点以注册连接回服务管理器。与服务管理器的连接是服务报告其如何成功加载和运行,如何获取关闭,重新启动命令的方式。

StartServiceCtrlDispatcher具有单个参数StartServiceCtrlDispatcher结构。它有两个成员,第二个成员的类型为SERVICE_TABLE_ENTRY,称为LPSERVICE_MAIN_FUNCTION。该参数实际上是指向lpServiceProc函数的函数指针。拿起它,解析结构,您将到达执行返回给服务的位置以继续执行!

VM,为什么不运行?!

很遗憾,您没有提供足够的详细信息来诊断那个人。

#2 楼

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

#3 楼

其他人已经描述了执行此操作的优雅方法,因此我将发布一个肮脏的(但用途非常广泛)的技巧:

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

这确实很丑陋,而且不切实际,但是它将适用于从DLL到驱动程序的所有内容。