调试windows服务

获取中...

windows服务启动后,进程是system权限,一般od等无法附加,通常有2个办法

方法1(不完美):

找到服务对应的进程pe文件,直接拖入od载入,如果直接跑起来会闪退,因为服务进程肯定是会检测是否在服务启动的,所以需要在入口断点后,去寻找 StartServiceCtrlDispatcher 函数的位置
liv39myl.png

StartServiceCtrlDispatcher 的入参是 SERVICE_TABLE_ ENTRY 结构体

typedef struct _SERVICE_TABLE_ENTRYA {
LPSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONA lpServiceProc;
} SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;

根据入参倒推,可以获取到 lpServiceProc 的地址,也就是主函数的地址

然后直接设置EIP跳转到该地址调试

虽然是进入main方法了,但因为不是服务启动的,所以他调用服务的函数的时候会报错,我们可以让调试器来接管异常,但如果因为报错引起的连锁反应的话,闪退还是迟早的事。。所以这个方法不完美

方法2:

1.先设置改进程的映像劫持,映像劫持可看我的另一个博客: https://blog.lovetail.cn/index.php/archives/16/

2.停止该服务

3.当调试服务.exe文件时,其实是在从服务启动时进行调试的,系统对启动服务设置了默认的超时时间,超过时间就会退出启动并报错:

liv3a1y2.png

系统默认启动服务的超时时间是30秒,但30秒远远不够对服务进行分析,所以要延长服务超时的时长。

打开注册表,在HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control 键值下查找ServicesPipeTimeout参数,一般不存在,需要新建。新建DWORD值“ServicesPipeTimeout”,其值为欲设置的超时时间,先选择为十进制,数值单位是毫秒,如设置 24小时,则值为86400000毫秒:

liv3a9mi.png
在设置好貌似不能直接起到作用,需要重启才能有效果。

  1. 设置要调试的服务与桌面交互

之有打开了桌面交互功能才能够在服务被加载的时候弹出OD/Windbg。首先是打开服务的桌面交互功能。在cmd中输入,services.msc,打开服务控制版面,找到要被调试的服务,然后勾选桌面交互选项:
liv3aikx.png

实际上这等同于修改注册表中的要调试服务的type选项。选择“Type”,修改其值为:原值 OR 0x00000100(如原值为:0x00000010 OR 0x00000100 =0x00000110):

liv3atnh.png
除了要打开服务的桌面交互选项之外,还要开启服务的桌面交互检测服务,系统默认通常是关闭的,需要手动打开。如果不打开该服务,OD/windbg调试窗口就不会弹出:

liv3b2bd.png
启动该服务。

注意:很多电脑找不到桌面交互检测服务,尤其是win10 就算开启来也会有问题,建议虚拟机里装win7 调试

  1. 启动服务
    保证上面的步骤都设置好之后,启动要调试的服务,会弹出如下对话框:
    liv3bamr.png
    点击查看信息,此时调试器会跳出,加载到服务起始处:
    liv3blh2.png

参考连接: 使用Windbg&OllyDbg从头调试windows服务

打赏
评论区
头像