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.mzph.cn/news/24146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows测试模式打开/关闭 C++ Windows驱动开发

Windows测试模式打开 管理员身份运行CMD 2.输入&#xff1a;bcdedit /set testsigning on 重启计算机 右下角显示&#xff1a; 测试模式成功开启 Windows测试模式关闭 同理&#xff0c;第二步修改为&#xff1a; 重启后右下角&#xff1a; 没有测试模式显示&#xff0c;关闭…

图像处理学习笔记

图像处理的流程&#xff1a;获取图像-分割区域-特征提取。 嵌入式工业读码器 &#xff1a;包括DM码、QR码、vericode码 Blob分析与形态学 1.Blob区域是Blobs这一数据类型在halcon中的一种贴切的表达形式。 采集图像-区域分割&#xff0c;最后通过特征&#xff08;如圆度、面积、…

类与对象【中】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;类的默认6个成员函数&#x1f449;&#x1f3fb;构造…

代码编辑器实践之vue-codemirror使用

前言 程序员用到IDE次数比较频繁&#xff0c;比如vscode、idea等&#xff0c;这些都是市场上比较流行的代码编辑器&#xff0c;拥有非常全面的功能。但是有时候在项目开发上也会用到代码编辑器&#xff0c;比如复杂的Array<Object>输入&#xff0c;或者需要用到用户交互…

1、Thonny+MicroPython+ESP32开发环境搭建

1. 整体流程说明 1.1 ESP32 大白话来说:ESP32就是一个开发板,上面有芯片以及用到的其它硬件 1.2 ESP32运行程序? 只要是硬件电路(数字电路)那么就可以通过编程的方式对其进行控制 那么这个开发板能认识什么样的程序呢?python?C?C++?Java?。。。。 答:只认识二…

【linux--->数据链路层协议】

文章目录 [TOC](文章目录) 一、数据链路层协议概念二、以太网帧格式1.字段分析 三、局域网通信原理四、ARP协议1.结构2.作用3.ARP通信过程4.ARP协议相关命令 五、局域网内中间人原理六、DNS系统(域名系统)1.域名概念2.DNS系统组成3.DNS协议3.浏览器输入域名后的通信过程4.dig工…

Linux 创建子进程

文章目录 前言一、进程&#xff0c;线程&#xff0c;程序 区分二、创建子进程三、创建多个进程1. 获取进程号2. 循环创建多个进程 四、进程工具。1. ps 查看当前进程.2. kill 进程终止. 总结 前言 在计算机科学中&#xff0c;进程&#xff08;Process&#xff09;、线程&#…

ChatGPT已打破图灵测试,新的测试方法在路上

生信麻瓜的 ChatGPT 4.0 初体验 偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码 代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&#xff01; 如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f; 全球最佳的人工智能系统可以通过…

删除这4个文件夹,流畅使用手机无忧

在现代社会中&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;我们可能会遇到手机卡顿和内存不足的问题&#xff0c;让我们感到十分困扰。手机卡顿不仅影响使用体验&#xff0c;还可能导致应用程序运行缓慢&#xff0c;甚…

flex 布局使用 space-between 时将最后一行左对齐

1.使用占位元素 特点&#xff1a;适用于任意列数布局&#xff0c;比较简单&#xff0c;缺点是会产生空标签 方法&#xff1a;使用循环体循环一整行空元素。宽度为单个元素宽度&#xff0c;高度为0 <div class"flex-box"><div class"item-box" v…

HTML <ruby> 标签

实例 一个 ruby 注释&#xff1a; <ruby> 漢 <rt><rp>(</rp>ㄏㄢˋ<rp>)</rp></rt> </ruby>定义和用法 <ruby> 标签定义 ruby 注释&#xff08;中文注音或字符&#xff09;。 在东亚使用&#xff0c;显示的是东亚字…

AutoSAR系列讲解(实践篇)12.2-CanTP

目录 CanTP 一、主要作用 二、诊断传输流程 CanTP CanTP说起来其实重要也不重要,其本身是设计可以用于CAN的很多传输协议,但是目前基本上也就咱们做诊断的时候用用,不过虽然简单,我们也 讲讲 一、主要作用 CanTp是位于PduR和CanIf之间的一个模块,主要提供以下服务:…

论文阅读-Neighbor Contrastive Learning on Learnable Graph Augmentation(AAAI2023)

人为设计的图增强&#xff0c;可能会破坏原始图的拓扑结构&#xff0c;同时相邻节点被视为负节点&#xff0c;因此被推离锚点很远。然而&#xff0c;这与网络的同质性假设是矛盾的&#xff0c;即连接的节点通常属于同一类&#xff0c;并且应该彼此接近。本文提出了一种端到端的…

python绿色版运行程序,python 绿色版免安装

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python绿色版运行程序&#xff0c;python 绿色版免安装&#xff0c;今天让我们一起来看看吧&#xff01; 软件简介 Python3.7.0 是一种被广大从业者广泛使用的通用型设计语言。该软件提供了丰富全面的模块&#xff0c;并…

MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

文章目录 通过动态链表实现游戏角色动态增加CMemoryDC.hCFlashDlg.hCFlashDlg.cpp WM_ERASEBKGND背景刷新的原理RegisterClass注册窗口与框架程序开发CFrameRegister 通过动态链表实现游戏角色动态增加 CMemoryDC.h #pragma once#include "resource.h"/*内存DC类简介…

Grafana-部署

一、部署 1.1 Linux 方式 Centos 系统 yum install https://dl.grafana.com/enterprise/release/grafana-enterprise-10.0.3-1.x86_64.rpm二、配置 Grafana 具有默认和自定义配置文件。您可以通过修改自定义配置文件或使用环境变量来自定义 Grafana 实例。要查看 Grafana 实…

【设计模式|中】结构型模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 【设计模式|上】【创建型】 【设计模式 | 中】【结构型】 适配器模式代理模式装饰器模式桥接模式组合模式外观模式享元模式 【设计模式 | 下】【行为型…

6.s081/6.1810(Fall 2022)Lab3: page tables

文章目录 前言其他篇章参考链接0. 前置环境1. Speed up system calls (easy)1.1 简单分析1.2 映射1.3 页分配1.4 页释放1.5 测试 2. Print a page table (easy)2.1 简单分析2.2 实现2.3 测试 3. Detect which pages have been accessed (hard)3.1 简单分析3.2 实现3.2.1 获取参…

8.物联网操作系统之事件标志组

。事件标志组定义 FreeRTOS事件标志组介绍 FreeRTOS事件标志组工作原理 一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步&#xff0c;此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…

Webpack5 动态导入按需加载

文章目录 一、 什么是动态导入和按需加载&#xff1f;二、 具体用法示例二、 总结 一、 什么是动态导入和按需加载&#xff1f; 传统上&#xff0c;在Webpack中&#xff0c;我们使用import语句可以在代码中静态地导入模块。这意味着所有的模块都会在构建时被打包到bundle中。然…