当前位置: 首页 > news >正文

RW-Everything的RwDrv.sys驱动调用

RW-Everything的RwDrv.sys驱动调用

  • 一、RwDrv.sys
  • 二、示例代码
  • 三、总结


一、RwDrv.sys

RW-Everything是一个硬件底层的工具,可用于物理内存、BIOS、PCI和IO端口的查看和修改,其基于驱动RwDrv.sys来实现,利用这个驱动可以实现系统的侵入。


二、示例代码

  • 使用服务来加载RwDrv驱动
  • 打开Win Object对象,通过调用DeviceIoControl通信调用
#include <Windows.h>
#include <stdio.h>#define RW_DRIVER_ID							"RwDrv"// type of access: U8 = 0; U16 = 1, U32 =2, ref to READ_REGISTER_BUFFER_UCHAR / USHORT / ULONG
typedef struct {DWORD64 physicalAddress;DWORD size;DWORD access;DWORD64 buffer;
} PhysRw_t;typedef struct {DWORD low;DWORD pad;DWORD reg;DWORD high;
} MSRRw_t;HANDLE hDrv;DWORD LoadDriver()
{TCHAR sDrv[MAX_PATH] = {0};GetFullPathName("RwDrv.sys", MAX_PATH, sDrv, NULL);//check driver existWIN32_FIND_DATA	findData;HANDLE hFile = FindFirstFile(sDrv, &findData);if(hFile == INVALID_HANDLE_VALUE){printf("Driver File Doesn't Exist, errno = %d.\n", GetLastError());return -1;}//establishes a connection to the service control managerSC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if(hSCM == NULL){printf("Open SCM Failed, errno = %d.\n", GetLastError());return -1;}//create a service object and add to SCMSC_HANDLE hSrv = CreateService(hSCM, RW_DRIVER_ID, RW_DRIVER_ID, SC_MANAGER_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, sDrv, NULL, NULL, NULL, NULL, NULL);if(hSrv == NULL){if(GetLastError() != ERROR_SERVICE_EXISTS){CloseHandle(hSCM);printf("Create Service Failed, errno = %d.\n", GetLastError());return -1;}}//open servicehSrv = OpenService(hSCM, RW_DRIVER_ID, SERVICE_ALL_ACCESS);if(hSrv == NULL){CloseHandle(hSCM);printf("Open Service Failed, errno = %d.\n", GetLastError());return -1;}//start serviceif(!StartService(hSrv, 0, NULL)){if(GetLastError() != ERROR_SERVICE_ALREADY_RUNNING){CloseHandle(hSCM);CloseServiceHandle(hSrv);printf("Start Service Failed, errno = %d.\n", GetLastError());return -1;}}//create or open device object, see "Win32 Device Namespaces" section //of https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file//and https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfileahDrv = CreateFile("\\\\.\\"RW_DRIVER_ID, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if(hDrv == INVALID_HANDLE_VALUE){CloseHandle(hSCM);CloseServiceHandle(hSrv);printf("Create File Failed, errno = %d.\n", GetLastError());return -1;}return 0;
}DWORD UnloadDriver()
{SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if(hSCM == NULL){printf("Open SCM Failed, errno = %d.\n", GetLastError());return -1;}SC_HANDLE hSrv = OpenService(hSCM, RW_DRIVER_ID, SERVICE_ALL_ACCESS);if(hSrv == NULL){CloseHandle(hSCM);printf("Open Service Failed, errno = %d.\n", GetLastError());return -1;}SERVICE_STATUS status;if (!ControlService(hSrv, SERVICE_CONTROL_STOP, &status)) {CloseHandle(hSCM);CloseHandle(hDrv);printf("Stop Service Failed, errno = %d.\n", GetLastError());return -1;}CloseHandle(hSCM);CloseHandle(hDrv);return 0;
}BOOL isElevated() {HANDLE hToken = NULL;if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {TOKEN_ELEVATION Elevation;DWORD cbSize = sizeof(TOKEN_ELEVATION);if (GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &cbSize)) {return Elevation.TokenIsElevated;}}if (hToken) {CloseHandle(hToken);}return FALSE;
}void readMem(DWORD64 address, const DWORD64* buffer, DWORD size, DWORD access = 0) 
{PhysRw_t tPhyMem;tPhyMem.physicalAddress = address;tPhyMem.size = size;tPhyMem.access = access;tPhyMem.buffer = (DWORD64)buffer;DeviceIoControl(hDrv, 0x222808, &tPhyMem, sizeof(tPhyMem), &tPhyMem, sizeof(tPhyMem), NULL, NULL);
}
void writeMem(DWORD64 address, const DWORD64* buffer, DWORD size, DWORD access = 0) 
{PhysRw_t tPhyMem;tPhyMem.physicalAddress = address;tPhyMem.size = size;tPhyMem.access = access;tPhyMem.buffer = (DWORD64)buffer;DeviceIoControl(hDrv, 0x22280C, &tPhyMem, sizeof(tPhyMem), NULL, 0, NULL, NULL);
}void readMSR(int reg, LARGE_INTEGER& value) 
{MSRRw_t tMSR;tMSR.low = 0;tMSR.pad = 0;tMSR.reg = reg;	tMSR.high = 0;DeviceIoControl(hDrv, 0x222848, &tMSR, sizeof(tMSR), &tMSR, sizeof(tMSR), NULL, NULL);value.LowPart = tMSR.low;value.HighPart = tMSR.high;
}
void writeMSR(int reg, LARGE_INTEGER& value) {MSRRw_t tMSR;ZeroMemory(&tMSR, sizeof(tMSR));tMSR.reg = reg;tMSR.low = value.LowPart;tMSR.high= value.HighPart;DeviceIoControl(hDrv, 0x22284C, &tMSR, sizeof(tMSR), &tMSR, sizeof(tMSR), NULL, NULL);
}int main()
{//Check UACif(isElevated() == FALSE){printf("This program requires run as administrator.\n");return 0;}LoadDriver();//Read MemDWORD64 buf[1] = {0};readMem(0x0000CCCC, buf, 1);/*DWORD64 buf[16] = {0};readMem(0x0000CCCC, buf, 2, 1);*/printf("read mem = %x\n", buf[0]);//Read MsrLARGE_INTEGER value;readMSR(0x20, value);printf("read msr high part = %08x, low part = %08x\n", value.HighPart, value.LowPart);UnloadDriver();return 0;
}

