初中生
 
- 金币
- 165
- 好评
- 6
- 信誉
- 100
|
发表于
2025-10-21 09:24:38
来自手机
|
显示全部楼层
| 阅读模式
来自 安徽
1. SO 文件的组成与映射
一个 SO 文件通常包含多个“段”,最重要的有:
.text: 代码段,包含编译好的机器指令。通常是只读和可执行的。
.data: 已初始化数据段,包含明确初始化的全局变量和静态变量(初始化值不为0)。
.bss: 未初始化数据段,包含未初始化或初始化为0的全局变量和静态变量。在文件中不占空间,但在加载时会请求相应大小的内存并将其初始化为0。
.rodata: 只读数据段,包含字符串常量等只读数据。
这些不同的段,因其属性不同,会被映射到虚拟地址空间中的不同内存区域。也就是GG修改器选择内存界面中的不同内存区域。
2. 关键的内存区域
在 Android 的进程虚拟地址空间中,SO 库主要被映射到以下几个区域:
Ca/A [anon:libc_malloc] - 堆内存
这是什么: 这是由 C/C++ 运行时库(如 malloc, new)管理的堆。用于动态内存分配。
SO 的关系: SO 的代码本身不存储在这里。但是:
SO 中通过 new/malloc 创建的对象实例、数组、数据结构都存放在这里。
这是GG修改器最常搜索的区域,因为游戏数据(生命值、金币、装备属性等)绝大多数都以动态分配的对象形式存在于堆中。
Xa内存 / 文件映射区域 - SO 代码的真正所在地
这是什么: 这是 SO 文件的 .text(代码)和 .rodata(只读数据)段被映射的地方。
位置: 在 64 位系统中,这通常位于虚拟地址空间中一个特定的范围。你可以通过查看 /proc/<pid>/maps 文件来精确看到。
属性: 这段内存是 只读 (r--) 和 可执行 (--x) 的。这意味着你可以从这里读取机器指令并执行它,但不能直接修改它。
对于修改的意义: 如果你想修改游戏的逻辑(例如 Hook 一个函数),你需要找到这个区域中特定函数的地址。
Cd/Cb内存 - SO 的全局变量
这是什么: 这是 SO 文件的 .data 和 .bss 段被映射的地方。
属性: 这段内存是 可读写的 (rw-)。
内容: 存放 SO 中定义的全局变量和静态变量。
对于修改的意义: 如果游戏将某些关键数据(如单例模式的实例指针、全局配置)存储为全局变量,那么它们就可能位于这个区域。这个区域通常比堆小,但数据地址相对固定。
|
-
查看全部评分
总评分:好评 +1
金币 +1
|