最近在群里看到有相关服务调试的问题,碰巧自己之前做服务调试也遇到过相关的问题,就将之前的服务调试过程记录分享给大家,也在论坛里找过一些服务调试的方式,效果不是太好,便将自己的尝试结果分享给需要的朋友。
DLL服务调试
第一种尝试的方式修改OEP,导致系统不稳定甚至卡顿。
原始的函数信息
5FF75670 > 55 push ebp
5FF75671 8BEC mov ebp,esp
5FF75673 83EC 3C sub esp,3C
5FF75676 A1 0880F85F mov eax,dword ptr ds:[5FF88008]
修改后的函数信息
原始操作字节码 EB FE 90
5FF75670 >- EB FE jmp short Microsof.ServiceMain
5FF75672 90 nop
5FF75673 83EC 3C sub esp,3C
5FF75676 A1 0880F85F mov eax,dword ptr ds:[5FF88008]
通过调试器附加相应的进程来完成相关调试,不太好使容易出现卡死的状态,导致系统不稳定。
第二种尝试的方式利用映像劫持,结果不错但不够通用。
主要涉及修改注册表相关信息和配置修改问题
首先开启服务的交互选项,勾选“允许服务与桌面交互”的选项。
在服务管理器中启动Interactive Services Detection,默认是关闭的。
修改Interactive Services Detection服务的启动方式并启动该服务。
通过服务定位到注册表位置
修改ImagePath的svchost为scvhost(多么鸡贼的想法,我怎么就没想到呢~,失误,失误),这样可以防止意外重启导致计算机无法正常开机。并且由于scvhost服务众多,容易出现错误调试的情况,修改名字后可以定位到唯一的服务更加准确,记得在修改完成后复制一个svchost并改名为scvhost。
主键 HKEY_LOCAL_MACHINE
子键 SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
添加新的子项scvhost.exe 创建字符串数值debugger 设置调试器的信息
点击启动服务时,弹出交互式提示,点击查看消息即可。
成功进入到交互式调试。
但是这样存在一个问题,调试时截图不方便并且调试时界面有些过于丑陋(主要是嫌弃这种风格)。
并且由于有些服务会检测父进程是否是Services服务,交互式调试父进程是调试器本身,所以在调试某些服务会出现一些问题,比如wannamine4.0服务就存在这样的校验。
于是我想到了把映像劫持使用的修改名字的方法用到修改OEP上面,并且想到了解决卡顿的问题(进程启动后暂停进程即可,我可真是个小机灵鬼)。
首先还是先完成服务的修改,这样便于更清楚的看到相关的进程情况。
启动服务,通过procexp进程查看器,对该进程进行挂起操作。
通过调试器附加,可以清楚地看到scvhost.exe不同于svchost.exe
内存搜索EB FE 90,定位到导出函数的位置。
找到了之前修改的函数头,通过该地址跳转到对应的内存区域。
修改为原始的函数头,即恢复EB FE 90为55 8B EC即可,下好断点恢复线程跑起来就可以尽情的调试服务代码了,别忘记了恢复线程因为之前暂停了线程的执行。
尽管最后还是弹出了服务无法启动的提示框,但是并不影响到服务的调试。
通过这种方法的组合实现了服务的调试,并且不用在意服务管理器的错误提示信息,也是我在调试服务后想到的效果不错并且配置起来不那么麻烦的组合方式,也许还有其他更方便服务调试方式,还请各位不吝啬留言告知一下。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!