写时复制 (Copy-on-Write, COW):一种高效的资源共享策略
写时复制 (Copy-on-Write, COW),有时也称为隐式共享 (implicit sharing),是一种延迟资源复制的技术。其核心思想在于:在创建资源副本时,并不立即进行实际的复制,而是让新副本与原始副本共享相同的底层资源。只有当其中一个副本尝试修改共享资源时,才会触发真正的复制操作。
这种策略的核心优势在于,它能够显著减少创建副本时的开销,并更有效地利用系统资源。然而,这种优化也带来了一定的代价,即在资源修改时会引入少量的额外开销。
这种机制在Windows中尤其常见
众所周知每个进程存放的VAD树保存了各种私有内存,映射内存,模块等
以Windows 10 21H2 版本为例子
这个链表把所有的有这个模块的VAD串起来了,什么意思呢?
比如explorer.exe进程有Ntdll.dll模块,kanxue.exe也有这个模块,那么就可以拿到explorer.exe的这个链表遍历链表,找到kanxue.exe的EPROCESS
注意遍历到的链表是 "MMVAD + ViewLinks"的位置所以要找到下一个对象:"VadsProcess",这个对象得到之后的EPROCESS 要"AND 0xfffffffffffffff0"才是真实的EPROCESS.
根据上述描述,我们可以得到所有进程,只要它含有NTDLL.DLL模块
我们可以拿NTDLL模块的开始VPN到结束VPN所有页面的虚拟地址开头
根据上述所述,我们可以得到explorer.exe进程和kanxue.exe的NTLL所有VPN
引出"Copy-on-write"机制利用,根据原理描述,NTDLL.DLL的VPN所有页面的内存在没有人为/系统的修改情况下,完全相同,不仅字节相同,且PTE的物理地址也相同.
所以我们可以遍历2个进程的所有NTDLL的页面的物理地址并且进行比较
为什么要进行比较? 一旦有人为/系统修改NTDLL模块任何一个内存,将会触发Copy-on-write机制会把内存放到另一个物理地址 我们在遍历地址的时候,最好访问一次地址确保物理页全部挂上全部有效
所以"总的来说就是对撞模块物理地址库" 根据Copy-on-write抓变化的内存.
抓模块/隐藏模块 隐藏进程/抓进程 方法繁多 文章内容较浅 仅提供无聊的想法
另外在WIN10 1903版本左右时期,通过修改_MMPTE_SUBSECTION中protect为0x6及以上,则写拷贝失效,改就是全局.

typedef struct _MMVAD
{
struct _MMVAD_SHORT Core;
/
/
0x0
union
{
ULONG LongFlags2;
/
/
0x40
volatile struct _MMVAD_FLAGS2 VadFlags2;
/
/
0x40
} u2;
/
/
0x40
struct _SUBSECTION
*
Subsection;
/
/
0x48
struct _MMPTE
*
FirstPrototypePte;
/
/
0x50
struct _MMPTE
*
LastContiguousPte;
/
/
0x58
struct _LIST_ENTRY ViewLinks;
/
/
0x60
struct _EPROCESS
*
VadsProcess;
/
/
0x70
union
{
struct _MI_VAD_SEQUENTIAL_INFO SequentialVa;
/
/
0x78
struct _MMEXTEND_INFO
*
ExtendedInfo;
/
/
0x78
} u4;
/
/
0x78
struct _FILE_OBJECT
*
FileObject;
/
/
0x80
}MMVAD,
*
pMMVAD;
typedef struct _MMVAD
{
struct _MMVAD_SHORT Core;
/
/
0x0
union
{
ULONG LongFlags2;
/
/
0x40
volatile struct _MMVAD_FLAGS2 VadFlags2;
/
/
0x40
} u2;
/
/
0x40
struct _SUBSECTION
*
Subsection;
/
/
0x48
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2025-1-23 19:40
被S极客编辑
,原因: 另外在WIN10 1903版本左右时期,通过修改_MMPTE_SUBSECTION中protect为0x6及以上,则写拷贝失效,改就是全局.