首页
社区
课程
招聘
[求助]关于切换CR3读写进程内存时目标进程不在内存中
发表于: 2013-5-9 01:14 16554

[求助]关于切换CR3读写进程内存时目标进程不在内存中

2013-5-9 01:14
16554

求助区的一个贴中有相关内容,欢迎对KX感兴趣的童鞋
http://bbs.pediy.com/showthread.php?t=171249

参考了一些例子(比如http://bbs.pediy.com/showthread.php?t=64938)和WRK中的源码,可以发现WRK中KiAttachProcess对于目标进程是否在内存中(Process->State == ProcessInMemory)会进行判断并作出不同的处理,这里考虑目标进程不在内存中的情况,网上的例子似乎大部分不管这个直接霸王硬上弓,切换完CR3就开始memcpy了,那么这个时候如何保障目标内存还在RAM中且PTE指向的位置有效

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
就算是无效的,那就触发缺页中断呗 ,然后地址就有内容了

当然,本来就是无内容的地址,访问当然蓝屏
2013-5-9 06:43
0
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
直接切换Cr3蓝屏的几率很高。并且切换Cr3的时候IRQL == DPC_L ,无法触发缺页中断,如果进程没有在内存中,一定蓝屏
2013-5-9 07:50
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
切换的时irql是在dpc_level但是切换完成后进行内存操作时会降下来的。。。要么创建mdl锁住目标
这类问题都可以避免的吧
2013-5-9 09:56
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
5
额这种情况下缺页处理还能正常工作么。。会不会存在目标进行的pde和pte也被换出的情况
感觉KiAttachProcess中判断进程是否在内存中一定有原因。。
2013-5-9 10:01
0
雪    币: 5
活跃值: (1131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
创建一个傀儡进程。 DirectoryTableBase里面存的就页目录表基址。想读哪个进程,就把傀儡进程的DirectoryTableBase改成哪个进程的的。再用标准api读傀儡进程内存,很安全的,杀软还不报。
2013-5-9 10:51
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
7
这个方法稳定性不错,就是隐蔽性稍有欠缺
俺希望整个过程(进入R0之后)不会被任何钩子捕获
2013-5-9 12:23
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
所以Microsoft推荐的方式是创建MDL锁住内存...
如果想霸王硬上弓,一定要进__try
2013-5-9 14:04
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
9
请教一下创建mdl锁住内存是指锁住哪。。。
读写的缓存目前采用的是用nonpagedpool作为缓存来保存
2013-5-9 14:11
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
P_Mdl = MmCreateMdl(NULL, 要修改的内存地址, 长度);
MmBuildMdlForNonPagedPool(P_Mdl); //建立Mdl非分页池
P_Mdl->MdlFlags = P_Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; //修改标志为不可页出
PMap = MmMapLockedPages(P_Mdl, KernelMode); //映射并锁定MDL,返回映射页的起始地址
memcpy(PMap...); //修改内存
MmUnmapLockedPages(PMap, P_Mdl); //解除映射和锁定
IoFreeMdl(P_Mdl); //释放MDL
2013-5-9 16:26
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
11
明白了,多谢指教。

要是这个时候目标进程的PDE已经被换出的话是不是会BSOD……
2013-5-9 16:39
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
MmMapLockedPages锁定,不会被换出了
2013-5-9 16:40
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
13
在切换CR3前先锁定PDE么?如果这个时候PDE已经被换出了能锁定么
多谢指教……
2013-5-9 16:53
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
切换CR3之前,Context还不在目标进程,如何锁定?
2013-5-9 17:19
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
15
那……切换时目标进程的PDE不在内存中不是直接挂掉了……
2013-5-9 17:36
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
无论是执行访问还是读写访问,也不管PDE是否在内存中
切换进程的动作并不会访问进程的地址空间,这只是CPU执行的一个调度
执行完这个调度,IRQL便会降低到DPC_LEVEL之下
如果这时候PDE不在内存中,那么访问就会触发缺页中断,结果PDE就会被重新填充
2013-5-9 18:21
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
KiAttachProcess不但切换了CR3,还挂靠了线程
所以,为了安全起见,不要直接切换CR3,模拟底层不是那么简单的
2013-5-9 18:29
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
18
切换完之后如果目标PDE不存在,就等于载入了一个未知的页表,如果运气不好(没有遇到正好CR3错误地指向了另一个进程的页表的话)产生缺页中断也没法处理,页表乱了中断处理也不正常了。
看来得严格模拟KiAttachProcess的逻辑来处理了……
2013-5-9 19:44
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
19
难道得严格按照KiAttachProcess模拟么。。。里面调用了线程管理的函数
2013-5-10 14:37
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
越来越发现楼主扯蛋, 页表的内存为非分页内存,一直都存在内存中的.

还有cr3,不可能错误的指向另一个进程的,因为windows切换线程时,如果是另一个进程了,就切换cr3
,根本不可能cr3错误.

2013-5-10 19:38
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
21
进程内存是可能被换出的,参考《Windows内核原理与实现》中的4.5.5节,或者WRK中的KeSwapProcessOrStack()
换出后PDE就不在物理内存中了,如果原来指向的地址正好变成了另一个进程的PDE的话就……(这种情况只是推测,未验证):eek
2013-5-10 20:14
0
雪    币: 683
活跃值: (622)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
N年后的今天,我也遇到了同样的问题
2019-2-24 21:38
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
JWPL 创建一个傀儡进程。 DirectoryTableBase里面存的就页目录表基址。想读哪个进程,就把傀儡进程的DirectoryTableBase改成哪个进程的的。再用标准api读傀儡进程内存,很安全的 ...
直接改KPROCESS的CR3,会导致优化WorkingSet线程在MiCheckProcessShadow会蓝,导致MEMORY_MANAGEMENT。WIN10-64-1809。
ffffc086`56697770 fffff807`5e6c3f53 : ffffd30b`a04b2640 00000000`00000001 00000000`00053053 00000000`00000000 : nt!MiCheckProcessShadow+0x157691
ffffc086`566977d0 fffff807`5e742675 : 00000000`00000000 ffffc086`56697a80 ffffc086`566979b0 00000000`00000000 : nt!MiTrimOrAgeWorkingSet+0x5d3
ffffc086`566978b0 fffff807`5e741056 : fffff807`00000001 00000000`00000000 fffff807`5ea5a980 ffffd30b`94e430f0 : nt!MiProcessWorkingSets+0x255
ffffc086`56697a60 fffff807`5e79bc17 : 00000000`00000002 00000000`00000002 00000000`ffffffff 00000000`00000001 : nt!MiWorkingSetManager+0xaa
ffffc086`56697b20 fffff807`5e65aa45 : ffffd30b`94f79080 00000000`00000080 fffff807`5e79bad0 00000000`00000000 : nt!KeBalanceSetManager+0x147
ffffc086`56697c10 fffff807`5e7d7c3c : fffff807`5ce27180 ffffd30b`94f79080 fffff807`5e65a9f0 00000000`00000000 : nt!PspSystemThreadStartup+0x55
ffffc086`56697c60 00000000`00000000 : ffffc086`56698000 ffffc086`56692000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x1c

用隐藏进程之类把能遍历到的EPROCESS的双链干掉依旧会出发该BSOD。
TrimWorkingSet线程在另外一份内存会枚举到改了CR3的EPROCESS,时间一到准备优化Pages的时候就BSOD。
2019-5-5 13:21
0
雪    币: 367
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
Jason姚 N年后的今天,我也遇到了同样的问题
兄弟,我也出了同样的问题,问一下你解决了嘛?缺页问题怎么解决的?
2019-11-11 16:28
0
游客
登录 | 注册 方可回帖
返回
//