驱动读内存

先定义一个结构,方便应用层调用读写

typedef struct DATA
{DWORD pid;//不用HANDLE类型也可以,个人觉得用DWORD方便应用层调用unsigned __int64 address;int data;
}Data;

读内存

1.使用通过进程ID获取进程对象PsLookupProcessByProcessId,此时内核对象引用数会加1
2.KeStackAttachProcess进入进程的地址空间
3.ProbeForRead检查内存地址是否有效
4.RtlCopyMemory将指定的内存Copy到一个缓冲区,至此,内存已经读到
5.收尾:
调用KeUnstackDetachProcess解除与进程的绑定,退出进程地址空间,
调用ObDereferenceObject使内核中对象引用数减1

BOOL ReadMemory(Data* data)
{PEPROCESS process=NULL;//获取进程对象NTSTATUS status = PsLookupProcessByProcessId(data->pid,&process);if (process == NULL){DbgPrint("获取进程对象失败,PID:%d",data->pid);return FALSE;}KAPC_STATE state = { 0 };//绑定进程对象,进入进程地址空间KeStackAttachProcess(process, &state);__try{//读取内存ProbeForRead(data->address, sizeof(data->data), 1);RtlCopyMemory(&(data->data), data->address, sizeof(data->data));}__except(1){//解除绑定KeUnstackDetachProcess(&state);//让内核对象引用数减1ObDereferenceObject(process);DbgPrint("读取进程 %d 的地址 %x 出错", data->pid, data->address);return FALSE;}//解除绑定KeUnstackDetachProcess(&state);//让内核对象引用数减1ObDereferenceObject(process);DbgPrint("进程 %d 地址 %x 数据:%d", data->pid, data->address, data->data);return TRUE;
}

写内存

1.使用通过进程ID获取进程对象PsLookupProcessByProcessId,此时内核对象引用数会加1
2.KeStackAttachProcess进入进程的地址空间
3.IoAllocateMdl创建地址描述符
4.MmBuildMdlFornon将该内存与我们的驱动绑定
5.调用MmMapLockedPages将MDL映射到我们驱动里的一个变量,对该变量读写就是对MDL对应的物理内存读写
6.用RtlCopyMemory来修改对应内存储存的数值
7.收尾:
MmUnmapLockedPages解除映射,
KeUnstackDetachProcess解除与进程的绑定,退出进程地址空间,
ObDereferenceObject使内核中对象引用数减1

BOOL WriteMemory(Data* data)
{PEPROCESS process=NULL;//获取进程对象PsLookupProcessByProcessId(data->pid, &process);if (process == NULL){DbgPrint("获取进程对象失败");return FALSE;}KAPC_STATE state = { 0 };//绑定进程KeStackAttachProcess(process, &state);//创建MDLPMDL mdl = IoAllocateMdl(data->address, sizeof(data->data), 0, 0, NULL);if (mdl == NULL){DbgPrint("创建MDL失败");return FALSE;}//使MDL与驱动进行绑定MmBuildMdlForNonPagedPool(mdl);int* ChangeData = NULL;__try{//将内存映射到ChangeDataChangeData = MmMapLockedPages(mdl, KernelMode);}__except (1){DbgPrint("映射内存失败");IoFreeMdl(mdl);KeUnstackDetachProcess(&state);//让内核对象引用数减1ObDereferenceObject(process);return FALSE;}RtlCopyMemory(ChangeData, &(data->data), sizeof(data->data));DbgPrint("进程ID:%d 地址:%x 写入数据:%d",data->pid, data->address,*ChangeData);//让内核对象引用数减1ObDereferenceObject(process);MmUnmapLockedPages(ChangeData, mdl);KeUnstackDetachProcess(&state);return TRUE;
}

新手一个,如有错误,望指教

