8.程序手动实现加载、运行、停止、卸载驱动

本文详细介绍了如何在Windows系统中手动加载、运行、停止和卸载驱动程序,包括使用GetFullPathNameA获取驱动路径、OpenSCManager管理服务、CreateServiceA创建服务及ControlService停止驱动。同时展示了Ring3级别的代码实现,如通过PID查找并调用PspTerminateProcess函数来结束进程。
摘要由CSDN通过智能技术生成

0x8.程序实现(ring3)加载、运行、停止、卸载驱动

一、手动加载驱动步骤

  1. 用GetFullPathNameA获取驱动的完整路径
  2. 用OpenSCManager打开服务控制管理器
  3. 用CreateServiceA创建服务
  4. 如果服务创建已存在,直接用OpenServiceA打开服务,否则用StartServiceA开启服务

二、卸载

  1. 用OpenSCManager打开服务控制管理器
  2. 用OpenServiceA打开服务
  3. 用ControlService停止驱动服务

三、代码实现

主要功能:用户输入PID,ring0特征码搜索PspTerminateProcess函数,获取到函数地址,用函数指针调用PspTerminateProcess,结束进程

Ring3

#include <stdafx.h>
#include <Windows.h>
#include <winioctl.h>

// 编写一个简单的驱动,在驱动入口和卸载函数打印一些提示信息
#define DRIVER_NAME L"Mikasys"					//跟你驱动文件名一样
#define DRIVER_PATH L"Mikasys.sys"				//驱动路径
#define DRIVER_LINK L"\\\\.\\Mikasys"			//SYMBOL_LINK符号连接 跟驱动一样

//返回ring0的操作码
#define OPERADD CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define OPERKillProc CTL_CODE(FILE_DEVICE_UNKNOWN,0x900,METHOD_BUFFERED,FILE_ANY_ACCESS) 

BOOL LoadDriver(PCWSTR lpszDriverName, PCWSTR lpszDriverPath)
{
   
	//1.获取驱动文件全路径名
	WCHAR szDriverFullPath[MAX_PATH] = {
    0 };		//MAX_PATH 0x260
	GetFullPathNameW(lpszDriverPath,MAX_PATH,szDriverFullPath,NULL);

	//printf("%s\n", szDriverFullPath);
	//2.打开服务控制管理器
	SC_HANDLE hServiceMgr = OpenSCManagerW(NULL,NULL,SC_MANAGER_ALL_ACCESS); // SCM管理器句柄	
	if (!hServiceMgr)
	{
   
		printf("OpenSCManagerW 失败, %d\n", GetLastError());
		return FALSE;
	}
	printf("打开服务控制管理器成功.\n");


	//3.创建驱动服务
	SC_HANDLE hServiceDDK = NULL; // NT驱动程序服务句柄
	//创建驱动服务
	hServiceDDK = CreateServiceW(
		hServiceMgr,
		lpszDriverName,//驱动程序注册表中的名字
		lpszDriverName,//注册表中驱动程序的 DisPlayName 的值
		SERVICE_ALL_ACCESS,//加载驱动的访问权限 SERVICE_START 或 SERVICE_ALL_ACCESS
		SERVICE_KERNEL_DRIVER,//表示加载服务是驱动程序
		SERVICE_DEMAND_START,//注册表驱动程序的 Start 值
		SERVICE_ERROR_IGNORE,//注册表程序的 ErrorControl 值
		szDriverFullPath,
		NULL, NULL, NULL, NULL, NULL
		);

	if (!hServiceDDK)
	{
   
		DWORD dwErr = GetLastError();
		if (dwErr != ERROR_IO_PENDING && dwErr != ERROR_SERVICE_EXISTS)
		{
   
			printf("创建驱动服务失败, %d\n", dwErr);
			return FALSE;
		}
	}
	printf("创建驱动服务成功.\n");
	// 驱动服务已经创建,打开服务
	hServiceDDK = OpenServiceW(hServiceMgr,lpszDriverName,SERVICE_ALL_ACCESS);
	if (!StartService(hServiceDDK, NULL, NULL))
	{
   
		DWORD dwErr = GetLastError();
		if (dwErr != ERROR_SERVICE_ALREADY_RUNNING)
		{
   
			printf("运行驱动服务失败, %d\n", dwErr);
			return FALSE;
		}
	}
	printf("运行驱动服务成功.\n");
	if (hServiceDDK)
	{
   
		CloseServiceHandle(hServiceDDK);
	}
	if (hServiceMgr)
	{
   
		CloseServiceHandle(hServiceMgr);
	}
	return TRUE;
}

void RunMathDriver()
{
   
	HANDLE hDevice = CreateFileW(DRIVER_LINK, GENERIC_READ|GENERIC_WRITE,0,0,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值