blackbox 发表于 2021-4-27 11:30:43

R0 - R3通讯问题

微软提供的通讯方式是利用IRP进行R0R3数据交互,出于实验,我自己也做了个通讯,
1.修改R0的分页属性,让R3能够直接读取R0内存
2.R0创建个线程循环,用于接收R3的数据,达到交互的目的

问题:
1.内核线程死循环占用较高,直接占满了一个核心,能否优化呢
2.多线程问题,R3多线程和R0交互,有很多问题,容易蓝屏

Tesla.Angela 发表于 2021-4-27 16:53:22

0、我很好奇你是怎么样使得应用程序可以直接读取内核内存的(除非你用的是XP)。

1、在循环里调用KeDelayExecutionThread。

2、一般非标准方式通信还可以使用内核CALLBACK(比如注册表CALLBACK)。

blackbox 发表于 2021-4-27 21:58:26

Tesla.Angela 发表于 2021-4-27 16:53
0、我很好奇你是怎么样使得应用程序可以直接读取内核内存的(除非你用的是XP)。

1、在循环里调用KeDelayE ...

0.修改线性地址的分页属性,修改U/S位,这是保护模式的知识
2.我对通讯的访问次数很高,每秒几十万次,而内核函数为了防止重入,我加了锁,导致了我单线程死循环访问内核一个函数时没问题,第二个线程同时访问同一个内核函数时在锁外进不去,目前我自己的解决方法是内核写两个相同功能函数,不同线程访问不同函数,比较傻

blackbox 发表于 2021-4-27 22:04:31

Tesla.Angela 发表于 2021-4-27 16:53
0、我很好奇你是怎么样使得应用程序可以直接读取内核内存的(除非你用的是XP)。

1、在循环里调用KeDelayE ...

关于你的第一点疑惑可以参考这个,在x64下修改线性地址的分页属性可以让R3读R0内存,https://www.cnblogs.com/lanrenxinxin/p/4735027.html

Tesla.Angela 发表于 2021-4-28 05:45:44

blackbox 发表于 2021-4-27 21:58
0.修改线性地址的分页属性,修改U/S位,这是保护模式的知识
2.我对通讯的访问次数很高,每秒几十万次,而 ...

**** Hidden Message *****

tangptr@126.com 发表于 2021-4-28 21:29:42

改页表你不管PatchGuard么

blackbox 发表于 2021-4-28 23:07:31

Tesla.Angela 发表于 2021-4-28 05:45
**** 本内容被作者隐藏 ****

不是,学了保护模式就想做点项目练手加固记忆,正好吹水群大佬说内核线程通讯缺陷很多,就想练练手了,目前就只有多线程的问题了

blackbox 发表于 2021-4-28 23:09:30

tangptr@126.com 发表于 2021-4-28 21:29
改页表你不管PatchGuard么

改页表不PG吧

blackbox 发表于 2021-5-26 14:37:21

经过实验,改页表属性不行,找个一个月的BUG
1.我自己电脑没问题,但是大部分系统会改页表属性,如果自己强制死循环改页表属性就会蓝屏,
2.然后我又想到自己挂PTE,但是现在很多电脑都是大内存,很可能分的页表都没PTE和PDE,我并没有思路解决
3.最后老实点用系统的MDL映射一个地址,然后传给R3进行通信吧

hang_on 发表于 2021-5-31 14:38:49

blackbox 发表于 2021-4-28 23:09
改页表不PG吧

触发的吧……我去年改了页表折腾了一周

blackbox 发表于 2021-6-2 12:46:11

hang_on 发表于 2021-5-31 14:38
触发的吧……我去年改了页表折腾了一周

可能吧,我自己用没事啊 1909的,一两个小时没问题,给别人测试要么蓝屏,要么就系统自动改PTE属性,

stylezhou 发表于 2021-6-27 09:22:18

学习下看一看

aleown 发表于 2021-7-19 19:21:39

谢谢分享哈

AJin 发表于 2021-8-8 21:54:49

学学思路

Cloutain 发表于 2021-8-12 09:15:50

应用层与内核通讯的方式很多,IRP,ALPC,共享内存,MiniFilter,管道,socket,ETW,但要设计出一个好用高效的,就得花花功夫了

CleanLove 发表于 2021-8-20 17:38:04

学一学~

iop02008 发表于 2022-12-3 03:39:23

看看情况

zgs123 发表于 2024-1-23 05:55:22

我用的是线程暂停的方法
直接映射一块内存到R3 之前用了挂靠,但是觉得直接读物理内存也行。
r3读完直接暂停本线程 r0判断线程状态再写入
当时感觉的这比再创建一个事件句柄好,毕竟线程他是本来就必须要存在的数据都可以捆绑在一个结构里,单独创建一个句柄用来等待感觉像脱裤子放屁不符合编程思想。
话说回来还是技术问题直接插apc或者KeUserModeCallback不也行吗
页: [1]
查看完整版本: R0 - R3通讯问题