如何调试服务

来源:互联网 发布:360浏览器淘宝比价 编辑:程序博客网 时间:2024/04/30 03:30

1. IDA或者OD分析程序,找到启动服务(CreateService,StartService)调用代码看是要启动哪个文件

附加Services.exe,在CreateProcessInternalW下断,就能捕获到服务进程的创建

之后可以修改参数 dwCreateFlags 挂起状态 CREATE_SUSPENDED(0x00000004)

之后可以附加调试服务进程,附加之后打断点,再唤醒所有线程进行调试

2. 分析(startService函数的参数,找到服务控制的回调函数ServiceMain

启动服务的时候,可以直接将call startSevice 改成 call ServicesMain,调整一下栈针,可以直接动态调试代码服务回调

因为startSevice函数的原型和ServiceMain原型类似

BOOL WINAPI StartService(

  _In_     SC_HANDLE hService,

  _In_     DWORD     dwNumServiceArgs,

  _In_opt_ LPCTSTR   *lpServiceArgVectors

);

 

Push lpServiceArgVectors

Push dwNumServiceArgs

Push hService               // 代码nop掉

Call StartService           // 修改ServiceMain

 

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv)

 

push lpArgv

push dwArgc

 

 

3. 如果不是驱动服务,普通服务是exe,服务注册完了,可以直接动态加载调试

 

 

 

另外补充一下系统知识:

基本系统进程

Csrss.exe:这是子系统服务器进程,负责控制Windows创建或删除线程以及16位的虚拟DOS环境。

System Idle Process:这个进程是作为单线程运行在每个处理器上,并在系统不处理其它线程的时候分派处理器的时间。

Smss.exe:这是一个会话管理子系统,负责启动用户会话。

Services.exe系统服务管理工具

Lsass.exe:本地的安全授权服务。

Explorer.exe资源管理器

Spoolsv.exe:管理缓冲区中的打印和传真作业。

Svchost.exe:这个进程要着重说明一下,有不少朋友都有这种错觉:若是在任务管理器中看到多个Svchost.exe在运行,就觉得是有病毒了。其实并不一定,系统启动的时候,Svchost.exe将检查注册表中的位置来创建需要加载的服务列表,如果多个Svchost.exe同时运行,则表明当前有多组服务处于活动状态;多个DLL文件正在调用它。

 


0 0
原创粉丝点击