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

通过cr3读写进程内存

通过cr3读写进程内存

本文总结于lyshark的《Windows内核安全编程技术实践》。

技术原理

cr3保存着当前进程的最高级页目录地址(物理地址),修改cr3为目标进程的最高级页目录地址,即可读写目标进程的内存空间。

目标进程的最高级页目录地址存放于KPEOCESS结构体偏移0x28处,同时也是EPROCESS结构体0x28处。

我们通过PsLookupProcessByProcessId和PsGetProcessImageFileName函数获取获取目标进程的EPROCESS地址。之后加上0x28便得到最高级页目录地址。

获取目标进程EPROCESS

我们希望通过目标进程的可执行文件名称获取EPROCESS结构体:

staticPEPROCESS sg_pEprocess=nullptr;EXTERN_C NTKERNELAPI NTSTATUSPsLookupProcessByProcessId(HANDLE ProcessId,PEPROCESS*Process);EXTERN_C NTKERNELAPI CHAR*PsGetProcessImageFileName(PEPROCESS Process);// 通过进程名获取EPROCESS结构NTSTATUSGetProcessObjectByName(char*name){NTSTATUS status=STATUS_UNSUCCESSFUL;SIZE_T i;__try{for(i=0;i<20000;i++){PEPROCESS ep;NTSTATUS st=PsLookupProcessByProcessId((HANDLE)i,&ep);if(NT_SUCCESS(st)){char*pn=PsGetProcessImageFileName(ep);// 带下划线版本的是微软的标准扩展实现,应该优先使用if(_stricmp(pn,name)==0){DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Found %s\n",name);sg_pEprocess=ep;__leave;}}}DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Not Found %s\n",name);}__except(EXCEPTION_EXECUTE_HANDLER){returnstatus;}returnSTATUS_SUCCESS;}

读写目标进程的内存

现在有了EPROCESS,我们开着手修改cr3寄存器的内容,也就是开始切换页表:

// 切换页表_disable();UINT64 cr3=__readcr3();__writecr3(pDTB);_enable();

这里使用_disable()来关闭中断,CR3寄存器控制当前进程的页表基址,切换CR3会立即改变地址空间映射。如果在切换过程中被中断打断,中断处理程序可能在不正确的地址空间中执行,导致数据访问错误或系统崩溃。

示例代码

#include<ntddk.h>#include<windef.h>#include<intrin.h>// 页表偏移#defineDIRECTORY_TABLE_BASE0x028// _disable直接生成cli指令,需要在内核模式中使用#pragmaintrinsic(_disable)// 将_disable声明为内联函数#pragmaintrinsic(_enable)EXTERN_C NTKERNELAPI NTSTATUSPsLookupProcessByProcessId(HANDLE ProcessId,PEPROCESS*Process);EXTERN_C NTKERNELAPI CHAR*PsGetProcessImageFileName(PEPROCESS Process);staticPEPROCESS sg_pEprocess=nullptr;// 通过进程名获取EPROCESS结构NTSTATUSGetProcessObjectByName(char*name){NTSTATUS status=STATUS_UNSUCCESSFUL;SIZE_T i;__try{for(i=0;i<20000;i++){PEPROCESS ep;NTSTATUS st=PsLookupProcessByProcessId((HANDLE)i,&ep);if(NT_SUCCESS(st)){char*pn=PsGetProcessImageFileName(ep);// 带下划线版本的是微软的标准扩展实现,应该优先使用if(_stricmp(pn,name)==0){DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Found %s\n",name);sg_pEprocess=ep;__leave;}}}DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Not Found %s\n",name);}__except(EXCEPTION_EXECUTE_HANDLER){returnstatus;}returnSTATUS_SUCCESS;}VOIDDriverUnload(PDRIVER_OBJECT pDriverObj){UNREFERENCED_PARAMETER(pDriverObj);DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Uninstall Driver Successfully\n");}ULONG64CheckAddressVal(PVOID p){if(MmIsAddressValid(p)==FALSE){return0;}// 返回p指向的地址所存的内存return*(PULONG64)p;}BOOLEANCR3_ReadProcessMemory(PEPROCESS ep,PVOID addr,UINT32 length,PVOID buf){ULONG64 pDTB=CheckAddressVal((UCHAR*)ep+DIRECTORY_TABLE_BASE);if(pDTB==0){returnfalse;}// 切换页表_disable();UINT64 cr3=__readcr3();__writecr3(pDTB);_enable();if(MmIsAddressValid(addr)){RtlCopyMemory(buf,addr,length);DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"read data: %ld\n",*(PDWORD)buf);returntrue;}_disable();__writecr3(cr3);_enable();returnFALSE;}EXTERN_C NTSTATUSDriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegPath){UNREFERENCED_PARAMETER(pRegPath);DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"AccessMem Hello\n");pDriverObj->DriverUnload=DriverUnload;NTSTATUS status=GetProcessObjectByName("x64dbg.exe");if(NT_SUCCESS(status)){DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"[+] eprocess = %p\n",sg_pEprocess);}DWORD buf=0;PVOID addr=(PVOID)0x0000000009edc800;BOOLEAN bl=CR3_ReadProcessMemory(sg_pEprocess,addr,4,&buf);UNREFERENCED_PARAMETER(bl);DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"read process x64 address %p: %x, %d\n",addr,buf,buf);returnSTATUS_SUCCESS;}
http://www.rkmt.cn/news/1443657.html

