Windows守護程式簡單示例

大囚長發表於2018-12-28

轉載:
https://blog.csdn.net/kikaylee/article/details/51395360

/*
@描述:一個簡單的Windows守護程式的例子(C++版本)
@作者:kikaylee
@日期:2016-05-13 10:30
*/

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <io.h> 
#include <iostream>

using namespace std;

//隱藏DOS黑視窗
#pragma comment(linker,"/subsystem:\"windows\"  /entry:\"mainCRTStartup\"" ) 

//定義路徑最大程度
#define MAX_PATH 4096
//定義守護程式名稱
#define PROCCESS_NAME "test.exe"
//定義寫入的登錄檔路徑
#define SELFSTART_REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"

//設定本身開機自啟動
BOOL SetSelfStart()
{
    //獲取程式完整名稱
    char pName[MAX_PATH]={0};
    GetModuleFileNameA(NULL,pName,MAX_PATH);

    //在登錄檔中寫入啟動資訊
    HKEY hKey=NULL;
    LONG lRet=NULL;
    lRet=RegOpenKeyExA(HKEY_LOCAL_MACHINE,SELFSTART_REGEDIT_PATH,0,KEY_ALL_ACCESS,&hKey);

    //判斷是否成功
    if(lRet!=ERROR_SUCCESS)
    {
        return FALSE;
    }

    lRet=RegSetValueExA(hKey,"testProtect",0,REG_SZ,(const unsigned char*)pName,strlen(pName)+sizeof(char));

    //判斷是否成功
    if(lRet!=ERROR_SUCCESS)
    {
        return FALSE;
    }

    //關閉登錄檔
    RegCloseKey(hKey);
    return TRUE;
}

int main()
{
    //設定程式開機自啟動
    if(!SetSelfStart())
    {
        cout<<"守護程式開機自啟動失敗"<<endl;
        return -1;
    }

    STARTUPINFOA si;
    //程式物件
    PROCESS_INFORMATION pi;
    //初始化
    ZeroMemory(&si,sizeof(si));
    si.cb=sizeof(si);
    ZeroMemory(&pi,sizeof(pi));

    //獲取當前程式的路徑
    char pPath[MAX_PATH]={0};
    GetCurrentDirectoryA(MAX_PATH,pPath);

    //拼接需要守護的程式
    strcat(pPath,"\\");
    strcat(pPath,PROCCESS_NAME);

    //構造cmd執行守護程式的字串
    char pCmd[MAX_PATH]={0};
    strcat(pCmd,"cmd /c ");
    strcat(pCmd,pPath);

    //無限迴圈,監視守護程式
    do{
        //檢查守護程式是否存在
        if(_access(pPath,0)!=-1)
        {
            //建立子程式,判斷是否執行成功
            if(!CreateProcessA(NULL,pCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
            {
                cout<<"守護程式啟動失敗,程式即將退出"<<endl;
                return -1;
            }

            //啟動成功,獲取程式的ID
            cout<<"守護程式成功,ID:"<<pi.dwProcessId<<endl;
            //無限等待子程式退出
            WaitForSingleObject(pi.hProcess,INFINITE);
            //如果退出了
            cout<<"守護程式退出了。。。"<<endl;
            //關閉程式和控制程式碼
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
        else
        {
            cout<<"守護程式不存在"<<endl;
        }
        //睡一下,重啟
        Sleep(2000);
    }
    while(true);
    return 0;
}

相關文章