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.先设置改进程的映像劫持,映像劫持可看我的另一个博客: https://blog.lovetail.cn/index.php/archives/16/
2.停止该服务
3.当调试服务.exe文件时,其实是在从服务启动时进行调试的,系统对启动服务设置了默认的超时时间,超过时间就会退出启动并报错:
系统默认启动服务的超时时间是30秒,但30秒远远不够对服务进行分析,所以要延长服务超时的时长。
打开注册表,在HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control 键值下查找ServicesPipeTimeout参数,一般不存在,需要新建。新建DWORD值“ServicesPipeTimeout”,其值为欲设置的超时时间,先选择为十进制,数值单位是毫秒,如设置 24小时,则值为86400000毫秒:
- 设置要调试的服务与桌面交互
之有打开了桌面交互功能才能够在服务被加载的时候弹出OD/Windbg。首先是打开服务的桌面交互功能。在cmd中输入,services.msc,打开服务控制版面,找到要被调试的服务,然后勾选桌面交互选项:
实际上这等同于修改注册表中的要调试服务的type选项。选择“Type”,修改其值为:原值 OR 0x00000100(如原值为:0x00000010 OR 0x00000100 =0x00000110):
除了要打开服务的桌面交互选项之外,还要开启服务的桌面交互检测服务,系统默认通常是关闭的,需要手动打开。如果不打开该服务,OD/windbg调试窗口就不会弹出:
注意:很多电脑找不到桌面交互检测服务,尤其是win10 就算开启来也会有问题,建议虚拟机里装win7 调试