x51zqq 发表于 2017-3-24 16:31

简述: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

Hmily 发表于 2017-3-24 16:49

之前也遇到过很多服务启动的进程需要调试,提供几个用过的思路:
1、映象劫持(Image File Execution Options):把进程名劫持成调试器,服务启动的时候会自动用调试器启动。
2、入口点劫持:把要调试的文件入口点代码直接改成jmp oep地址,让程序死循环,等服务启动后附加进程再把代码恢复。

x51zqq 发表于 2017-3-24 17:24

Hmily 发表于 2017-3-24 16:49
之前也遇到过很多服务启动的进程需要调试,提供几个用过的思路:
1、映象劫持(Image File Execution Opti ...

{:17_1073:}一会儿都试试,感谢H大

ankaonimu 发表于 2017-3-24 17:30

数学没学好,看着头疼。

拾光野 发表于 2017-3-24 17:35

谢谢大神讲解!!

soyiC 发表于 2017-3-24 17:48

感谢发布原创作品{:1_927:}

JuiceY 发表于 2017-3-24 17:59

好厉害,多谢大神分享技术

失色的美 发表于 2017-3-24 18:02

占个楼,在前排,支持楼主

yujj105 发表于 2017-3-25 07:16

膜拜楼主

梨花开 发表于 2017-3-25 12:21

谢谢楼主和Hmily提供的方法
页: [1] 2 3
查看完整版本: 简述:ServiceMain主函数的动态调试