x86分页内存布局与CR3骚操作读写内存

我们知道游戏外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的情况,下同

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值