3.2 Windows驱动开发:内核CR3切换读写内存

cr3是一种控制寄存器,它是cpu中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。页表是由页目录表和页表组成的,页目录表存储了页表的物理地址,而页表存储了实际的物理页框地址。因此,页目录表的物理地址是虚拟地址翻译的关键之一。

操作系统中,每个进程都有自己的地址空间,地址空间中包含了进程的代码、数据和堆栈等信息。为了实现进程间的隔离和保护,操作系统会为每个进程分配独立的地址空间。在这个过程中,操作系统会将每个进程的页目录表的物理地址存储在它自己的CR3寄存器中。当进程切换时,操作系统会修改CR3寄存器的值,从而让CPU使用新的页目录表来完成虚拟地址的翻译。

利用CR3寄存器可以实现强制读写特定进程的内存地址,这种操作需要一定的权限和技术知识。在实际应用中,这种操作主要用于调试和漏洞挖掘等方面。同时,由于CR3寄存器的读写属于有痕读写,因此许多驱动保护都会禁止或者修改CR3寄存器的值,以提高系统的安全性,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。

在读写进程的时候,我们需要先找到目标进程的

PEPROCESS

结构。PEPROCESS结构是

Windows

操作系统中描述进程的一个重要数据结构,它包含了进程的各种属性和状态信息,如进程ID、进程优先级、内存布局等等。对于想要读写目标进程的内存,我们需要获得目标进程的PEPROCESS结构,才能进一步访问和操作进程的内存。

每个进程都有一个唯一的进程

ID(PID)

,我们可以通过遍历系统中所有进程的方式来查找目标进程。对于每个进程,我们可以通过读取进程对象的名称来判断它是否是目标进程。如果找到了目标进程,我们就可以从其进程对象中获得指向

PEPROCESS

结构的指针。

具体的查找过程可以分为以下几个步骤:

遍历系统中所有进程,获取每个进程的句柄(handle)和进程对象(process object)。从进程对象中获取进程的名称,并与目标进程的名称进行比较。如果找到了目标进程,从进程对象中获取指向PEPROCESS结构的指针。

需要注意的是,查找进程的过程可能会受到安全策略和权限的限制,因此需要在合适的上下文中进行。在实际应用中,需要根据具体的场景和要求进行合理的安全措施和权限管理。

代码语言:javascript代码运行次数:0运行复制

#include #include #include NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);// 定义全局EProcess结构PEPROCESS Global_Peprocess = NULL;// 根据进程名获得EPROCESS结构NTSTATUS GetProcessObjectByName(char *name){    NTSTATUS Status = STATUS_UNSUCCESSFUL;    SIZE_T i;    __try    {        for (i = 100; iDriverUnload = UnDriver;    return STATUS_SUCCESS;}

以打开

Tutorial-i386.exe

为例,打开后即可返回他的

Proces

,当然也可以直接传入进程PID同样可以得到进程

Process

结构地址。

Trae国内版 Trae国内版

国内首款AI原生IDE,专为中国开发者打造

Trae国内版 815 查看详情 Trae国内版 代码语言:javascript代码运行次数:0运行复制

// 根据PID打开进程PEPROCESS Peprocess = NULL;DWORD PID = 6672;NTSTATUS nt = PsLookupProcessByProcessId((HANDLE)PID, &Peprocess);

通过CR3读取内存

Tutorial-i386.exe

里面的

0x0009EDC8

这段内存,读出长度是4字节,核心读取函数

CR3_ReadProcessMemory

其实现原理可概括为以下4步;

首先,函数的输入参数包括目标进程的

PEPROCESS

结构指针

Process

、要读取的内存地址

Address

、读取的字节数

Length

以及输出缓冲区的指针

Buffer

。函数的返回值为布尔类型,表示读取操作是否成功。 接着,函数使用了

CheckAddressVal

函数获取了目标进程页目录表的物理地址,并将其保存在变量

pDTB

中。如果获取页目录表的物理地址失败,函数直接返回FALSE,表示读取操作失败。 接下来,函数使用了汇编指令

