UE4游戏从何下手?

已知U3D类型的游戏,可以参考大佬的帖子:膜改一下旅行的蛤--iOS Unity3D 游戏修改实战 对游戏进行分析和修改,核心点是可以使用 IL2CPP来恢复符号,简化分析难度。
那么问题来了,UE4的游戏不能使用如上套路,分析的时候只有一些零星的c++类名,这种游戏应该如何入手进行分析,只能开IDA硬看吗?

2 Likes

UE4有蓝图,根据游戏开发时候的实际情况,或多或少会保留一些原始的名称。
我如果是你的话,会下载编译UE4,写个shipped编译的demo来看有哪些符号可以还原,当然你想像il2cpp那样恢复符号是不可能的了,il2cpp有完整的符号表是受限于C#的语言性质,为了实现运行时反射而保留的。
主要还是时间隔得太久了,细节已经忘得一干二净,几年前我写过类似的东西,可以还原UE4 Rpc replicate中的类名和字段,当然你也可以去github上找找相关的项目,还是挺多的

顺便搞清楚自己的目的,到底是想从什么角度去攻击这个游戏。
无论是什么引擎写的游戏,完整逆向是不太现实的事情。
如果是改数据的话,一般拿到UWorld指针就可以找到其他的UObject了,这部分可以直接参考UE4的源码,甚至挂着CE乱搜一通都可以达到目的。
如果你跟我当时的目的一样,是想研究它的网络RPC,我觉得才有必要花心思去还原那些字段

目的简单的说就是要改游戏内存数据(代码段或者数据段)。
Windows上分析这些游戏只要能过掉保护,架上CE+OD,问题不是很大,过保护的话就八仙过海各显神通了。
其实现在的主要问题是,iOS端除了LLDB以外,其他能比较快速的分析工具基本没有,这种情况下,如果需要攻击某个游戏,看起来只能从汇编层走起?正如你说的,要完整逆向基本不现实,在这种情况下,又有什么好的思路呢?

补充下,之所以问这个问题,主要是因为前几天遇到一个iOS端游的WG,简单看了下流程,不是很复杂,但是很好奇作者到底是如何找到修改点的,正常情况下,他肯定会遇到上面说的问题,我琢磨了半天一头雾水,太菜了。

其实就我自己的攻击经验而言,猜测攻击者如何找到修改点还是蛮困难的,有时候我都不知道我怎么就找到了关键的地方,甚至是因为作者刻意的去保护关键的地方,反而导致攻击的一方找到突破点。
游戏的话,还是从引擎下手,你对引擎越熟悉,修改它越容易,特别是UE4这种开源的引擎,看看源码总没坏处的。
至于修改点嘛。。。你看看他实现的是什么功能,估计还是对引擎足够熟悉,所以很快就找到了自己关心的东西。

就好比il2cpp吧。之前这些人只是找找符号,静态修改或者hook对应的函数,现在外国佬已经上升到对il2cpp runtime的注入了,而且一定程度的无视更新,比如VRC这款游戏,不但il2cpp了,而且符号名称全部混淆,这些人硬生生的给这个游戏添加了一大堆功能,比如原生的游戏菜单,透视这类更不用说了,更是读取到了一堆不应该被看到信息

1 Like

:rofl: 主要还是想知道他们开发功能时的分析过程,学习思维,奈何大佬都是拥技自重啊。你这么说,我更是好奇了。。。。完了。

看了你们聊了那么多,咋感觉 你这是在 探讨,怎么找数据呢…

都是搞逆向的,既然找数据的话,肯定从汇编层考虑,比较实际。。。因为这是根本…

咱就不具体探讨对哪些具体功能了…只说写方向性的东西。

1,我想问,你会开发 简单的 UE4 小游戏demo 么?
UE4里的蓝图啊,对应的都是c++代码…如果你要知道UE4 代码执行流程的时候,那么你就需要去分析UE4 的 代码调用流程…然后你就可以轻松定位到,某个功能会调用某个函数…
既然知道了函数,那么必然就有游戏数据,就有游戏业务逻辑。。。所以,你可以在关键的jmp处,魔改成你希望的样子

2,当你不想深入理解UE4 引擎的原理的时候,你可以去大概的了解 UE4的设计理念。比如:世界指针,对象指针…以及和他们相关的结构体…这样,你就能拿到你想要的 数据,当然,还有方法了。同样…拿到数据和方法,然后分析方法的业务逻辑,你就可以在你想要的地方,魔改了

3,回到内存级分析来看。任何以后游戏,都需要有内存,你可以遍历到 你要的 信息的地址…然后通过动态调试…或者 IDA 的静态分析…最终能定位到 你需要的 某句汇编代码…此时,方法函数,你就拿到了…同样深入分析函数的 业务逻辑,你可以随意魔改了

4,api层的…这个怎么说呢…如果你读写文件,保存文件,肯定与 该系统下的 readfile,writefile 类函数相关…直接对这些api 下断点…然后通过堆栈回溯…找到你需要的 函数,分析函数业务逻辑,最后魔改…

