简述:ServiceMain主函数的动态调试
本帖最后由 x51zqq 于 2017-3-24 16:37 编辑引言:
1.之前在分析一个PC病毒样本的时候,需要对服务的主函数进行动态调试(恶意行为都在主函数中体现),网上找了很多资料也没找到调试方法,所以现在对调试方法进行简单的总结,希望对遇到同样问题的人能有所帮助.
2.该方法只是调试服务的众多方法之一,这里写出只是个人觉得该方法相对简单一些.
3.这里假设读者对服务均有基础的理解,所以就不做基础铺垫了,直接上调试方法,之后在简单说下原理.
4.病毒链接:一款"骷髅"病毒的分析日常
流程:
1.找到启动服务StartServiceA 函数所在的地址2.将3个参数修改为2个3.修改StartServiceA函数地址为服务主函数地址
4.在服务主函数头部下断 5.F8运行
StartServiceA函数:
服务主函数:
开始修改:
修改后:
服务主函数头部下断:
F8运行:
原理:
因为startSevice函数的原型和ServiceMain的原型类似,所以在call startSevice函数的时候修改下参数,模拟系统调用ServiceMain,就可以对其进行调试了.
StartService函数原型:BOOL WINAPI StartService(
_In_ SC_HANDLE hService,
_In_ DWORD dwNumServiceArgs,
_In_opt_ LPCTSTR *lpServiceArgVectors
);
ServiceMain函数原型:void WINAPI ServiceMain(
DWORD dwArgc,
LPTSTR *lpArgv
);
修改:Push lpServiceArgVectors
Push dwNumServiceArgs
Push hService // 代码nop掉
Call StartService // 修改为ServiceMain
之前也遇到过很多服务启动的进程需要调试,提供几个用过的思路:
1、映象劫持(Image File Execution Options):把进程名劫持成调试器,服务启动的时候会自动用调试器启动。
2、入口点劫持:把要调试的文件入口点代码直接改成jmp oep地址,让程序死循环,等服务启动后附加进程再把代码恢复。 Hmily 发表于 2017-3-24 16:49
之前也遇到过很多服务启动的进程需要调试,提供几个用过的思路:
1、映象劫持(Image File Execution Opti ...
{:17_1073:}一会儿都试试,感谢H大 数学没学好,看着头疼。 谢谢大神讲解!! 感谢发布原创作品{:1_927:} 好厉害,多谢大神分享技术 占个楼,在前排,支持楼主 膜拜楼主 谢谢楼主和Hmily提供的方法