驱动读写应用程序内存相关推荐

  1. 在驱动和应用程序间共享内存

    在驱动和应用程序间共享内存 在不同的场合,很多驱动编写人员需要在驱动和用户程序间共享内存.两种最容易的技术是: l 应用程序发送IOCTL给驱动程序,提供一个指向内存的指针,之后驱动程序和应用程序就可 ...

  2. C语言应用到SSD,SSD1963的样例程序 c语言驱动读写程序.doc

    SSD1963的样例程序 c语言驱动读写程序 /* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ //#define BaseAddr0x10 ...

  3. 易语言x64驱动读写(可读写有保护游戏内存数据)-稳定

    现在市场上一个可以读取 有保护的游戏的驱动读写插件,价格在1000元/每月 为了帮助独立团论坛的用户节省金钱,我们开发了这款易语言模块. 这次的驱动读写可以读写测试了TX很多个游戏(CF,逆战,LOL ...

  4. 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。

    接触了两年多时间的单片机编程本人对关于单片机程序内存如何耗费的问题一直懵懵懂懂,直到在近日看到某篇有关于MDK MAP文件介绍的帖子后才有种醍醐灌顶的感觉,这里我将分享在此之上的观点与见解以供大家讨论 ...

  5. 驱动开发: 封装内核级驱动读写

    内核级别的内存读写可用于绕过各类驱动保护,从而达到强制读写对端内存的目的,本人闲暇之余封装了一个驱动级的内核读写接口,使用此接口可实现对远程字节,字节集,整数,浮点数,多级偏移读写等. 项目地址:Gi ...

  6. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  7. Linux 下几款程序内存泄漏检查工具

    Linux 下几款程序内存泄漏检查工具 chenyoubing | 发布于 2016-07-23 10:08:09 | 阅读量 93 | 无 写这篇博客的原因呢是因为自己在编写基于Nginx磁盘缓存管 ...

  8. linux c 代码分析工具,编程达人 分享几款Linux 下C/C++程序内存泄漏检查工具

    1.内存管理是否正确(因为这个程序本身开辟很多内存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发的,内存管理机制一直是程序员头痛的东西) 2.程序的健硕性如何(服务器任何程序的基本要求就 ...

  9. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  10. go每日新闻(2021-08-29)——Go程序内存假泄漏是怎么回事

    每日一谚:Your Go functions should not have six return values. . go中文网每日资讯--2021-08-29 一.Go语言中文网 IEEE 202 ...

最新文章

  1. Shell脚本示例代码
  2. python反转字符串(简单方法)及简单的文件操作示例
  3. wdatepicker设置时间范围_Mac新手必看,这些设置可以让你的Mac更好用!
  4. leetcode算法题--最长湍流子数组
  5. 【code】Splay 模板
  6. YUV422转RGB24
  7. 学习进度(2016.5.1)
  8. pg 事务 存储过程_PgpoolII实现数据分区存储及性能分析
  9. mysql创建师徒_[郑州|结业弟子]JAVA-乔兆年|2020年05月09日的日报-技能树.IT修真院...
  10. java同一程序只运行一次_如何使自己的程序只运行一次
  11. python自动化测试-python自动化测试
  12. sha256加密_比特币入门(五):比特币的加密
  13. 企业为什么要做高端网站优化呢?
  14. MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm
  15. ocp认证考试报名_2019年OCP认证在线考试网_OCP题库
  16. 云桌面服务器+搭建,搭建自己的云桌面服务器
  17. Chrome下面查看placeholder的样式
  18. DNS、HTTP劫持的一些事
  19. HTML中屏蔽Enter键
  20. 小学生防溺水安全主题班会教案

热门文章

  1. 使用广义α方法(the generalized-α method)求解时变动力学问题
  2. 2017年2月14日实习日记 RHEL下dracut制作initramfs
  3. taro 的项目结构_自定义 Taro UI 组件的边框样式(hairline mixin)《 电商小程序案例:页面结构 》...
  4. Word中有些空行无法删除,我是这样解决的.............
  5. 同步时间服务器修改同步间隔,如何更改Windows 10时间同步间隔
  6. 马小云:利用信息差赚钱的暴利创业项目 ,批量开店月入3万
  7. 软件包没有可安装候选
  8. iOS系统字体大全,iOS系统中所有的字体
  9. PS笔刷素材套装:81种自定义树叶水彩/水粉画
  10. 面向对象:寻寻觅觅,诚邀你一起来解开这道迷题