【干货】如何使用CE进行游戏逆向?14:数据结构解析

文摘   社会   2025-01-07 00:01   广西  
我们来谈一下解析数据结构的工具。首先,让我们提出一个问题:如果数据不会发生变化,我们该如何查找呢?之前我们找到的数据,如子弹数量和生命值,都是我们可以随时控制并观察其变化的。但是,如果有些数据,比如阵营,我们无法控制它何时发生变化。因为阵营通常在进入游戏后就被固定下来,除非重新进入游戏或者在某些特殊情况下进行换边。
在没有这种特殊机制的情况下,阵营就不会发生变化,这让我们陷入了一个进退两难的困境。如果我们要让它变化,就必须退出游戏重新进入,这会导致地址和数值的变化,难以继续搜索。或者,如果我们不退出游戏,阵营又不会发生变化,好像所有的途径都被堵死了。
那么,我们应该如何处理这种情况呢?让我们以阵营为例。阵营是人物的一个属性,因此我们可以从人物入手。首先,我们找到自己的生命值,然后进行访问查找。如果我们让生命值发生改变,再进行一次访问查找,就能够找到与生命值相关的代码。接着,我们与友军和敌军交互,再次进行查找,就可以确定与阵营相关的地址。
我们在这个工具中选择对数据结构进行解析,然后将我们的地址双击打开,并将其复制粘贴到第一个分组中。接着,我们给地址减去一个EC。为什么要减去1C呢?因为这是我们的生命值地址,我们需要减去一个生命值的偏移才能到达结构体地址的位置。然后,我们再添加一个新的地址,选择文件,将友军的地址复制过来,减去一个C。同样地,我们处理敌人的地址,创建一个名为"enemy"的新分组,将地址复制并减去一个EC。完成这些步骤后,我们可以关闭该工具。
现在,我们已经将地址全部添加进来了。接下来,点击"结构",选择"定义新结构",并为其命名。勾选"字段类型"后,我们可以根据游戏的大小和了解程度填写一个大小。例如,对于我了解的这个游戏,我填写了一个十进制的2048。点击"确定"后,工具列出了许多数据。为了方便大家查看,我调整了字体大小,但可能会显得有些混乱。
下面,我会解释一下不同颜色代表的含义:绿色表示相同,红色表示不同,蓝色表示组之间相同,粉色表示组之间不同。这些颜色的含义可能让你感到困惑,但我会解释清楚。因为我们的目标是找到阵营。
因此,我根据阵营将自己和敌人进行了分组。其中一个地址代表我自己,另一个地址代表我的其中一个友军,因此我们两个在同一个分组里。由于我们阵营相同,而这两个地址都代表我们的敌人,所以他们和我们不在同一个分组里,这是因为阵营不同。而我们要找的正是阵营,对吧?那么我们要找的是什么颜色呢?是组之间不同的那种颜色,记得我说的是粉色吗?所以,这些地址有可能代表我们的阵营。
接下来,我们再从程序的角度来思考一下。如果你是一个程序员,你会用什么样的数据来描述双方的阵营呢?如果是我,我很可能会用0和1。因为这个游戏只有一个红方和蓝方,用0和1正好可以区分。当然,也可能使用其他整数,比如0和10,或者1和20等等。但这只是一个猜测,我们几乎可以确定他不会使用浮点数来表示阵营。在游戏开发过程中使用浮点数来表示阵营会很不方便,因此几乎可以排除掉这些浮点数。所以,你可以忽略那些带小数点的数据。
这些数字看起来确实非常大,对吧?很显然,它们都不太像阵营。而这个C稍微有点像,但是又有一个80000C,所以我觉得它也不太可能。像这些的话,一看就不像。
然后我们再往后找,看看还有没有类似粉色的。哦,这里有一个,你看到了吗?这个30C的位置看起来很符合我们的猜测,对吧?友军是0,敌军是1。所以我们可以把这个地址当作是一个阵营的偏移。暂时就认为它是30C。
也许有人会问,如果有很多类似0和1的地址,它们都符合我们的预期,怎么办呢?那你可以添加更多的地址。比如,你再添加三个友军,然后再添加三个敌军,看看它们是否都符合这种规律。如果所有的敌军都是1,所有的友军都是0,那就说明这个地址可能也可以当作阵营来用。这是一种方法。你添加更多的数据,只要它们都符合规律,你就可以使用它们,无需在乎它们最初是用来表示什么含义的。
第二个方法是逆向这个游戏的代码,找一些与阵营相关的调用。然后看一下这些调用使用的是哪个偏移。这种方法最准确,但对大多数人来说可能有一些困难。所以,我们可以先使用推测的方式,找到一个最像的偏移来使用。如果在编写代码的过程中发现这个偏移有时正确,有时错误,那么你就需要查找真正的阵营偏移是多少。这个方法不仅适用于寻找阵营,还可以用来找其他不变的数据。
比方说,这个就是我们的坐标,对吧?这个是坐标。然后这个EC是我们的血量。找一下ECEC是血量,对吧?十一七十八七十八七十八。还有比方说你往后拉可以找到他们的名字。看这个。这都是玩家的名字。看好了吧?所以说这个工具,你要是用好的话,也可以在这里面找到更多更有意思的数据。这就有点类似于我们之前说过的那个浏览内存区域。但是浏览内存区域,它没办法帮我们去推断这个类型。而这个地方,它不光可以推断类型,还可以很方便地我们去比较不同对象之间的差异相同或者不相同。
然后再说一点,就是他这个推测的类型,你不要永远去相信他,因为他很可能推测是错误的,甚至包括这些指针。你也可以直接去点击,去查看这些指针里面都有什么东西。这些你们就自己去研究吧。
其实还有一个专门的工具叫做RECLASS,这个东西老外也是很常用的。它就很类似于我们这个工具,只不过它是专门做这件事情的。这个只是C中的一个小工具。有兴趣的话,你们就可以去了解一下这个RECLASS。如果不想了解的话,就用CE这个功能其实也挺强大的。那么本期教程就到这里。


暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章