首页
社区
课程
招聘
[翻译]调试Windows服务进行恶意软件分析与逆向工程
2018-6-1 00:09 5780

[翻译]调试Windows服务进行恶意软件分析与逆向工程

2018-6-1 00:09
5780

一项服务(也称为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)。

 

1

  • 如何才能调试Windows服务?

我们可以开启一项服务并选择一个调试器附加服务进程,如WinDbg:
2

  • 如果我们需要调试进程执行的起始点怎么办?

要在进程执行之前运行调试器,我们需要在注册表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作为客户端调试器。
3

 

输入-noio参数来运行 NTSD ,没有控制台,只能通过远程连接访问运行。

 

有一个关键的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control key: ServicesPipeTimeout

 

在一个Windows服务启动时,时钟就开始运行。当到达ServicesPipeTimeout的值时,任何附加服务进程的调试器都会被终止。因此,你设置的值应该比启动服务和session调试所花费的时间要长。例如,60000的值是一分钟,而86400000的值是24小时。当未设置该注册表项的值时,默认的超时时间约为30秒。 - MSDN

 

修改该值之后需要重启系统。
4

 

之后, 在 WinDbg 中运行命令: .\windbg.exe -remote tcp:server=localhost,port=55555.

 

我们可以在样本的入口点添加一个断点(基地址+入口点的RVA地址)来启动加载的可执行文件的地址:
ep

 

就这样,我们到达了入口点。

 

Twitter @_qaz_qaz

 

欢迎讨论。 Reddit

 

原文地址:https://secrary.com/Random/WindowsServiceDebugging/

 

本文由 看雪翻译小组 Iuobobo 提供翻译


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
evilkis 7 2018-6-1 00:41
2
0
感觉这老外就是把inside  windows  debugging那本书的这一小节  照抄了一遍
游客
登录 | 注册 方可回帖
返回