通过代码从公共地址更改地址

逆向工程 部件 调试 记忆 十六进制
2021-06-27 22:28:22

我跟踪了一个使用基地址和偏移量的静态地址。

我对这个地址很感兴趣,因为“找出该指令访问的地址”显示值,作为对填充的库存空槽的反应而改变,反之亦然。当我从库存中主动删除/添加项目时,我正在寻找的地址仅显示由我的静态地址更改,因此更改了它们各自的地址值。

地址如下:

代码:NexusTK.exe+E0820 - 66 89 48 06 - mov [eax+06],cx

当我添加地址时,它总是指向代码中的地址:004Exxxx

范围。

但是,我的静态地址随其代码更改的地址始终在代码中:55xxxxxx

范围。

是否可以通过读取内存/偏移量计算或通过我不知道的某种关系来访问访问地址?

如果有帮助,我可以链接到调试器的图像。

奖励:当我选择整个函数检查第一个地址及其代码更改的内容时,所有库存槽更改都可以通过 1 个地址访问。我也尝试过指针扫描,但是在重置指针后过滤掉旧结果中的进程时,搜索已经第二次使用了 0 结果。

2个回答

那里的第一条指令 (NexusTK.exe+E07E0) 获取函数的第一个参数([esp+04] 通常代表函数的第一个参数)并将它放在 EAX 中。但是,该 EAX 与您稍后在 NexusTK.exe+E0820 中看到的 EAX 没有直接关系。

如果您想阅读或操作清单的内容,您将需要获得一个指向它的指针。此时尝试指针扫描总是值得的,但对于大型游戏来说,这往往不会成功。另一种选择是分析该函数(从 +E07E0 到 +E0827 读取)以找出它如何获得指向库存的指针。例如,您截图中的函数调用位于 NexusTK.exe+BF220 的另一个函数,然后使用返回值(寄存器 al)作为位于 ESI+0x163C38 的字符清单的索引。您可以通过简单地阅读汇编代码来了解这一点(您可以在此处找到一个不错的汇编教程)。一旦你分析了这个函数,你就可以钩住它(用你自己的代码替换它的代码,看这个问题),或者您可以调试更多以尝试找到指针扫描错过的静态指针。

请注意,角色清单的内容不太可能以字符串形式存储 - 它更有可能存储为字节数据数组(代表项目的数字)。实际上,您可以从屏幕截图中的汇编代码中看到,每个库存项目似乎都由大小为 0x1F8 字节的结构表示(注意 +E080B 处的乘法),并且可能可以通过偏移量 +2 处的 2 字节 ID 进行识别或 +6(这些是在 +E081C 和 +E0820 处填写的字段)

我发现对于在游戏中查找库存非常有用的东西如下。

清空你的库存。在作弊引擎中搜索所有 0。将物品放入库存。搜索所有 > 0。清除该插槽。搜索 0。冲洗并重复。很多时候,您可以通过这种方式找到指向表示项目的结构的指针。确保每次添加和删除时都使用相同的物品栏位,最好是第一个栏位。

然后您可以从那里尝试在该数据结构中查找名称。

此外,一旦拥有该指针,通常需要进行指针扫描,因为它可能是动态内存。

此外,如果游戏经常更新,那么对引用该指针的函数的 sig 扫描也很有用,因为它比指针扫描更持久。