《反勒索软件开发笔记》(一)vs常见问题与使用技巧,服务程序标准框架

本文分享了在调试过程中遇到的代码不匹配问题解决方法,包括调整Visual Studio设置、清理和重新生成解决方案、删除.ncb文件。同时,深入介绍了Windows服务程序的标准框架,包括服务的入口点、主函数和服务控制函数的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下断点时候当前代码下断代码不匹配

在工具->选项->调试->常规去掉要求源文件与原始版本完全匹配

在重新编译时候重新生成表一些错,比如无法贷款数据库等

先清理解决方案,在重新生成,如果还不行,就关闭项目,删除项目的.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跟服务通信接口-》跟通信驱动接口-》清除模块

个人开发从底层向上

先设计接口,从核心到周边,

源码分析

从通信中枢往外围看

关键通信加密。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值