相关文章:

  • IDEA 2023.3 创建 Spring Boot 项目,如何让 Java 8 和 Spring Boot 3.x 共存?保姆级配置指南
  • 天价域名AI.com背后:数字入口的战略价值与AGI生态未来
  • Arduino蓝牙控制LED:从硬件连接到APP开发的物联网入门实践
  • Lab 3-1
  • 三维立体重构智慧矿产透明化安防监测预警及AI预案
  • DIY免焊接Ryobi 18V转12V电源:闲置工具电池的再生利用方案
  • 基于姿态传感器与Nintendo LABO的互动木偶发声系统实现
  • 跨可用区高可用云原生集群节点规划中关于 K8s Pod健康检查探针设计部署的架构思考
  • AI如何守护加密货币高额交易安全:从异常检测到实时防御
  • AI意识之谜:从整合信息理论到硅基困境与未来路径
  • 告别卡顿!用Faster-Whisper在CPU上5分钟搞定中文语音转文字(附Tiny模型下载与转换)
  • Cadence Allegro焊盘制作避坑指南:为什么你的不规则焊盘在出Gerber时“消失”了?
  • 2026闭眼入!5款AI写作辅助平台亲测,治愈文献焦虑,初稿撰写快人一步
  • 神经渲染的鲁棒性:从技术内核到产业落地的全面解析
  • 2026年一键生成论文工具测评:5款神器从选题到排版全流程通关秘籍
  • 保姆级教程:用STM32CubeMX给STM32F407VET6接上TF卡,从配置、读写测试到Debug全流程
  • 3步解决Mac百度网盘限速:开源加速插件完整使用指南
  • 告别马赛克脸:用GFPGAN一键修复模糊老照片,实测效果与避坑指南
  • 沈阳保温钉哪家好优选辽宁源创节能保温建材 - 博客湾
  • B站视频下载完全指南:免费解锁大会员4K高清内容
  • 六自由度并联波浪补偿系统设计与控制关键技术解析【附仿真】
  • 2026年 预锂化硅氧材料厂家推荐榜单:高硅氧纤维/硅氧聚合物/硅氧前驱体,技术实力与创新应用深度盘点 - 企业推荐官【官方】
  • Sora 2点云生成失效的5类致命陷阱(含调试日志特征码):一位资深SLAM工程师的血泪排错清单
  • 自制6万伏高压倍压器:从科克罗夫特-沃尔顿原理到安全实践
  • AutoSubs:终极本地AI字幕生成方案,视频编辑效率提升300%
  • 2026杭州GEO优化TOP5权威榜:选型指南+避坑攻略+深度测评 - 玖叁鹿
  • 纯模拟电路实现循线小车:从光电传感器到差分控制
  • 告别Foremost:用Wireshark内置功能与Python脚本一键提取CTF流量中的隐藏文件
  • ExplorerPatcher架构解析:Windows Shell定制化技术实现方案
  • PCL2启动器内存优化功能:让低配电脑也能流畅运行Minecraft