本帖最后由 红提 于 2022-3-25 22:01 编辑
在手游作弊中,最常见的数值定位方式有2种,特征码定位和指针基址定位
特征码定位
offset value
0 1001
1 1002
2 1003
3 1004
假设我们想要精确1002这个数值,直接在内存遍历这个值肯定会有很多的结构,那么特征码定位的作用就是减小定位的结果数量,精确我们想要的值
分析上面表格我们可以得知:
1002 偏移 -1 值是1001
1002 偏移 1 值是1003
1002 偏移 2 值是1004
根据这个特征,我们就能定位出想要的数值。但是,如果内存中有很多一样的特征,就很难再精确定位,再或者这个值附近的值都是随时变化的,那我们就不能特征定位这个值,怎么办,这时候有了个新的方法:基址指针定位
在讲解怎么找指针和基址之前,我们先来了解一下
什么是指针
指针是C语言的一个概念,也是C语言中比较困难的部分。
简单来说,指针也就是内存地址,指针变量是用来存放内存地址的变量,可对存储数据的变量地址进行操作。
不同类型的指针变量所占用的存储单元长度是相同的。
怎么在游戏内存中寻找指针
在32位游戏中,指针地址的存储是long int类型(4字节)
在64位游戏中,指针地址的存储是long long类型(8字节)
我这里写个例子
struct player{undefined
DWORD id; //ID
DWORD hp; //血量
DWORD hurt; //攻击力
…
}
struct game{undefined
struct player *p1 = new struct player;
struct player *p2 = new struct player;
…
}
//游戏初始化
void init(){undefined
struct game* sg;
sg = new struct game;
}
游戏初始化后,sg在内存中的地址是固定的,这就是基地址(简称基址)
(例子写的比较粗劣,仅供参考,并非代表实际结构)
如果说,我们要定位p1的血量,那逻辑就是:模块初始化地址–>基址–>p1–>hp
假设,这是在libGame.so中的代码,那么我们可以从/proc/游戏PID/maps中找到模块的初始化地址
根据上面的数据,我们可以知道,p1在内存中的结构如下:
|