调试windows服务

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

 

方法1(不完美): 

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

 

 

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.先设置改进程的映像劫持,映像劫持可看我的另一个博客  通过 映像劫持 来调试程序 - 、有妖气 - 博客园 (cnblogs.com)

2.停止该服务

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

 

 

 

 

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

 

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

 

 

 

 

 

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

 

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

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

 

 

 

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

 

 

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

 

 

 启动该服务。

 

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

 

5. 启动服务
保证上面的步骤都设置好之后,启动要调试的服务,会弹出如下对话框:

 

 

点击查看信息,此时调试器会跳出,加载到服务起始处:

 

 

参考连接:[原创]使用Windbg&OllyDbg从头调试windows服务-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com

 

posted @ 2022-10-09 15:29  、有妖气  阅读(484)  评论(0编辑  收藏  举报