当前位置: 首页 > 科技观察

网络安全编程:服务控制管理器示例

时间:2023-03-20 00:28:22 科技观察

几乎每个操作系统都有一种机制,可以在系统启动时启动不依赖于用户交互的进程。在Windows下,类似的机制称为服务或Windows服务。服务是一种在后台运行的程序。服务程序通常可以在本地和通过网络向用户提供一些功能。该服务是在操作系统启动时启动的程序。服务程序可能是一个自带进程的EXE程序,也可能是某个进程附加的DLL文件(如svchost.exe),更有可能是系统内核中的SYS文件。由于服务的核心地位和启动方式,它也是杀毒软件和恶意软件的“战场”。这对于研究系统安全性非常重要。01如何查看系统服务在Windows下,很多服务是和操作系统一起启动的。哪些服务是随操作系统一起启动的?如何检查?其实很简单。在“我的电脑”上单击鼠标右键,然后在弹出的菜单中选择“管理”,打开“计算机管理”工具,单击左侧树状列表中的“服务和应用程序”,打开子列表,选择“服务”,右侧出现服务项目列表。更简单的方法是直接在“运行”窗口中输入“services.msc”,打开服务管理器。服务管理器主要用于显示系统中已有的应用服务,显示服务的描述信息,控制服务的启动状态和启动方式。服务管理器如图1所示。图1Windows下的服务管理程序在图1所示的服务列表中,只能看到Win32应用程序的服务,看不到关于驱动程序的服务。您可以使用其他一些工具来查看驱动程序级别的服务。图2使用SREng查看与驱动程序相关的服务列表。图2使用SREng查看司机服务列表接下来我们写一个类似的程序,可以查看应用服务列表和司机服务列表。编写后的程序界面如图3所示。图3服务管理程序界面编写好的服务管理程序既可以查看“Win32服务应用程序”也可以查看“驱动服务程序”,并可以简单地控制它们的运行状态。这里开发的服务控件管理器使用的是MFC对话框,其中使用了CListCtrl控件。立即开始构建您自己的服务控制管理器。02服务控制管理器的实现服务控制管理器的开发过程与注册中心启动管理器类似,主要是枚举服务并在列表控件中展示。服务状态的控制是通过服务相关的API函数来完成的。先写代码吧,希望大家能掌握服务相关的API函数。在后面的代码中,将对开发服务管理器所涉及的API进行相应的说明。学习API函数的使用,MSDN是最好的老师,详细、透彻、权威。在编程的道路上,要想通过阅读别人的代码不断提高自己的编程能力,就需要自己去掌握不熟悉的API函数。到时候一定要记得查阅MSDN。1.服务类型您已经熟悉服务控制管理器的界面,界面的布局可以按照自己的方式进行调整。枚举服务时,分别枚举“Win32应用程序服务”和“驱动程序服务”,有助于理解各种服务。枚举这两种服务的主要区别在于传递给EnumServicesStatus()函数的第二个参数。如果枚举“Win32应用服务”,则传递的参数为SERVICE_WIN32;如果枚举“driverservice”,则传递的参数为SERVICE_DRIVER。这两个参数实际上是系统定义的宏,该宏定义在WinNt.h头文件中,具体定义如下:#defineSERVICE\DRIVER(SERVICED_RIVERTEM_KERNELS)SERVICE_RECOGNIZER_DRIVER)#defineSERVICE_WIN32(SERVICE_WIN32_OWN_PROCESS|\SERVICE_WIN32_SHARE_PROCESS)SERVICE_DRIVER和SERVICE_WIN32是其他宏的组合,这些宏有具体的值。下面解释其他宏的含义。TheSERVICE_DRIVERmacroiscomposedof3macros,asfollows:#defineSERVICE_KERNEL_DRIVER0x00000001//devicedriver#defineSERVICE_FILE_SYSTEM_DRIVER0x00000002//kernelmodefilesystemdriver#defineSERVICE_RECOGNIZER_DRIVER0x00000VIVER2macrosarecomposedoftwomacros:#S3IN3defineSERVICE_WIN32_OWN_PROCESS0x00000010//Aservicethatmonopolizesaprocess#defineSERVICE_WIN32_SHARE_PROCESS0x00000020//与其他服务共享一个进程的服务如果要枚举所有类型的服务,那么使用SERVICE_TYPE_ALL宏,定义如下:#defineSERVICE_TYPE_IN_AP_ALLW(S|\SERVICE_DRIVER|\SERVICE_INTERACTIVE_PROCESS)2.服务枚举函数用于服务枚举的API函数为EnumServicesStatus(),该函数中需要指定的枚举类型分别为SERVICE_DRIVER和SERVICE_WIN32。具体看服务枚举的函数,代码如下:VOIDCManageServicesDlg::ShowServiceList(DWORDdwServiceType){m_ServiceList.DeleteAllItems();//打开服务管理器=hSCM){AfxMessageBox("OpenSCMangerError!");return;}DWORDServiceCount=0;DWORDdwSize=0;LPENUM_SERVICE_STATUSlpInfo;//第一次调用BOOLbRet=EnumServicesStatus(hSCM,dwServiceType,SERVICE_STATE_ALL,NULL,0,&dwSize,&ServiceCount,NULL);//因为给定的接收服务列表没有缓冲区,所以这里调用肯定失败//失败的原因是ERROR_MORE_DATA//说明需要更大的缓冲区来保存数据if(!bRet&&GetLastError()==ERROR_MORE_DATA){//AllocationBuffer,保存服务列表lpInfo=(LPENUM_SERVICE_STATUS)(newBYTE[dwSize]);bRet=EnumServicesStatus(hSCM,dwServiceType,SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)lpInfo,dwSize,&dwSize,&ServiceCount,NULL);if(!bRet){CloseServiceHandle(hSCM);返回;}//一条条获取数据添加到列表控件for(DWORDi=0;i