0x8.程序实现(ring3)加载、运行、停止、卸载驱动
一、手动加载驱动步骤
- 用GetFullPathNameA获取驱动的完整路径
- 用OpenSCManager打开服务控制管理器
- 用CreateServiceA创建服务
- 如果服务创建已存在,直接用OpenServiceA打开服务,否则用StartServiceA开启服务
二、卸载
- 用OpenSCManager打开服务控制管理器
- 用OpenServiceA打开服务
- 用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,