调试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