开启左侧

手游指针和基址详解

[复制链接]
发表于 2022-3-25 21:37:04 | 显示全部楼层 |阅读模式
本帖最后由 红提 于 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在内存中的结构如下:

游客,如果您要查看本帖隐藏内容请回复



回复

使用道具 举报

发表于 2022-3-28 19:53:06 | 显示全部楼层
6666666666
回复

使用道具 举报

发表于 2022-3-30 13:32:52 | 显示全部楼层
6666666666
回复

使用道具 举报

发表于 2022-4-11 17:43:50 | 显示全部楼层
我来学习下
回复

使用道具 举报

发表于 2022-4-21 11:47:48 | 显示全部楼层
666666666666666
回复

使用道具 举报

发表于 2022-4-24 11:48:07 | 显示全部楼层
学习了
回复

使用道具 举报

发表于 2022-5-13 09:10:55 | 显示全部楼层
6666666666
回复

使用道具 举报

发表于 2022-5-17 04:12:30 | 显示全部楼层
6666666666666
回复

使用道具 举报

发表于 2022-6-2 09:38:59 | 显示全部楼层
我就想看看隐藏了什么内容...
回复

使用道具 举报

发表于 2022-6-17 10:02:47 | 显示全部楼层
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表