利用影子页表实现隐藏内存与快速读写

看到一篇文章  思路很有意思 顺手转发到这里 赚点贡献 支持吾爱论坛越办越好 版主2020年身体健康 全家发财 o(* ̄︶ ̄*)o


原文地址


创建一套页表 吧系统页表的pml4部分拷贝进来 亮点是 吧前512G内存所在的pml4项都映射到对应的物理地址去 注意不是线性地址  也就是说 切换cr3 大家读写线性地址 最后cpu实际上是通过cr3 四级页表 转换 线性地址 最后 得到pte指向的pfn 物理地址去了  如果把cr3四级页表 部分pml4的翻译 自己diy 弄成物理地址翻译成物理地址 那么 切换到这个影子页表后 你可以直接RtlCopyMemory(物理地址,物理地址,大小) 不会奔溃 因为这里的物理地址最终可以被翻译到物理地址去  完后自己内核分配一块连续内存  获取他得物理pfn 保存起来  完后亮点是释放他后  利用MmMarkPhysicalMemoryAsBad把这个被释放的页面标志为坏内存 也就不能再被其它Mm系列的函数分配利用它了  完后把原始函数所在页面数据拷贝到这快坏内存里 完后把自己创造的影子页表对应的pfn设置为刚才保存的pfn  完后切换到影子页表  你就可以执行那个函数了 你也可以hook这个函数 不会被其它保护系统检测到 因为根本不在一个页面 而且cr3也不一样 最关键是 对应的pml4表项 翻译后 也找不到那个影子pfn  但是缺点是 如果这个函数内部有调用其它函数 你需要重定位 而且只能内核 不能执行r3的代码 但是可以读写r3的内存  原理就是把 游戏内存转换为物理地址  因为肯定在前512G以内 还记得我们刚才已经在自己的影子页表里 吧前512G的物理内存映射关系 都自己安排好了吗? 所以直接切换到我们的影子页表后 读写对应的物理内存就完事 不需要通过内核函数去读写物理内存 避免被检测 也不需要切换到游戏cr3 去读写内存 但是如果这个内存换页了 那你就读写不到了 其实这份代码 就是带你学习一下MmMapIoSpace的底层原理而已  他就是实现了一个 不稳定版的MmMapIoSpace 关键是 举一反三 创新diy的亮点思路 有点意思
源码请去原文下载

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称