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:这是一个会话管理子系统,负责启动用户会话。
Lsass.exe:本地的安全授权服务。
Explorer.exe:资源管理器。
Spoolsv.exe:管理缓冲区中的打印和传真作业。
Svchost.exe:这个进程要着重说明一下,有不少朋友都有这种错觉:若是在“任务管理器”中看到多个Svchost.exe在运行,就觉得是有病毒了。其实并不一定,系统启动的时候,Svchost.exe将检查注册表中的位置来创建需要加载的服务列表,如果多个Svchost.exe同时运行,则表明当前有多组服务处于活动状态;多个DLL文件正在调用它。