所以说来,切入是啥,是拿到这个功能后,你觉得去怎么开发:
(a):只用 c/c++,你会怎么实现?
(b):用 UE4 框架,你又会怎么实现?
…当你有自己的实现方案后,就可以根据你的方案中需要的api ,到 UE4 游戏中 下断点… 然后拿到关键函数
(c):还有消息循环机制…你同样,去hook 消息循环的分发,拿到 每个消息的响应函数…

对逆向的咱们来说…程序本质就是 汇编 ;
对游戏来说,95%以上都有个消息循环…
而对功能是来说,肯定需要系统的某些api的支持;
当然对特定框架来说,肯定有他的一套运行流程…暂时归结为框架的原理吧…
对界面显示而言,肯定有内存与之对应…
对内存而言,肯定有函数对其读写…
以上 都是我们的 出发点…

举几个最简单的例子来说…
a,游戏的人物走路…他必然有个 时钟来控制 人物走一步的时间…
加速,减速…可以通过去魔改时钟 的间隔来实现
b,游戏里的打怪,必然和 玩家 对象以及怪物对象相关
c,游戏的透视,必然和 渲染有关。。。如果数据都在本地。。他肯定有先渲染哪个,然后用另外一个覆盖前面的。颠倒他们的渲染顺序…那么不就是透视么
d,秒杀怪物,肯定和怪物的状态,或者血量有关… 不同的游戏,怪物死亡的设计不一样
e,而无敌呢…要么是hook 减血函数,要么是改变 被攻击的检测

5 Likes

楼上的dalao基本把常见的切入点都提了一遍,实际上确实是考察逆向功底和对引擎的熟悉程度。
主要还是对引擎熟悉也好,会挂上内存修改器瞎搜也好,像fps这种,数据在本地,切入点实在太多了。
对于未知的游戏引擎,确实考察逆向的功底以及对相关知识的熟悉程度。
对于已知的游戏引擎,哪怕只懂一点逆向,只要对引擎足够熟悉,也可以找到自己想要的东西。
主要还是原理性的知识。。。
现在的游戏一般不会自写引擎,所以想知道他们的攻击思路,最好还是自己写几个demo或者找没有保护的单机游戏去hack,不同的功能实现,难度也不同,可以从最简单的修改游戏脚本,到后面绘制人物骨骼,都自己研究下。

大佬洋洋洒洒说的挺多的,很感激。

很多论点在理论上我都很赞同,分析流程上也没有问题,但个人认为在实际操作起来非常有难度,特别是对移动端游戏。

比如:
1.看编译好的游戏汇编,并不能知道某个函数是什么功能,就算对着源代码看,某个函数在汇编里面是到底是哪一个也不知道,因为没有符号,也就不存在知道UE4源码会调用什么函数,然后下断点来看的问题。有可能有大佬可以顺着C++类名和内存结构去分析各个函数的偏移,但是也不是那么容易的事情。
2.正如上面说的,Windows平台上可能有非常多工具可以用,要调试也相对简单,但是移动端(这里只说iOS,安卓好歹有模拟器),各种工具相对匮乏,这种情况下上面说的很多方案效果都不好。

不知道是不是我本身没有UE4游戏开发的经验,导致我走入死胡同,会UE4开发以后,就如大佬说的相对简单了? :joy:

请大佬调教。

本身不是搞游戏开发的,所以没花太多时间在学习UE4开发上,后面抽点时间看看,不知道难不难。

我知道肯定有方法,不然WG样本对方不可能开发出来。只是以自己目前的知识水平触碰不到起点,一头雾水。

看编译好的游戏汇编,并不能知道某个函数是什么功能,就算对着源代码看,某个函数在汇编里面是到底是哪一个也不知道,因为没有符号,也就不存在知道UE4源码会调用什么函数,然后下断点来看的问题。有可能有大佬可以顺着C++类名和内存结构去分析各个函数的偏移,但是也不是那么容易的事情

这个我一开始有说,如果要针对实际的问题,就要具体问题具体分析,当年因为吃鸡的火爆,国外的大神们纷纷研究UE4,为后人开辟了道路,当然也要感谢UE4是开源的,我也写过类似的东西,是个ida脚本。
你可以看看下面的项目以及类似的东西:


最早我多多少少参考了一下这个,只是时间太久了,以至于我自己都什么都不记得了,多数写外挂的也是用这个来生成“SDK”用来找数据。

这个是我刚刚找到的。
游戏引擎既然能做到跨平台,说明只要搞懂了原理,就可以横向移植的,只是不同平台的实现略有差异,兼容IOS是没问题的,因为我确信有人用了同样的方法去分析android的UE4游戏的。
上面我们只是讨论一下常规的思路,围绕“如何找到切入点”,但没具体到实际问题,解决实际问题的过程中,大概会打消你的疑虑吧
1 Like

感谢大佬指明道路,膜。

UE4 最主要还是找对象,而且都是有名字的,可以通过搜字符串得到。根据其引用就可以找到对应类的构造和虚表,就可以利用对象调用各种功能了。

有可以练手的UE4 App么