写在前面
逆向世界真的是无奇不有,万物皆可逆
做题的时候遇到了一个游戏的逆向题,涉及ue4的,刚好我也对游戏的逆向十分感兴趣,遂研究了一下
网上搜相关信息的时候,比较多的是开挂类的,主要介绍都是讲述如何对游戏开挂,实际案例大部分都是腾讯的游戏安全挑战赛
还有另一类,就是解包游戏资源拿flag的
1. ue4: pak解包
有些ctf题目,会把flag的图片作为游戏资源打包进行ue4的资源包(通常名称为xxx.pak
)中,但是一般情况下xxx.pak
是加密后的文件,要想查看里面的资源,就需要进行解密。这里提供一个动态调试拿到加密密钥的方法(ue4.27,即ue4的最新版本,pak文件加密使用的是aes算法)
1.1 工具一: UnrealPak(解包工具)
1.1.1 官方获取
UnrealPak是epic官方(即ue4开发者)提供的官方解包工具,我们可以通过注册epic账号,下载epic games
客户端,然后下载ue4.27.2
最新版本,下载成功后界面显示如下:
随后进入你选择的
ue4
安装目录,搜索unrealpak
执行解包命令如下:
unrealpak.exe <PathToPakFile> -Extract <ExtractPath> -cryptokeys=<PathToCrypto.json>
<PathToPakFile>:你要解包的 .pak 文件的路径。
<ExtractPath>:你希望解包内容存放的目录路径。
<PathToCrypto.json>:包含解密密钥的 JSON 文件的路径。
#hint: 最好都用绝对路径(我之前有用过相对路径,出了一些问题)
1.1.2 非官方获取
如果你觉得为了做题下一个epic games
还有ue4引擎太狗屎了,这里有非官方下载链接:
https://github.com/allcoolthingsatoneplace/UnrealPakTool
但是需要注意,该链接下的unrealpak
缺少oodle
压缩算法插件,导致解密时,有的资源文件是用oodle
压缩的话,就解压不了了。
这里提供另一个哥们的链接:
https://github.com/Punpude/UnrealPakTool/tree/UnrealPak_4.27_with_Oodle
1.2 ueviewer
ueviewer顾名思义,其实是解包你的pak资源文件后,让你查看其内容的工具,这里推荐
https://www.gildor.org/en/projects/umodel
另外一个github项目好像star数也挺高的,可以参考一下:
https://github.com/jashking/UnrealPakViewer
1.3 动态调试游戏获取aes密钥
1.3.1 获取ue源码
可以向官方注册账号,关联github账号,然后申请源码,然而感觉关联github账号太麻烦了,有一哥们公布了源码:
https://github.com/AlexMercer-MA/UnrealEngine-4.27
获取源码的目的是查看解压pak包的时候用了哪些函数,有哪些特征,这对于我们逆向和动调非常有帮助.
获取源码后,我们可以查看ue4相关的解密代码
首先可以看一下FPakFile::LoadIndexInternal
函数,就是这个函数负责解密解压pak文件,并设置物体。
FPakFile::LoadIndexInternal
会调用FPakFile::DecryptAndValidateIndex
,继而调用DecryptData
函数,调用FAES::DecryptData(InData, InDataSize, Key)
函数,执行解密逻辑
这里可以看到关键词
No valid decryption key specified
,总之,动态调试如果分析到了这个函数,那么我们大概率可以获得key的值(其实就是个aes256解密的密钥).
1.3.2 搜索相关特征
在分析ue引擎的exe文件时,可以通过搜索 No valid decryption key specified
快速定位到DecryptData
函数,但是可能有坑:字符串既有可能是单字符字符串,也有可能是宽字符字符串(ida的string栏里搜不到,得做点其他设置)
但是,如果你是通过x64dbg
进行动态调试,我们能够全局搜索字符串 No valid decryption key specified
(该场景下,能够同时搜索出单字符字符串和宽字符字符串)
1.3.3 动调拿key
这个就简单了,你搜索到这个字符串所在的位置,在即将调用DecryptData
函数时下断点,即可拿到加密密钥。
接下来用1.1节的工具进行pak文件解包,1.2节的工具进行查看即可