三、总结

合法的签名驱动可以调用内核的很多方法来实现系统或硬件的控制,但对于一些情况我们无法申请签名,可以借用第三方驱动来实现,其次,这种方式是一种高风险的漏洞。

http://www.lryc.cn/news/111267.html

相关文章:

  • 0101docker mysql8镜像主从复制-运维-mysql
  • uC-OS2 V2.93 STM32L476 移植:系统启动篇
  • redis 集群 1:李代桃僵 —— Sentinel
  • 重置 Macbook 中MySQL 的 root 用户密码
  • 2308C++搞笑的概念化
  • 修改node_modules里的源码
  • 【每日一题Day287】LC24 两两交换链表中的节点 | 模拟 递归
  • Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】
  • Java后台生成微信小程序码并以流的形式返回给前端
  • AtcoderABC226场
  • Linux知识点 -- VS Code远程连接服务器协助开发
  • blender基础认识(选项开关、工具栏、视图等)
  • React Hooks 中的属性详解
  • 工作遇到问题与解决办法(一)
  • 综合与新综合与新型交通发展趋势[75页PPT]
  • 【树形DP+换根思想】2022牛客多校加赛 H
  • Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)
  • Spring Boot3.0(一):入门篇
  • 各种排序333
  • [C++] 类与对象(中)完整讲述运算符重载示例 -- 日期类(Date) -- const成员
  • wonderful-sql 作业
  • Go学习第六天
  • opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()
  • Java 克隆技术详解,深拷贝与浅拷贝的区别及实现
  • 包装器function
  • Django Rest_Framework(三)
  • 总结 IO、存储、硬盘、文件系统相关常识
  • JavaScript、深入浅出Node.js前端技能汇总
  • use gnustep objective-c
  • 8.15锁的优化