2025游戏安全技术竞赛-Android-初赛WriteUp
字数 2056 2025-08-29 22:41:24
UE4游戏安全分析与外挂对抗技术详解
一、环境准备与基础信息获取
1.1 工具准备
- Frida: 用于动态分析和Hook
- IDA Pro: 用于静态分析
- frida-ue4dumper: 用于dump UE4游戏的三件套
- D810插件: 用于反混淆CFF混淆的代码
1.2 获取UE4关键信息
使用frida-ue4dumper获取基础地址:
base: 0x764bd2f000
GUObjectArray: undefined
GName: 0x7656b1f7c0
GName偏移: 0xADF07C0
GWorld: 0xAFAC398 (通过字符串"SeamlessTravel FlushLevelStreaming"定位)
GUObject: 0xAE34A98 (通过字符串"Max UObject count is invalid..."定位)
二、外挂注入分析
2.1 ELF感染注入
- libGame.so通过修改libUE4.so的DT_NEEDED标签实现注入
- 分析步骤:
- 检查PHT数组中p_tag为PT_DYNAMIC的元素
- 找到d_tag为DT_STRTAB的元素获取字符串表偏移
- 找到d_tag为DT_STRSZ的元素获取字符串表长度
- 确认字符串表中包含libGame.so且DT_NEEDED条目中包含libGame.so
2.2 外挂启动流程
- libGame.so的init_array段调用初始化函数
- sub_27F0创建外挂线程
- 0x1B9C函数执行主要外挂逻辑
三、字符串解密技术
3.1 解密函数特征
- 第一个参数存放解密后的字符串
- 第二个参数是密文
- 前n个字节作为密钥,后面为密文
- 字符串长度在if条件中体现
3.2 解密方法
- 特征匹配:查找
^,%,if == n等模式 - 获取字符串长度和密钥长度
- 查找字符串函数的交叉引用
- 提取参数地址并用IDA API读取数据
- 复现解密函数进行批量解密
示例解密字符串:
0xB658 libUE4.so
0xB650 -
0xB648 r
0xB634 /proc/%d/maps
0xB620 /proc/self/maps
四、关键功能分析
4.1 获取libUE4基址(sub_B80)
- fopen打开/proc/pid/maps
- fgets遍历每一行
- strstr筛选包含"libUE4.so"的行
- strtok以"-"分割文本
- strtoul转换字符串为地址
4.2 游戏对象获取
- GWorld获取:通过固定偏移0xAFAC398
- PersistentLevel获取:UWorld类中的重要成员,存放Actors数据
- Actors遍历:
- 获取Actor数组和长度
- 通过虚表偏移0xA63BE28判断目标对象
- 目标Actor为FirstPersonCharacter_C
4.3 功能修改
-
移速修改:
- 偏移0x1A0 (CharacterMovementComponent.MaxAcceleration)
- 外挂修改为1000000000,正常值为1000
-
后坐力修改:
- 偏移0x538 (RecoilAccumulationRate)
- 外挂修改为0消除枪口抖动
五、自瞄功能分析
5.1 目标识别
- 识别目标为EditorCube8(共14个EditorCube)
- 通过输出所有箱子的vector值比对确认
5.2 视角控制
-
视角结构:
- PlayerController + 0x288获取ControlRotation
- 后续12字节为FRotator结构体(Pitch, Yaw, Roll)
-
关键函数:
- 0x8b387c0:写入FRotator结构体
- 0x670f3f8:处理射击行为
-
对抗方法:
- Patch 0x8b387c0函数调用为NOP
- 或修改坐标计算逻辑
六、弹道修改分析
6.1 子弹对象
- FirstPersonProjectile_C
- 继承自ProjectileMovementComponent
- InitialSpeed和MaxSpeed均为3000(未被修改)
6.2 弹道控制
-
关键函数:
- sub_670F110:处理子弹弹道
- ChangeCorner:控制弹道随机化(-30°到30°)
- sub_8D2ED80->sub_8D2E214:处理spawnactor
-
发射参数:
- MuzzleLocation:枪口位置
- MuzzleRotation:枪口朝向
-
对抗方法:
- 动态获取角色Rotation并修改子弹Rotation
七、透视功能分析(未完全实现)
7.1 可能实现方式
- 修改材质bDisableDepthTest为True
- 修改模型渲染顺序
- 修改材质的RGB值(SetVectorParameterValue)
7.2 分析路径
Character -> SkeletalMeshComponent -> SkinnedMeshComponent
-> SkeletalMesh -> SkeletalMaterial -> MaterialInterface -> Material
7.3 尝试对抗
- 修改bDisableDepthTest为False(无效)
- 修改bCollideWithEnvironment(无效)
八、总结与防御建议
8.1 技术要点
- UE4引擎对象结构理解是关键
- 虚表偏移分析是识别对象的重要手段
- 内存修改是外挂主要实现方式
8.2 防御建议
- 代码混淆:使用更高级的混淆技术
- 完整性校验:检测关键so文件修改
- 行为检测:监控异常的内存修改
- 服务器校验:关键逻辑服务器验证
8.3 学习建议
- 深入理解UE4引擎架构
- 掌握Frida动态分析技术
- 熟悉ELF文件结构和加载机制
- 研究常见反外挂技术实现
通过本文档的详细分析,读者可以全面了解UE4游戏外挂的实现原理和对抗方法,为进一步的游戏安全研究打下坚实基础。