memory - 在现有程序中查找和使用内存偏移量?

标签 memory automation reverse-engineering

大多数游戏机器人应用程序使用他们为特定版本的游戏客户端找到的一系列内存偏移来促进机器人。它们可能具有健康状况、x/y 位置等的内存偏移量。每次游戏发布更新时,bot 程序使用的各种信息的偏移量也必须重新找到并更新。

我有兴趣编写 Solitaire bot 作为宠物项目。如果你看这里,mmoglider(一个商业机器人)已经完成了这个,作为他们机器人程序(通常用于机器人魔兽世界)的演示:YouTube video of MMOGlider botting Vista Solitaire.

准确定位各种有用的内存偏移量的常用方法是什么?我如何才能在纸牌程序中定位指向“甲板”的内存偏移量并使用它来确定堆栈上有哪些牌?我从滑翔机人员的经验中知道,一旦他们能够找到甲板本身的偏移量,他们就会说整个甲板的每张牌值都在那里。

那么,有没有人有任何逆向工程和从现有程序中提取内存偏移的经验?一旦你有了这些偏移量,如何能够从内存中的“甲板”结构中提取和读取值?

最佳答案

通常有两种方法可以完成此类任务。为简单起见,让我们考虑一个游戏,玩家的“健康”为整数。

第一种是在程序运行时操作进程内存。这有利于查找已知值。当您在游戏中有 100 点生命值时,在内存空间中搜索 100(很可能是整数)并记录找到的每个位置。然后,当您的健康状况更改为 99 时,交叉搜索相同的位置以查看哪些位置发生了适当的变化。继续,直到您缩小了健康变量的精确位置。在大多数现代游戏中,您实际上会找到一个动态分配的内存地址,它是结构的一部分。该结构将由程序内的指针引用,然后您必须在程序内存中搜索可能是指向健康变量附近空间的指针的值,并在多个游戏运行中重复缩小范围以建立指向所需数据的指针的位置。这是对经典 PC 和主机游戏最有用的方法,尤其是任何内存空间小且易于操作的游戏。

第二种方法要求您反汇编应用程序二进制文件(为此我使用 IDA Pro),然后找到已知的函数来使用您想要的数据。例如,假设您在屏幕上看到“健康:99”。在二进制文件中搜索“Health:”字符串,然后找到对该字符串的引用(您可能会找到对 sprintf 或类似的调用)并查看这些相同函数引用的其他内存位置,这通常会引导您找到“health”变量或包含它的结构。这是更现代的游戏中最常见的方法,具有大量内存空间和更高级的编程实践。

关于memory - 在现有程序中查找和使用内存偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/418893/

相关文章:

C - 释放数组内的指针

assembly - 想要在程序集中以空终止字符串,但出现段错误

python - 如何在ansible playbook中使用正则表达式排除单词?

java - 如何检测堆外Java应用程序中的内存泄漏?

c++ - 标准对成员变量声明的顺序有何规定?

android - UiAutomator -- 将小部件添加到主屏幕

javascript - 如何验证输入 150 个字符后文本区域中是否出现滚动条

winapi - Discord如何挂接到特定进程的音频中?

javascript - 选择Pinterest上的所有图像以移至另一 block 板

c - radare2:r_reg_get:断言 'reg && name' 失败(第 296 行)