我正在使用作弊引擎和OllyDBG反转游戏,通过该存储器读取并监视FPS游戏中的地址,这些地址将包含敌人的坐标(xyz)。

我的目标是找到一个地址或模式,该模式或模式可以让我最多循环32个敌人,以读取其所有坐标,为此,我一直试图在每个地址之间找到一个模式而没有运气。我已经能够收集3个不同的敌方地址,该信息很有用,但是搜索32个地址是一项任务,需要比我认为必要的更多努力。

如上所述,我可以访问前三个敌人的住所,如果可以从这些信息中找到答案,可以通过作弊引擎或其他逆向工程软件追溯到基地,那么这一过程将是值得赞赏的。

我的问题是,有没有办法发现从内存中的一个地址中获取一个指针数组,例如,如果我有3个敌人坐标,我可以以某种方式将内存位置追溯到一个访问所有32个敌人地址的地址,无论是使用作弊引擎还是其他反转工具。 br />

评论

您可以指定您已经了解的结构吗?简单的坐标数组?复杂的数据类型?你知道使用的语言吗?

#1 楼

(OP并未指定他是否知道结构的布局。看起来他认为结构并不复杂。我将通过假设结构有些复杂来回答一个更笼统的问题,以避免局部性问题)

几乎没有找到其他结构的方法:

扫描内存中的签名

一旦有了一些结构示例,也许是找到结构的最简单方法其他结构实例是在所有三个结构中找到匹配常数。有些值可能是常量,代表了在继承的更高级类中应用于所有敌方实体的属性。



这很容易
,一般情况下,它应该在程序重新启动后仍然存在,您无需在每次运行游戏时都找到这三个结构。

缺点:


不那么健壮。在不同的版本之间,某些东西可能会发生变化,您认为恒定的数据实际上在某些情况下可能会发生变化,而您并未查看过。

指针搜索

在某个地方可能存在指向每个实体的指针。您可以轻松地在内存中搜索找到的结构的地址,并检测包含所有实体的阵列/结构。您还可以遍历在结构本身中找到的槽形数组,也可以查看链接列表。



易于实现。
将比以前的方法更健壮。

缺点:


您仍然需要以某种方式找到第一个实体。

查找构造函数/类似构造函数的函数

无论是面向对象的语言(如C ++或ObjC),还是过程语言(如C),都必须有一个初始化结构的函数。通常很容易找到-分配对象后调用的第一个函数,非常有特色的汇编-主要是初始化代码。

如果我们在谈论OO代码,则查找虚拟函数表或类似的构造将使您轻松找到构造函数,遍历继承并查找至少一部分操纵函数。

之后您获得了构造函数,就可以轻松获取所有分配,并查看将指针保存在何处。



相当健壮
更好地理解有关如何将实体保存在内存中的信息。

缺点:


静态RE。通常很难做(获得一个好的反汇编程序)

反转结构

这需要更多的反转工作,但是会让您找到搜索的最佳方法对于实体。使用Cheat Engine和IDA,手动映射结构,元素/成员,操纵该结构的功能。

如果涉及任何指针,请跟随它们并反转遇到的其他结构。

优点:


稳健
做自己想要的事情的正确方法。真正了解发生了什么。促进未来的能力/特征。

缺点:



更多的工作,更难做。很多RE。

注意

至少我提到的一些方法在分析程序时找到指向所有实体的指针可能只是第一步。您可以搜索对列表本身的引用,并获得在每次重新启动程序时自动查找实体的更好方法。这消除了一些缺点。

#2 楼

首先找到您要查找的地址。然后循环执行此操作:


查找基(记录的开头)。
剖析此周围的内存以识别数组或链接列表。
搜索内存

示例:

扫描参数以查找地址30000032

找出该记录的基础是30000000

正在检查内存-没有花哨的地方。

找到指向20000004的基址的指针。

找出记录的基址是20000000

正在检查内存-仍然没有......

10000008处找到指向基座的指针。

找到基座是10000000

检查内存-指向我要查找的对象的所有指针之间的距离均为12个字节。 (显然这是某种集合。)

最后一次内存扫描以查找指针,以确保我在0000040处没有错。它:集合中对象的数量。

几次重新启动游戏/计算机,找到指向该地址的一致指针。

喝啤酒以奖励自己

如何找到基准:我喜欢使用“指针扫描”,并检查最后一个偏移量。从最常见的内存中最小的通常是正确的。

有时,我试图在分配的内存的开头查找一条记录,在这种情况下,我确定某些基础。

另一个技巧是在内存中一个接一个地查找两个,确定它们的“最大大小”,这意味着内存中的基数不得超过该数字。 />如何识别集合:大多数集合都是极度组织的,具有特定的偏移量,或者具有指向相同类型对象的指针。

如果您有:

Pointer to Player 1 data,
4 Bytes
4 Bytes
Pointer to Player 2 data,
4 Bytes
4 Bytes
Pointer to Player 3 data


它应该响铃。

请记住,这种对齐方式可能会在源中随机发生,因此请尝试搜索:播放器3数据,播放器3数据+/- 4,播放器3数据+/-8。

如果您会发现类似这样的东西,您很可能真的很亲密。

这对我有用,希望对您也有用。