-
-
[翻译]调试Windows服务进行恶意软件分析与逆向工程
-
-
[翻译]调试Windows服务进行恶意软件分析与逆向工程
一项服务(也称为Windows服务)是一种由Windows启动且无需人机交互的用户模式过程。 它在系统启动时自启动,或者由使用Win32 API中包含的服务功能的应用程序启动。 Windows服务也可以由用户通过服务控制面板实用程序启动。 每项服务必须符合服务控制管理器(SCM)的接口规则。 ——MSDN
在Windows Vista版本之前,Windows服务是同一个session中的普通进程。在Windows Vista之后,除Windows服务之外都被移出Session 0。一般来说,Session 0的可执行文件不会与桌面Session——Session 1通信。这使得调试Windows服务变得很困难。
与普通应用程序不同的是,我们不能通过在命令后输入它的名称或是调用CreateProcess API来启动Windows服务。相反,我们需要依赖服务控制管理器来开启或关闭进程。
注意:这里我们假设没有权限访问这项服务程序的源代码。
当服务控制管理器启动服务进程时,它会等待进程调用StartServiceCtrlDispatcher函数,如果我们从任何其他上下文运行可执行的服务,将报错ERROR_FAILED_SERVICE_CONTROLLER_CONNECT (0x427)。
我们可以开启一项服务并选择一个调试器附加服务进程,如WinDbg:
要在进程执行之前运行调试器,我们需要在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProgramName 下创建表项 或使用 GFlags (全局标志编辑器) 设置调试器。我们不能直接使用Windbg,因为Windows服务和WinDbg将运行在session 0,而我们在session 1无法看见WinDbg的UI界面。但我们可以在session 0使用NTSD作为服务端调试器,在session 1使用WinDbg作为客户端调试器。
输入-noio参数来运行 NTSD ,没有控制台,只能通过远程连接访问运行。
有一个关键的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control key: ServicesPipeTimeout
在一个Windows服务启动时,时钟就开始运行。当到达ServicesPipeTimeout的值时,任何附加服务进程的调试器都会被终止。因此,你设置的值应该比启动服务和session调试所花费的时间要长。例如,60000的值是一分钟,而86400000的值是24小时。当未设置该注册表项的值时,默认的超时时间约为30秒。 - MSDN
修改该值之后需要重启系统。
之后, 在 WinDbg 中运行命令: .\windbg.exe -remote tcp:server=localhost,port=55555.
我们可以在样本的入口点添加一个断点(基地址+入口点的RVA地址)来启动加载的可执行文件的地址:
就这样,我们到达了入口点。
Twitter @_qaz_qaz
欢迎讨论。 Reddit
原文地址:https://secrary.com/Random/WindowsServiceDebugging/
本文由 看雪翻译小组 Iuobobo 提供翻译
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!