一、进程地址空间
char* p可以和intptr_t互相转换
1、可以指向任何地址
2、合法的地址(可读或可写)
(1)代码(main, %rip会从此处取出待执行指令), 只读
(2)数据(static,int x),读写
(3)堆栈(int y),读写
(4)运行时分配内存,读写
(5)动态链接库
3、非法的地址
(1)NULL,导致segmentation fault
二、查看进程地址空间
pmap(1) report memory of a precess
如何查看进程的地址空间
![在这里插入图片描述](https://img-blog.csdnimg.cn/078241dd2ccd44c6b81b19bff8919371.png)
1、最小的Hello world (静态/动态链接)
(1)进程的地址空间:若干连续的“段”
(2)“段”的内存可以访问
(3)不在段内/违反权限的内存访问触发SIGSEGV
gdb可以越权访问,但是不能访问不存在的地址
三、操作系统提供查看进程地址空间的机制
RTFM:/proc/[pid]/maps (man 5 proc)
1、进程地址空间中的每一段
(1)地址(范围)和权限(rwxsp)
(2)对应的文件:offset,dev,inode,pathname
2、和readelf里的信息互相验证
四、进程的地址空间
进程的地址空间=内存里若干连续的“段”
1、每一段是可访问(读/写/执行)的内存
(1)可能映射到某个文件和/或在进程间共享
管理进程地址空间的系统调用
//映射
void *mmap(void* addr, size_t length, int port, int flag, int fd, off_t offset);
//取消映射
void munmap(void,* addr, size_t length);
//修改映射权限
int mprotect(void,* addr, size_t length, int port);
2、RTFM:状态增加/删除/修改一段可访问的内存
五、地址空间隔离
每个*ptr只能访问本进程(状态机)的内存
1、除非mmap显示指定、映射共享文件或共享内存多线程
2、实现了操作系统最重要的功能:进程之间的隔离
六、修改器
1、修改器
(1)通过open ”/proc/pid/mem“
便利内存中的某个值,根据修改值,可以锁定地址空间;通过修改该地址的值,实现修改。
如:修改器就是通过值锁定地址,实现游戏金币数值修改
2、变速齿轮
(1)“欺骗”进程时钟
源头:闹钟、睡眠、gettimeofday
拦截它们需要跟复杂的技术
在时间调用(系统调用)处,添加一个跳转指令,跳转至自定义时间处理函数,可以实现时间齿变换
3、游戏安全
控制/数据流完整性
(1)保护进程的完整性
独立的进程/驱动做完整性验证
(2)保护隐私数据不被其他进程读写
拦截向本进程的ReadProcessMemory和WriteProcessMemory,发现后立即拒绝执行