我正在尝试对在OllyDbg中动态打开Windows服务的恶意软件进行反向工程。
当恶意软件调用StartServiceCtrDispatcherW时,我收到错误消息:


我如何继续动态分析该恶意软件?

注意:我已经二手Image File Execution Options

评论

是StartServiceCtrlDispatcher

是的,我编辑我的问题

需要更多信息。让我们使用Windows版本。您在IFEO中到底做了什么?服务是EXE还是DLL?谁运行服务EXE?...

#1 楼

如果要调试服务初始化,并且该初始化自动发生(不是由执行的某些操作触发),则在带有ollydbg的Windows XP或更高版本的Windows上可能无法执行此操作。您必须使用WinDbg。

您需要为进程名称设置IFEO调试器,以将CDB作为服务器运行(例如cdb.exe -server tcp:port=12345 -noio),将WinDbg作为客户端运行并连接到服务器(windbg.exe -remote tcp:server=localhost,port=12345) 。

您可能需要将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout注册表值更改为更长一些。这是SCM等待其运行的服务与之对话的时间。

如果不必调试初始化,只需在服务启动后将其附加即可,然后可以使用ollydbg。

所有这些以及您需要了解的几乎所有内容都记录在标题为“调试服务应用程序”的MSDN页面下。


编辑:如果进行修补二进制文件是可能的,您可以在入口点添加一个无限循环,如建议的gandolf,然后在登录后附加调试器。

或者,如果二进制文件没有执行任何会干扰SEH的技巧它:在入口点添加一个异常(0xCC-int 3是显而易见的选择),将AeDebug设置为长时间运行的进程(例如notepad.exe),然后附加调试器。这就是Inside Windows Debugging提出的建议(p。139)。或者,更简单,更有意义的方法是:添加相同的INT3,并将AeDebug设置为相同的cdb.exe命令行登录后放入IFEO并将WinDbg连接到它。

评论


如果服务指向磁盘上的可执行文件,则可以将服务EntryPoint例程修补到EBFE(Inifnite跳转循环)并更改ServicesPipeTimeout密钥,并在系统启动时使用调试器将其附加。我已经成功完成了此任务。

– Gandolf
15年11月23日在18:40

@gandolf,如果您可以编辑二进制文件,那么您仍然拥有比添加空的紧密循环更可取的选项。我已经编辑了答案,以包括那些选项(包括循环)。

– conio
16年2月20日在21:51

#2 楼

好吧,据我所知,您无法在调试器(证明)中调试服务的处理代码。

如果您真的需要它,我认为您应该坚持使用运行恶意软件的vm进行内核调试,但是也许有人会提供更好的解决方案-这是我想到的第一个解决方案。

UPD

注释中有一个链接,涵盖了内核调试所需的基础知识。但是,在完成所有相关内容的设置之后,您可能会遇到在服务启动的确切位置中断的问题。

我认为以下命令将帮助您走得更远,除非您做了它已经是您自己的了:

bp ADVAPI32!StartServiceCtrlDispatcherW; dd esp或使用此备忘单为Windbg带来更多灵感。

评论


我不明白您的解决方案,能否详细说明您的答案?

–马坦·瑞沃(Matan Revivo)
2015年9月21日在6:14

@MatanRevivo:在VM中运行恶意软件示例,并通过附加的内核调试器逐步浏览系统代码。请参阅设置内核模式调试...

–乔希·波利(Josh Polary)
2015年9月21日在17:02

除非在非常特殊的情况下(例如,调试winlogon),否则无需使用内核调试。您所谓的“证明”中的问题是,应用程序不是由SCM作为服务运行的,而是直接由VS运行的。这就是StartServiceCtrlDispatcher的文档中有关ERROR_FAILED_SERVICE_CONTROLLER_CONNECT的内容。这当然并不意味着您不能使用用户模式调试。

– conio
2015年11月23日13:43