5

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

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

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

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

4

1 回答 1

10

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

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

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

于 2009-01-07T02:17:05.717 回答