_disable()

来禁用中断,然后调用

__readcr3()

函数获取当前系统的CR3寄存器的值,保存在变量

OldCr3

中。接着,函数使用

__writecr3()

函数将CR3寄存器的值设置为目标进程的页目录表的物理地址pDTB。这样就切换了当前系统的地址空间到目标进程的地址空间。 然后,函数使用了

MmIsAddressValid()

函数来判断要读取的内存地址是否可访问。如果可访问,函数就调用

RtlCopyMemory()

函数将目标进程内存中的数据复制到输出缓冲区中。函数最后打印了读入数据的信息,并返回TRUE表示读取操作成功。如果要读取的内存地址不可访问,函数就直接返回FALSE表示读取操作失败。

最后,函数使用了汇编指令

_enable()

来恢复中断,并使用

__writecr3()

函数将CR3寄存器的值设置为原来的值

OldCr3

,从而恢复了当前系统的地址空间。

需要注意的是,这段代码仅仅实现了对目标进程内存的读取操作,如果需要进行写操作,还需要在适当的情况下使用类似的方式切换地址空间,并使用相关的内存操作函数进行写操作。另外,这种方式的内存读取操作可能会受到驱动保护的限制,需要谨慎使用。

代码语言:javascript代码运行次数:0运行复制

#include #include #include #define DIRECTORY_TABLE_BASE 0x028#pragma  intrinsic(_disable)#pragma  intrinsic(_enable)NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);// 关闭写保护KIRQL Open(){    KIRQL irql = KeRaiseIrqlToDpcLevel();    UINT64 cr0 = __readcr0();    cr0 &= 0xfffffffffffeffff;    __writecr0(cr0);    _disable();    return irql;}// 开启写保护void Close(KIRQL irql){    UINT64 cr0 = __readcr0();    cr0 |= 0x10000;    _enable();    __writecr0(cr0);    KeLowerIrql(irql);}// 检查内存ULONG64 CheckAddressVal(PVOID p){    if (MmIsAddressValid(p) == FALSE)        return 0;    return *(PULONG64)p;}// CR3 寄存器读内存BOOLEAN CR3_ReadProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, OUT PVOID Buffer){    ULONG64 pDTB = 0, OldCr3 = 0, vAddr = 0;    pDTB = CheckAddressVal((UCHAR*)Process + DIRECTORY_TABLE_BASE);    if (pDTB == 0)    {        return FALSE;    }    _disable();    OldCr3 = __readcr3();    __writecr3(pDTB);    _enable();    if (MmIsAddressValid(Address))    {        RtlCopyMemory(Buffer, Address, Length);        DbgPrint("读入数据: %ld", *(PDWORD)Buffer);        return TRUE;    }    _disable();    __writecr3(OldCr3);    _enable();    return FALSE;}VOID UnDriver(PDRIVER_OBJECT driver){    DbgPrint(("Uninstall Driver Is OK n"));}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){    DbgPrint("hello lyshark n");    // 根据PID打开进程    PEPROCESS Peprocess = NULL;    DWORD PID = 6672;    NTSTATUS nt = PsLookupProcessByProcessId((HANDLE)PID, &Peprocess);    DWORD buffer = 0;    BOOLEAN bl = CR3_ReadProcessMemory(Peprocess, (PVOID)0x0009EDC8, 4, &buffer);    DbgPrint("readbuf = %x n", buffer);    DbgPrint("readbuf = %d n", buffer);    Driver->DriverUnload = UnDriver;    return STATUS_SUCCESS;}

读出后输出效果如下:

3.2 Windows驱动开发:内核CR3切换读写内存

如下所示是一个在Windows操作系统下写入目标进程内存的函数,函数

CR3_WriteProcessMemory()

使用了

CR3

寄存器的切换来实现对特定进程内存地址的强制写操作。

代码语言:javascript代码运行次数:0运行复制

