1.UE相关杂项笔记
2.UE4 Pak 加密与解密调研
3.虚幻4(ue4)引擎加密pak解包教程(初学者向x64源码逆向)
UE相关杂项笔记
UE引擎的游戏源码源码相关知识整理如下:
1. Pak包解析:在UE4中,通过在CMD控制台输入"D:"Epic Games"\UE_5.1\Engine\Binaries\Win\UnrealPak.exe" 包路径 -list"(注意空格需加双引号)来查看Pak包内包含的解包文件。解包工具路径位于UE引擎安装路径的手游相应文件夹内。
2. 清理缓存与修改路径: UE5的全套默认缓存位于"C:\Users\"用户名"\AppData\Local\UnrealEngine\Common\DerivedDataCache"。要修改缓存路径,游戏源码源码需定位到UE_5.1\Engine\Config\BaseEngine.ini,解包商用源码风险替换相关路径。手游
3. 番茄助手功能:Visual Assist X中,全套快捷键如Alt+O用于切换.h和.cpp,游戏源码源码Shift+Alt+O查找定义,解包Shift+Alt+G查找继承链等。手游更多快捷键请参阅相关博客。全套
4. VS自动对齐:在VS中,游戏源码源码使用Ctrl+K+D或Ctrl+A+Ctrl+K+Ctrl+F可实现代码的解包全选对齐或部分代码对齐。
5. 蓝图间通信:通过执行控制台命令函数实现不同蓝图间的手游通信,例如在关卡蓝图中使用特定事件名。
6. 打包后的模拟触摸:Window打包成exe后,添加-faketouches参数可模拟移动端触感。
7. 基础UEC++知识:包括设置颜色和透明度、3d蹦迪unity源码正确引入Windows头文件等。
8. UMG问题:ScrollBox在出现滚动条后,鼠标右键点击事件可能失效,需取消勾选"允许点击右键拖动滚动"选项。
9. 编辑器语言设置:确保勾选"使用本地化数字输入"和"使用本地化属性命名"来解决中文显示问题。
. 物体高速移动问题:通过修改抗锯齿设置为TAA,可以解决运动残影问题。
. ScrollBox子项Button的交互:在Touch Method中设置为Precise Tap,避免Button在滑动中被选中。
. 项目报错处理:通过VS输出窗口查找错误资源路径,或在引擎源代码中设置断点进行调试。
. 编辑器操作问题:在编辑器设置中调整"播放-游戏获取鼠标设置"以改善鼠标交互。
. 引擎工具笔记:涵盖引擎工具的使用和维护。
. 后期材质问题:解决postprocess材质闪烁问题,可通过调整抗锯齿设置来优化。
. 报错解决:确保静态函数库中不包含WorldContext输入,重启项目即可避免"Ensure condition failed"报错。
. 绘制多边形:参考割耳算法和相关视频教程,源授权最新版源码如细思实验室的分享,创建绚丽多变的项目效果。
. HTTP响应问题:对于"invalid HTTP response code received"警告,需要排查虚幻引擎与网络请求的兼容性问题。
UE4 Pak 加密与解密调研
(题图来自于: cybernews.com/resources...)
前言
近期需要处理一下项目的反破解问题,所以对 UE4 Pak 的加密解密方式进行了一下调研。本文总结了一下关于互联网上常见的 UE4 Pak 破解方法,结合简要的代码分析,提出了一些关于加密的修改建议,并实现在所在项目中。有兴趣的同学可以参考一下,应用到自己的项目上。
阅读本文需要对以下知识点有一定的了解:
另外本文中使用的 UE版本为 4..2,其他版本应该也不会有太大的差异。
UE4 Pak 加密解码代码分析加密算法概述
UE4 中使用的 Pak 加密算法默认使用的是 AES 加密算法,AES 算法是一种对称加密算法,在数据量较大的时候也能保持较高的性能。但是多国语言互助系统源码缺点就是加密解密都必须使用相同的秘钥,这也就给了 Pak 破解留了一个很大的空子,后面会详细介绍如何利用这个空子来进行破解。关于算法的详细算法,本文不会介绍,可以参考最后一节参考文档里面的参考资料。
Pak 在 UE4 中使用的代码来源于一个 开源的 Rijndael 实现,在 AES.cpp 的文件注释中,Epic 认为当前使用的算法过于简单,在秘钥未知的情况下依然有一定的数据泄露风险,建议使用 CryptoPP(Crypto++, cryptopp.com/) 的实现。注释内容我摘录在下面:
从参考资料中可以看出来,UE4 中的 AES 实现是其中最简单的一种模式,也就是 ECB(Electronic Codebook Book) 模式。这种模式没有对密文进行再处理和反馈循环,会导致一定的被主动攻击的风险。
首先分析一下涉及到 Pak 文件加密解密的功能,这样可以在代码中快速定位到其代码位置:
游戏运行期解密
游戏运行过程中,入侵检测粒子群算法源码对 Pak 文件解密的主入口在 IPlatformFilePak.cpp 的 DecryptData() 中:
可见其中判断了 CustomEncryptionDelegate,利用这一点,我们后面可以使用自定义的方式来拦截解密操作。代码的后半部分 else 是默认路径,会进入 AES 的解密函数。
UnrealPak 生成 Pak 时加密
在 PakFileUtilities.cpp 文件中,搜索 FAES::EncryptData,可以得到三个不同调用的位置,为在不同情况下加密的入口。
UnrealPak 验证/解压 Pak 时解密
对应的位置与游戏运行期解密的位置相同,但是在使用上的处理方式稍有不同,后文会介绍。
UE4 Pak 加密配置配置方法
配置方法可以参考 Packaging 官方文档 中的 Signing and Encryption 部分,配置如下图所示(原图来自官方文档):
一般常用的是其中的 Encrypt Pak Index,即只对 Pak 的索引区进行加密,这样既可以保护 Pak 不被解包,又可以保持较高的性能。
秘钥分析
配置完成后,秘钥会被写入 DefaultCrypto.ini 文件中,其中的 EncryptionKey 表示使用的秘钥,下面是一个例子
配置中使用的是经过 Base 编码后的秘钥,要查看原始秘钥,需要进行 Base 解码,在 Mac 下可以使用 base 命令进行解码。
原始秘钥不是ASCII字符,所以需要使用 od 命令将数据用 进制打印出来。可以发现秘钥长度为 bit。
Pak 破解方法分析破解思路
在参考资料中有两篇如何破解 Pak 的方法,其中的破解思路基本一致,大致如下:
网上有人做出了自动破解的工具,我尝试了一下没有成功,有兴趣的同学可以到参考资料小节中找一下地址。
破解结果
仿照着破解教程,我使用了一个测试工程,按照 Development 打包成 WindownsNoEditor 版本,然后使用 xdbg 进行调试。由于我的工程中带有 Symbol,所以相对来说会有一些代码上的提示,比反编译 Shipping 构建的工程要简单一些。
最后得到的结果如下图所示,上面的部分是我解码使用的秘钥数据,下面是 xdbg 的内存窗口,可以明显看到内存中的秘钥与使用的秘钥完全相同,破解成功。
这也就是为什么在上文中说,使用对称秘钥加密方法必然会存在的问题,无论如何都会在内存中解密,解密就会需要秘钥,所以只要有办法查看内存,就一定能发现秘钥的内容。
反破解思路
由于最终无论如何都要在内存中解密,所以秘钥是一定会出现在内存中的,反破解的关键在于以下三点:
其中 :
实现方案与结果实现方案
由于只有在 Windows 版本上才会有 Pak 被破解的风险,而且UE4自带的 CryptoPP 也只提供了 Win 版本,所以主要思路是:
根据上述分析就可以开始进行实现了,实现过程中注意以下细节:
本文不会提供具体的实现代码,按照上述分析,自己手动实现一下也非常简单。
实现后的测试结果
当三个平台均打开 Pak Index 加密时,使用各种情况对构建后的 Pak 进行解密测试:
可以看到,使用公版的 UnrealPak 已经无法解包使用 Windows 版本的 Pak 文件,但是依然可以解包 Android 和 iOS 平台的 Pak 文件,已经达到了我们要实现的目的。
最后补充一个小细节:CryptoPP 中的 AES 算法和 UE 中原本使用的 AES 算法是兼容的,如果使用了 CryptoPP 中的 AES 算法,也是可以正常解密使用 UE 中 AES 算法加密的 Pak 的。
参考资料
虚幻4(ue4)引擎加密pak解包教程(初学者向x源码逆向)
文章总结:看雪论坛作者devseed分享了使用虚幻4(ue4)引擎的x源码逆向进行pak解包的教程,针对非魔改版和未加壳引擎,以ue 4.为例,初学者也能理解。教程从观察源码、定位切入点、分析函数与找到密钥,到最后解包的步骤详细展开,旨在帮助读者理解加密pak文件的解密过程。
步骤1:通过关键字"decrypt"在源码中找到FAES::Key结构,确定了AES-加密。确保游戏版本与源码同步,避免源码修改导致不匹配。
步骤2:在FPakFile::LoadIndex函数中,致命错误的log成为解密关键,通过xdbg定位到"Corrupted index offset in pak file."相关代码。
步骤3:在反汇编中,通过函数参数和编译器优化的特性,尤其是Jump指令,追踪DecryptData函数,找到与加密密钥相关的数据结构。
步骤4:经过调试,确认FPakPlatformFile::GetPakEncryptionKey和FAES::DecryptData的调用,解密密钥即在rcx和r8寄存器中找到,通常为bit的随机数据。
步骤5:使用加密密钥解包pak文件,通过Base转换和UnrealPak.exe工具,配合crypto.json文件,实现pak文件的解密和文件转换。
最后,读者可参考相关链接深入学习,逆向分析技术在游戏安全和开发领域具有实际应用价值。