Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

一些关于R0读写进程内存的问题(APC?附加?换出?)欢迎拍砖

$
0
0
近日在研究直接读写内存,遇到了诸多问题:eek::eek:
参考WRK中NtReadVirtualMemory/NtWriteVirtualMemory->MmCopyVirtualMemory->MiDoPoolCopy/MiDoMappedCoy的过程,读写进程内存的大致思路大概如下:cool:
解析进程句柄得到目标进程的PEPROCESS,然后检查一番,之后附加到目标进程(同时处理下APC)并切换CR3,最后复制内存,然后……

顺便看了下网上的实现方向,下面是第一种:

直接从目标进程的EPROCESS中读取页目录指针,然后切换CR3,并进行内存读写。
这种粗暴地方法看上去可以,但根本没考虑APC的问题,如果切换完CR3后线程被APC打断,执行APC时很可能因为地址空间不一致而……

于是就有了第二种,切换CR3前先处理下APC。处理的方法有很多,有的像MS一样保存APC这里先不讨论,但另外两种方法能有效么:eek::eek:
A.通过KTHREAD禁用内核APC/特殊APC
看上去可以,交付APC前的确会检查是否禁用。

B.提升IRQL到APC_LEVEL
首先提升IRQL会造成不稳定么,其次似乎APC似乎也可以在进程切换时被交付……

然后是第三种,老老实实保存APC状态的,然后切换CR3再memcpy:rolleyes:,这样似乎正确,当前线程的地址空间已经是目标进程的了。然而这里还有一个问题,目标进程的虚拟内存很可能不在物理内存中:eek::eek:。

这种情况下产生页错误内核还能正确处理么?还是得像MS那样先判断目标进程是否在内存中,如果不在的话等待其被换入内存:rolleyes:?

:eek::3::3:

Viewing all articles
Browse latest Browse all 9556

Trending Articles