#include #include #include #define DIRECTORY_TABLE_BASE 0x028#pragma  intrinsic(_disable)#pragma  intrinsic(_enable)NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);// 关闭写保护KIRQL Open(){    KIRQL irql = KeRaiseIrqlToDpcLevel();    UINT64 cr0 = __readcr0();    cr0 &= 0xfffffffffffeffff;    __writecr0(cr0);    _disable();    return irql;}// 开启写保护void Close(KIRQL irql){    UINT64 cr0 = __readcr0();    cr0 |= 0x10000;    _enable();    __writecr0(cr0);    KeLowerIrql(irql);}// 检查内存ULONG64 CheckAddressVal(PVOID p){    if (MmIsAddressValid(p) == FALSE)        return 0;    return *(PULONG64)p;}// CR3 寄存器写内存BOOLEAN CR3_WriteProcessMemory(IN PEPROCESS Process, IN PVOID Address, IN UINT32 Length, IN PVOID Buffer){    ULONG64 pDTB = 0, OldCr3 = 0, vAddr = 0;    // 检查内存    pDTB = CheckAddressVal((UCHAR*)Process + DIRECTORY_TABLE_BASE);    if (pDTB == 0)    {        return FALSE;    }    _disable();    // 读取CR3    OldCr3 = __readcr3();    // 写CR3    __writecr3(pDTB);    _enable();    // 验证并拷贝内存    if (MmIsAddressValid(Address))    {        RtlCopyMemory(Address, Buffer, Length);        return TRUE;    }    _disable();    // 恢复CR3    __writecr3(OldCr3);    _enable();    return FALSE;}VOID UnDriver(PDRIVER_OBJECT driver){    DbgPrint(("Uninstall Driver Is OK n"));}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){    DbgPrint("hello lyshark n");    // 根据PID打开进程    PEPROCESS Peprocess = NULL;    DWORD PID = 6672;    NTSTATUS nt = PsLookupProcessByProcessId((HANDLE)PID, &Peprocess);    DWORD buffer = 999;    BOOLEAN bl = CR3_WriteProcessMemory(Peprocess, (PVOID)0x0009EDC8, 4, &buffer);    DbgPrint("写出状态: %d n", bl);    Driver->DriverUnload = UnDriver;    return STATUS_SUCCESS;}

写出后效果如下:

3.2 Windows驱动开发:内核CR3切换读写内存

以上就是3.2 Windows驱动开发:内核CR3切换读写内存的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/383671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 12:32:14
下一篇 2025年11月6日 12:33:46

