《反勒索軟件開發筆記》(一)vs常見問題與使用技巧,服務程序標準框架

下斷點時候當前代碼下斷代碼不匹配

在工具->選項->調試->常規去掉要求源文件與原始版本完全匹配

在重新編譯時候重新生成表一些錯,比如無法貸款數據庫等

先清理解決方案,在重新生成,如果還不行,就關閉項目,刪除項目的.ncb文件,然後重新生成。

雜項

注意相對路徑,另外做產品一般使用Unicode,不要用多字節,代碼生成一步用MT或MTd。

優化

產品級的項目儘量避免內嵌彙編。如果一定要記得禁用優化。

IDE的生成窗口被關掉

不小心關了選擇編譯平臺時候可以點擊

 

如圖選被關掉了,最後選重排命令確定

服務程序標準框架

一個標準服務需要有如下:

入口點有代碼

	SERVICE_TABLE_ENTRY dispatchTable[]=
	{
		{ST,(LPSERVICE_MAIN_FUNCTION)Service_Main},{ NULL,NULL}//服務名,入口程序
	};
	if(!StartServiceCtrlDispatcher(dispatchTable))//服務處理分發例程

服務主函數

void WINAPI Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)
{
	Sleep(20000);
//下面全局變量代碼規範一般加前綴g_,主狀態
	ssStatus.dwServiceType        = SERVICE_WIN32;			//指明可執行文件類型
	ssStatus.dwCurrentState       = SERVICE_START_PENDING;  //指明服務當前狀態
	ssStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;	//指明服務接受何種控制   
	ssStatus.dwWin32ExitCode      = 0;   
	ssStatus.dwServiceSpecificExitCode = 0;   
	ssStatus.dwCheckPoint         = 0;   
	ssStatus.dwWaitHint           = 0;    

	//註冊服務控制處理函數
	sshStatusHandle=RegisterServiceCtrlHandler(ST, Service_Ctrl);
	//如果註冊失敗
	if(!sshStatusHandle)
	{
		goto cleanup;
		return;
	}

	//更新服務狀態
	if(!ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, TIMEOUT))
		goto cleanup; //更新服務狀態失敗則轉向 cleanup
	ServiceStart(dwArgc,lpszArgv);
	return;
cleanup:
	//把服務狀態更新爲 SERVICE_STOPPED,並退出。
	if(sshStatusHandle)
		ReportStatusToSCMgr(SERVICE_STOPPED, GetLastError(), 0);
}

 

還要有服務控制函數

//控制處理程序函數
void WINAPI Service_Ctrl(DWORD dwCtrlCode)
{
	//處理控制請求碼
	switch(dwCtrlCode)
	{
	case SERVICE_CONTROL_STOP:			//先更新服務狀態爲 SERVICDE_STOP_PENDING,再停止服務。
		ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 500);
		ServiceStop(); 
		return;
	case SERVICE_CONTROL_PAUSE:			//暫停服務
		ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);
		ServicePause(); 
		ssStatus.dwCurrentState=SERVICE_PAUSED;
		return;
	case SERVICE_CONTROL_CONTINUE:		//繼續服務
		ReportStatusToSCMgr(SERVICE_CONTINUE_PENDING, NO_ERROR, 500);
		ServiceContinue();
		ssStatus.dwCurrentState=SERVICE_RUNNING;
		return;
	case SERVICE_CONTROL_INTERROGATE:	//更新服務狀態
		break;
	default:	//無效控制碼
		break;
	}
	ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
}

注意點:改變服務狀態ReportStatusToSCMgr

編寫流程

接口設計從頂向下

gui-》gui跟服務通信接口-》跟通信驅動接口-》清除模塊

個人開發從底層向上

先設計接口,從核心到周邊,

源碼分析

從通信中樞往外圍看

關鍵通信加密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章