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;
}
三、总结
合法的签名驱动可以调用内核的很多方法来实现系统或硬件的控制,但对于一些情况我们无法申请签名,可以借用第三方驱动来实现,其次,这种方式是一种高风险的漏洞。
相关文章:
RW-Everything的RwDrv.sys驱动调用
RW-Everything的RwDrv.sys驱动调用 一、RwDrv.sys二、示例代码三、总结 一、RwDrv.sys RW-Everything是一个硬件底层的工具,可用于物理内存、BIOS、PCI和IO端口的查看和修改,其基于驱动RwDrv.sys来实现,利用这个驱动可以实现系统的侵入。 二…...
0101docker mysql8镜像主从复制-运维-mysql
1 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 Mysql支持一台主库同时向多台从库进行复制,从库同时可以…...
uC-OS2 V2.93 STM32L476 移植:系统启动篇
前言 前两篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程,下载了 uC-OS2 V2.93 的源码,并把 uC-OS2 的源文件加入 Keil MDK5 工程 本篇适配 uC-OS2 的 系统定时器(Systick)与 PendSV_Handler…...
redis 集群 1:李代桃僵 —— Sentinel
目前我们讲的 Redis 还只是主从方案,最终一致性。读者们可思考过,如果主节点凌晨 3 点突发宕机怎么办?就坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线么?毫无疑问…...
重置 Macbook 中MySQL 的 root 用户密码
Mac上好久前安装测试用的MySQL的Root密码忘记,猜了些常用密码都不对,只能重置密码。 重置密码 1、关闭MySQL服务,可以直接在系统偏好里关闭 sudo /usr/local/mysql/support-files/mysql.server stop 2、进入安装目录,启动安全…...
2308C++搞笑的概念化
前一篇的概念化,太搞笑 元<类 T>概念 可画要求(T&t,整 i){t.画(i);}; 构 方形{空 画(整 i){打印(2*i);} };元<可画 T>空 f(T&t,整 i){t.画(i);t.画(i); }空 主(){方形 e;f(e,33); }用得着那么复杂吗?...
修改node_modules里的源码
最近在工作中使用到一款生成二维码的依赖(以vue项目为例讲解):vue-qr,安装的4.0.9版本的,在启动工程的时候报错: You may need an appropriate loader to handle this file type后我查阅各种资料发现 1&a…...
【每日一题Day287】LC24 两两交换链表中的节点 | 模拟 递归
两两交换链表中的节点【LC24】 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 周赛暂停一周啦 思路:模拟 记录前驱…...
Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】
前言 相关系列 《Java ~ Collection【目录】》(持续更新)《Java ~ Executor【目录】》(持续更新)《Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】》(学习过程/多有漏误/仅作参考/不再更新)…...
Java后台生成微信小程序码并以流的形式返回给前端
后端代码 获取access_token import net.sf.json.JSONObject;public class WeChatUtil {/*** 获取token*/private static String ACCESSTOKENURL "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{appId}&secret{appSecret}"…...
AtcoderABC226场
A - Round decimalsA - Round decimals 题目大意 给定一个实数X,它最多可以使用三位小数表示,而且X的小数点后有三位小数。将X四舍五入到最接近的整数并打印结果。 思路分析 可以使用round函数进行四舍五入 知识点 round(x) 是一个用来对数字进行四…...
Linux知识点 -- VS Code远程连接服务器协助开发
Linux知识点 – VS Code远程连接服务器协助开发 文章目录 Linux知识点 -- VS Code远程连接服务器协助开发一、VS Code的使用1.使用VS Code进行C语言编译与运行2.使用VS Code进行C代码的编译与运行 二、使用VS Code连接云服务器三、使用VS Code进行GDB调试 一、VS Code的使用 1…...
blender基础认识(选项开关、工具栏、视图等)
文章目录 引言一、大纲选项开关和保存启动文件1. 大纲选项1. 禁用选中2. 视图影藏3. 视图禁用4. 渲染禁用 2. 保存启动文件 二、工具栏和侧边栏1. 左侧工具栏2. 右侧工具栏 三、视图1. 视角2. 缩放3. 拖拽4. 摄像机视角5. 切换正交视图6. 局部视图7. 显示隐藏 四、添加删除物体…...
React Hooks 中的属性详解
React Hooks 是 React 16.8 版本中新增的特性,允许我们在不编写 class 的情况下使用 state 和其他的 React 特性。Hooks 是一种可以让你在函数组件中“钩入” React 特性的函数。以下是一些常用的 React Hooks,并附有详细的用法和代码示例。 1. useStat…...
工作遇到问题与解决办法(一)
一、构建父子工程 父 <groupId>com.ruoyi</groupId> <artifactId>ruoyi</artifactId> <version>3.8.5</version> <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>…...
综合与新综合与新型交通发展趋势[75页PPT]
导读:原文《综合与新综合与新型交通发展趋势[75页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需…...
【树形DP+换根思想】2022牛客多校加赛 H
登录—专业IT笔试面试备考平台_牛客网 题意: 思路: 这个虽然是树形DP,却用了换根的思想.... 首先,后缀0的个数可以转化成min(cnt2,cnt5),其中cnt2为2的因子个数,cnt5为5的因子个数 然后进行DP 设dp[u]…...
Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)
一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写? 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…...
Spring Boot3.0(一):入门篇
什么是 Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 用我的话来理解,就是 Spring…...
各种排序333
冒泡排序 n方 public static void BubbleSort(int[] arr) {int n = arr.Length;for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - i - 1; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}} }选择排序 n方 publ…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