相关推荐

  • 以太坊虚拟机(EVM):智能合约的运行环境

    探索以太坊虚拟机(evm),我们步入了一个由代码和数学规则构建的数字世界,它不仅是智能合约的生命之源,更是整个以太坊区块链的核心引擎。想象一个全球共享的、去中心化的计算机,它不知疲倦地执行着数百万份合约,处理着数万亿的交易。这个强大的计算平台,正是evm。它定义了智能合约如何被编写、如何被编译、如何…

    好文分享 2025年12月9日
    000
  • 币圈必备!十大免费数字货币行情App(网站)权威推荐

    对于数字货币投资者而言,实时掌握行情动态是决策的关键。本文精选了十款功能强大、数据全面的免费行情app和网站,它们不仅提供实时价格,还集成了深度图表、资讯和分析工具,帮助您轻松追踪市场,抓住每一个投资机会。 币圈必备行情工具榜单 1. 币安 (Binance) 作为全球交易量最大的加密货币交易所,币…

    2025年12月9日
    000
  • 以太坊DeFi:去中心化金融的基石

    以太坊币交易平台推荐: 欧易OKX: Binance币安: 火币Huobi: Gateio芝麻开门: 想象一个没有银行、没有中介、每个人都能完全掌控自己资产的金融世界。这并非遥不可及的梦想,而是正在由以太坊(Ethereum)驱动的去中心化金融(DeFi)所构建的现实。DeFi是一个建立在区块链技术…

    2025年12月9日
    000
  • 2025年必备:十大精准比特币价格追踪App深度解析

    随着加密货币市场的快速发展,实时精准地追踪比特币价格变得至关重要。本文将深度解析2025年最值得推荐的十大比特币价格追踪app,帮助投资者从功能、数据准确性和用户体验等多个维度,选择最适合自己的工具。 2025年十大比特币价格追踪App排行榜 1. 币安 (Binance) 作为全球交易量领先的加密…

    2025年12月9日
    000
  • 以太坊智能合约:代码即法律的实现

    在数字世界的核心,以太坊智能合约正在重塑我们对信任、协议和法律的理解。它们不仅仅是代码片段;它们是自我执行的协议,其条款直接写入代码。这种创新理念颠覆了传统合同的概念,将人类解释的模糊性降到最低,并用确定性取而代之。想象一下,一个协议一旦达成,就能自动执行其所有条款,无需中介,无需律师,也无需担心某…

    好文分享 2025年12月9日
    000
  • 稳定币为什么能保持价格稳定?它们是如何运作的?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 稳定币是一种特殊的加密货币,其价值与法定货币或商品等“稳定”资产挂钩,旨在克服主流加密货币的剧烈价格波动。它们通过不同的储备和算法机制来维持价格锚定,为加密市场提供…

    2025年12月9日
    000
  • 以太坊2.0升级:PoS机制的变革之路

    以太坊,这个区块链世界的重量级玩家,自诞生以来便以其智能合约平台和去中心化应用(dapps)生态系统深刻影响着全球科技格局。然而,随着用户数量和交易量的激增,其底层架构——基于工作量证明(pow)的以太坊1.0逐渐暴露出性能瓶颈,例如交易速度慢、交易费用高昂以及巨大的能源消耗。这些问题如同悬在以太坊…

    好文分享 2025年12月9日
    000
  • 币安官网(Binance)入口 币安(Binance)官方认证安全登录地址(含备用)

    为了保障您的账户与资产安全,避免用户因访问到仿冒或钓鱼网站而造成损失,本文将提供币安(binance)经过官方严格认证的安全登录地址。请务必收藏并始终通过以下官方入口进行访问,确保您的每一次操作都处于平台的安全保护之下。 币安官方认证安全主入口: 币安官方认证备用安全入口: 通过官方App安全访问币…

    2025年12月9日 好文分享
    000
  • 欧易官方下载入口 2025欧易OKX官网正版APP获取教程

    Binance币安 欧易OKX ️ Huobi火币️ 要获取2025年欧易OKX官网正版APP,最关键的是确保访问的是官方网站,避免下载到仿冒或带有风险的应用。当前欧易已更名为欧易OKX,其主要业务为数字资产交易及相关服务。 确认官方网站地址 打开浏览器,输入欧易OKX的官方网址。请务必核对域名拼写…

    2025年12月9日
    000
  • Enso (ENSO)币是什么?值得投资吗?Enso工作原理和代币经济学概述

    enso (enso)是一个去中心化的共享网络,使开发者能够为跨不同区块链、rollup 和应用链的智能合约生成可执行字节码。enso 是基于 tendermint 设计的layer-1区块链,它映射了所有智能合约交互,使开发者能够从单一来源与任何链上的智能合约进行交互。这解决了区块链生态系统中的碎…

    2025年12月9日 好文分享
    000
  • 欧易OKX官网地址直达 欧易安卓iOS双端官方入口一览

    Binance币安 欧易OKX ️ Huobi火币️ 欧易OKX是全球知名的数字资产交易平台,为用户提供安全稳定的交易环境。要确保账户和资金安全,务必通过官方渠道下载应用和访问网站。 欧易OKX官网地址 欧易OKX的官方网站是用户获取服务的核心入口,所有信息和服务均以官网为准。官网网址:https:…

    2025年12月9日
    000
  • USDT会归零吗?稳定币风险与安全性深度分析

    Binance币安 欧易OKX ️ Huobi火币️ USDT会不会归零,是很多用户关心的核心问题。直接说结论:从实际运行机制和市场现状来看,USDT短期内归零的可能性极低。但这不等于它没有风险。理解它的底层逻辑和潜在隐患,比单纯猜测“会不会归零”更重要。 USDT是怎么保持稳定的? USDT(Te…

    2025年12月9日
    000
  • 什么是Akash Network(AKT)币?如何运作?AKT代币经济学及价格预测

    去中心化云计算市场正在快速扩张,akash 网络(akt)作为亚马逊网络服务(aws)的 web3 替代方案,正引领行业发展。随着区块链应用的加速,越来越多的开发者开始转向去中心化的托管和计算平台,这为 akt 代币的增长创造了理想的环境。 Binance币安 欧易OKX ️ Huobi火币️ 投资…

    2025年12月9日
    000
  • Casper Network是什么?发展历程、CSPR 代币经济与未来展望介绍

    casper 结合高扩展性、合规性与可升级智能合约,推动机构级区块链与现实资产代币化的新世代发展。 Binance币安 欧易OKX ️ Huobi火币️ ‍ 什么是 Casper Network,它是如何运作的? Casper Network 是一条为实际商业应用而设计的第一层(Layer 1)区块…

    2025年12月9日
    000
  • 新手避坑指南如何识别“空气币”和跑路盘

    Binance币安 欧易OKX ️ Huobi火币️ 刚进币圈的新手,面对五花八门的项目很容易踩坑。空气币和跑路盘最常见,它们包装得再好,也有迹可循。关键不是听他们说什么,而是看他们做了什么。 看白皮书和实际用途 拿到一个新项目,先别急着投钱,去看看它的白皮书。真正有价值的项目会清晰说明自己要解决什…

    2025年12月9日
    000
  • 什么是稳定币?通俗讲解USDT、USDC、DAI的区别

    Binance币安 欧易OKX ️ Huobi火币️ 稳定币就是价格稳定的加密货币,通常盯住1美元。你可以把它想象成数字世界的“代金券”——你存入1美元,就能拿到1个价值1美元的数字代币,能在区块链上转账、交易或投资,不用担心像比特币那样大起大落。 USDT:流通最广,但透明度有争议 USDT是最早…

    2025年12月9日
    000
  • Recall (RECALL)币是什么?代币经济学、空投领取以及价格预测

    随着人工智能(ai)和区块链的融合加速,recall(recall)正在成为2025年10月最受关注的项目之一。在binance alpha的支持下,recall以其独特的愿景吸引了投资者的关注——一个去中心化的ai市场,智能代理可以在其中竞争、合作并创造真正的经济价值。recall 代币的发行不仅…

    2025年12月9日
    000
  • 什么是山寨币?币圈“Altcoin”入门全解析

    Binance币安 欧易OKX ️ Huobi火币️ 简单说,山寨币就是比特币之外的所有加密货币。这个词最早是用来形容那些模仿比特币、想取而代之的“替代品”,但现在范围更广了,基本指除了比特币(有时也包括以太坊)以外的其他主流或非主流币种。它们不是要完全复制比特币,而是用区块链技术解决比特币的一些短…

    2025年12月9日
    000
  • 一文了解比特币(BTC)指标显示“狂热期”,11.25万美元价位令新买家承压

    Binance币安 欧易OKX ️ Huobi火币️ 近期,比特币短期持有者在实现盈利方面正面临压力,而整个网络的供应分布则显现出典型的牛市见顶预警信号。 核心要点: 比特币NUPL指标重现历史高位特征,正从“乐观”迈向“狂喜”阶段。已实现市值中,短期持有者所占份额持续攀升至历史新高。新进场投资者正…

    2025年12月9日 好文分享
    000
  • Anthropic (ANTH.PVT)是什么?会是下一个 OpenAI 级别的突破吗? 2025年价格预测

    人工智能 (ai) 迅速成为全球科技经济的内核,很少有公司能像 anthropic (anth.pvt) 一样崛起得如此之快。这家由前 openai 研究人员于几年前创立的公司,如今已从一家专注于人工智能安全领域的小众初创公司,转型成为全球估值最高的私 营企业之一。在亚马逊、谷歌和 salesfor…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信