我们知道游戏外G的原理是通过读取游戏进程的内存,取出游戏规则中不允许展示给玩家的关键数据,达到玩家本人和对手信息差的目的。但普通的用户态API是可以读其他进程的内存,比如ReadProcessMemory函数,但分分钟就能被anticheat检测到,本篇文章将带领各位实现内核态下通过切换到目标进程的CR3寄存器达到无痕读写内存的目的。
分页
首先需要了解一下内存的分页机制,至于分段机制,就不提了,系统都废掉不用了,何必多此一举。
硬盘一个扇区是512KB,也就是说只要读取,至少拿512KB的倍数,就算拿1KB,从磁盘取出来也是512KB,剩下的511KB就是浪费,但也不得不拿
目前物理内存的一个页普遍设计的是4KB,但这不是定死的。
分页功能操作相关寄存器和位
CPU上有五个寄存器,CR0~CR4,功能是控制用的,想要操作分页功能,找它们准没错。
| 位名称 | 在哪个寄存器的哪个位 | 含义 |
|---|---|---|
| PG | CR0 (31) | 分页功能的打开和关闭,0关闭1开启 |
| PSE | CR4 (4) | 页大小扩展,不想用4KB的页大小,想用更大的如2M,就得把这玩意打开 |
| PAE | CR4 (5) | 物理地址扩展,支持36位物理内存地址,即支持64G的物理内存 |
不同位的效果如下表
| PG | PAE | PSE | PS | 页大小 | 物理地址大小 |
|---|---|---|---|---|---|
| 0 | N/A | N/A | N/A | N/A | 分页功能关闭 |
| 1 | 0 | 0 | N/A | 4 KB | 32 位 |
| 1 | 0 | 1 | 0 | 4 KB | 32 位 |
| 1 | 0 | 1 | 1 | 4 MB | 32 位 |
| 1 | 1 | N/A | 0 | 4 KB | 36 位 |
| 1 | 1 | N/A | 1 | 2 MB | 36 位 |
由表可知一个页的大小是固定的,不能说这个页4KB,到下个页就变成2MB了,这是不可能的,因此,在设计页表的时候,就不用再记录页大小了,大家都一样
神奇的两张表
每个进程创建的时候都有这么一套表(一个页目录表 + n个页表),注意本篇文章不涉及开启PAE的情况,下同



2015

被折叠的 条评论
为什么被折叠?



