
Това е скелет на Уиндоус сервиз, мисля че ще бъде полезен на много хора :) Интересното е че съм го направил първият път като се пусне да работи като нормално .еxe и отам нататък вече ще се стартира в уиндоус като сервиз ( тествано само на Windows Xp )
#include windows.h
#include stdio.h
int ServReg();
int ServCheck();
/* Beginning of the main function */
void Execute() {
//YOUR CODE GOES HERE
}
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
int main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "winboz";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// Start the control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
goto SkipService; /* first time executetion */
return 0;
SkipService:
int x = ServCheck(); /* is this first time execution ? */
if(x == 1) { ServReg(); }
Execute(); /* it will be executed from here only the first time */
}
void ServiceMain(int argc, char** argv)
{
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hStatus = RegisterServiceCtrlHandler(
"winboz",
(LPHANDLER_FUNCTION)ControlHandler);
// We report the running status to SCM.
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);
// The worker loop of a service
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
Execute(); /* here we execute the malware like service, not first time */
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
}
return;
}
// Control handler function
void ControlHandler(DWORD request)
{
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
}
int ServCheck() { /* returns 1 if its first time execution */
int x = 0;
int Num = 0;
char Buffer[7],Buffer2[7]="qwerty";
HANDLE OpenHandle;
memset(Buffer,0,7);
OpenHandle = CreateFile("root_check.rot",GENERIC_READ | GENERIC_WRITE,0,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(OpenHandle,(LPVOID)Buffer,6,(DWORD*)&Num,NULL);
if(strcmp(Buffer,Buffer2)!=0) {
x = 1; /* first time execution */
Num = 0;
WriteFile(OpenHandle,Buffer2,6,(DWORD*)&Num,NULL);
}
CloseHandle(OpenHandle);
return x;
}
int ServReg() {
int success = 0;
int failure = 1;
char FilePath[MAX_PATH];
GetModuleFileName(0,FilePath,MAX_PATH);
SC_HANDLE SMH = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
/*GetModuleFileName(NULL,FilePath,MAX_PATH); */
SC_HANDLE RegHandle = CreateService(SMH,"winboz","winboz",
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,FilePath,
NULL,NULL,NULL,NULL,NULL);
CloseServiceHandle(SMH);
CloseServiceHandle(RegHandle);
return success;
}
Няма коментари:
Публикуване на коментар