资源描述:
《木马编程diy服务启动技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、木马编程DIY服务启动技术文/图冷风随意打开一个木马的服务生成端,你都能发现里面有一种启动方式叫“服务启动”,也就是说这个技术以经是大众化的了,但是你写过这样的程序吗?如果写过的话,你就可以泡杯茶先休息一下,如果还不是太了解的话,那就一块来学习一下通常编写一个服务需要两个程序,一个是实现功能的Service程序,一个是用于对Service程序进行控制的控制程序。这里需要注意的是实现Service功能的程序与一般的程序是有区别的,其区别并不仅仅在于是不是有GUI窗体,在其格式上也有着不同,下面我们先写一个Cm
2、dShell后门的Service程序。对于Service程序来说,它一般又由以下四部分组成:main(),ServiceMain()和Handler()当然还有我们的功能实现函数比如MyWork()它们之间的关系,用一个简单的图示就可以了然于胸了如图示1,其服务程序的基本流程就是由main()调用ServiceMain()而由ServiceMain()调用Handler()和执行功能函数MyWork()到现在为止,你以经大体了解了服务程序的流程,按上面的流程一步一步来实现这个后门程序。 1.程序的入口mai
3、n()函数服务程序的入口与普通程序一样也是从main()开始,但不同的是服务程序的main极为简单,因为它只负责创建分派表并启动控制分派机,其代码如下:voidmain(){ SERVICE_TABLE_ENTRYServiceTable[2]; ServiceTable[0].lpServiceName="Name";//线程名字 ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;//线程入口地址 Serv
4、iceTable[1].lpServiceName=NULL; ServiceTable[1].lpServiceProc=NULL;//最后一个必须为NULL StartServiceCtrlDispatcher(ServiceTable);//启动服务的控制分派机线程}main()是Service程序的主线程,当serviecontrolmanager开始一个Service进程时,它总是等待这个Service程序去调用StartServiceCtrlDispatcher()函数。当执行服务时ma
5、in()时将会调用ServiceMain函数,当ServiceMain执行完毕或者说发生错误时StartServiceCtrlDispatcher函数返回,然后主进程终止。2.服务的真正入口ServiceMain()ServiceMain()是Service程序的真正入口点,它主要完成以下功能,首先注册一个Handler去处理控制程序或控制面板,Service的控制要求,比如启动,停止,暂停重起等,其次就是实现我们的功能操作,其实现代码如下:VOIDWINAPIServiceMain(DWORDdwArgc
6、,LPTSTR*lpszArgv){ DWORD status=0; DWORD specificError=0xfffffff; ServiceStatus.dwServiceType =SERVICE_WIN32; ServiceStatus.dwCurrentState =SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted =SERVICE_ACCEPT_STOP
7、SERVICE_ACCEPT_
8、SHUTDOWN
9、SERVICE_ACCEPT_PAUSE_CONTINUE; ServiceStatus.dwWin32ExitCode =0; ServiceStatus.dwServiceSpecificExitCode=0; ServiceStatus.dwCheckPoint =0; ServiceStatus.dwWaitHint =0; //调用RegisterServiceCtrlHandler()注册一个ServiceHandle
10、r函数用来处理程序对Service的控制要求 hStatus=RegisterServiceCtrlHandler("ServiceName",(LPHANDLER_FUNCTION)ServiceHandler); if(hStatus==0) return; //Handleerrorcondition status=GetLastError(); if(status!=NO