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

问题描述:

大多数游戏僵尸应用程序使用一系列的内存偏移量,他们已经发现该特定版本的游戏客户端以便于使用。他们可能会在健康状况,x/y位置等方面存在内存偏移量。每次游戏发布更新时,bot程序使用的各种信息的偏移量都必须重新找到并更新。查找和使用现有程序中的内存偏移量?

我有兴趣将Solitaire bot作为一个宠物项目。如果你看这里,mmoglider(商用机器人)已经做到了这一点作为他们的马胃蝇蛆程序的演示(通常是用来BOT WOW):YouTube video of MMOGlider botting Vista Solitaire.

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

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

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

第一个是在程序运行时操作进程内存。这对于找到已知的值很有用。当游戏中有100个健康状况时,搜索内存空间100(很可能是一个整数)并记录找到的每个位置。然后,当您的健康状况变为99时,请在相同的位置进行交叉搜索,查看哪些地方的适当变化。继续下去,直到你缩小了健康变量的确切位置。在大多数现代游戏中,你会发现一个动态分配的内存地址是结构的一部分。该结构将被程序中的指针引用,然后你必须在程序存储器中搜索可能是指向健康变量附近空间的指针的值,并在多次游戏运行中重复缩小过程以建立指向您想要的数据的指针位置。这是对经典PC和游戏机游戏最有用的方法,特别是任何存储空间小且易于操作的游戏。

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