首页
论坛
课程
招聘
雪    币: 798
活跃值: 活跃值 (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

[原创]Unity3D游戏修改&iOS免越狱hook

2020-6-5 14:21 3987

[原创]Unity3D游戏修改&iOS免越狱hook

2020-6-5 14:21
3987

所谓免越狱Hook就是在iOS设备未进行越狱操作的前提下,对APP进行Hook操作,很久之前就有听说过,昨天花了一天时间整环境外加测试,然后又顺带修改了一个比较让人烦恼的游戏,Unity3D破解其实很早就搞过了,这次借着免越狱Hook一起分享给大家。

工欲善其事必先利其器

  • 越狱iPhone(必须)
    虽然最终修改之后的APP是要装到非越狱的iPhone上,但是APP需要砸壳,外加PP助手下架之后没啥好地方下载砸壳之后的ipa了,因此必须要有一部越狱的iPhone。
  • 未越狱iPhone
    这个不用说了,目标APP安装
  • MonKeyDev
    AloneMonkey大佬的作品,Hook插件编写神器,大佬还在其中集成了iOSOpenDev,同时也是非越狱插件开发集成的神器。官方安装指南
  • frida-ios-dump
    AloneMonkey大佬的又一力作,砸壳神器,iOS逆向一年多了,目前为止无往不利
    iOS frida安装 官方安装指南
    frida-ios-dump使用 项目地址
  • IDA
    分析砸壳后的APP,导入符号表python脚本方便分析
  • Il2CppDumper
    项目地址
    Unity3D游戏分析利器,Unity转换成IL2CPP的符号表提取工具,目前只支持Windows平台,最终生成的符号表脚本导入IDA用
  • IPAPatch
    项目地址
    用于重新打包签名ipa并安装到非越狱iPhone上,非常强大。如果不想写Hook插件,也可以采取修改汇编的方式重新打包安装ipa
  • 汇编码转换器
    下载地址
    各种类型汇编代码生成机器码的工具,方便静态修改可执行文件,重打包签名安装

抽丝剥茧

如果上诉工具全都准备齐全,那么就就可以开始逆向工作了,作为一个侦探密,平时喜欢玩一些密室游戏,今天修改的这款游戏叫做密室逃脱绝境系列--游乐园,不得不说情节设计的很不错,在一次尝试使用提示功能时,突然发现需要金币,然而免费金币需要看广告,每次只给一枚,但是提示的话费确实逐渐增长的,感觉有被冒犯到,所以有了接下来的一切。

 

 

砸壳

首先我们需要砸壳后的ipa进行分析,定位到底需要修改什么。

 

端口转发

iproxy 2222 22

首先通过frida查找要砸壳的APP进程

Mac-mini:frida-ios-dump-master-2 $ frida-ps -U
 PID  Name
----  -------------------------------------------------
2911  App Store
2947  信息
2980  密室逃脱绝境系列11游乐园
2936  微信
2972  设置
2949  邮件
2814  AppleIDAuthAgent
1412  AssetCacheLocatorService

接着运行dump.py即可脱壳

Mac-mini:frida-ios-dump-master-2 $ python2 dump.py 密室逃脱绝境系列11游乐园
Start the target app 密室逃脱绝境系列11游乐园
Dumping 密室逃脱绝境系列11游乐园 to /var/folders/m7/g2v2sbfd19g9kg7sk20n639h0000gn/T
start dump /var/containers/Bundle/Application/617F2079-957E-4005-92B8-7573FE651A8E/app1.app/app1
app1.fid: 100%|███████████████████████████████████████████████████████████████| 35.7M/35.7M [00:07<00:00, 5.03MB/s]
InfoPlist.strings: 213MB [00:44, 4.97MB/s]                                                                         
0.00B [00:00, ?B/s]Generating "密室逃脱绝境系列11游乐园.ipa"

Unity3D符号表恢复

在做这一步操作之前,机智的人已经将可执行文件脱到IDA文件中开始分析了,APP脱壳后解压ipa,然后查看app1包内容,主程序可执行文件使我们首要分析目标,一般来说是整个包中最大的那个文件。

 

 

在IDA分析的过程中,我们刚好通过Il2CppDumper来提取符号表,提取符号表需要两个文件,一个是上述的主程序可执行文件,另一个则是符号表文件global-metadata.dat,iOS下该文件位于xxx.app/Data/Managed/Metadata目录下

 

 

先后选择两个文件之后,程序跳出需要输入Unity version

 

 

我们怎么确认到底是用了什么版本的Unity呢,只要在IDA里搜索字符串X-Unity-Version即可,调用的地方会出现版本号,我们要找的版本号即2018.4.3f1

 

 

在输入版本号之后,选择3即可

 

 

同时在Il2CppDumper的目录下,会生成dump.cs和script.py两个文件

 

 

将script.py导入IDA,File——>Script File——>选择script.py
该脚本的主要作用是辅助IDA识别IL2CPP表函数名,在加载脚本之前IDA识别的函数形如sub_xxxxxxx

 

 

加载脚本之后对函数进行了标记形成格式如类名$$函数名这样的函数

 

定位修改点

在将script.py导入IDA之后,我们立刻着手分析dump.cs这个文件,该文件里面解析了游戏相关的属性和函数。可以用C#工具打开,我这里直接用source打开分析。

 

 

与其说是分析,不如说是查找更为准确一些,我们想要修改的最终目的肯定是拥有永远花不完的金币,那么我们就去针对金币去搜索定位,我搜索了Gold,定位到有一个函数为get_Gold较为可疑

 

 

在IDA定位到函数地址

 

 

 

之后通过lldb下断点调试,发现在打开提示的时候触发了断点,运气不错,返回上层调用查看结果为0,之后去看了个两个视频获得了两个金币之后,返回值果然变成了2,可疑确定程序就是通过这个函数来获取金币的数量。

 

直捣黄龙

分析定位修改点之后,就可以对游戏进行修改了,原本是想通过免越狱Hook实现对游戏的修改,但是尝试了多次一直hook不成功,多次查找发现未越狱iOS并不支持MSHookFunction方式进行hook,同时没法对形如sub_xxxxx函数进行inlinehook。
这里介绍两种修改方式,一种是通过iOS越狱Hook来实现对关键函数的Hook修改,主要依赖于MonkeyDev,游戏修改了之后肯定不会天天抱着一个越狱手机来玩,所以这里准备的另一种种修改方式是针对未越狱手机的,通过直接修改汇编,重打包签名ipa安装到手机上,主要依赖于IPAPatch

iOS越狱修改

iOS越狱插件的编写这里采用MonKeyDev,如何使用可见官方文档

注意事项

  • 在hook不同APP时将Tweak的plist中Bundles修改应用对应的Bundleid
  • 在Build Settings——>User-Defined新建项CODE_SIGNING_ALLOWED,赋值为NO,否则编译会报错
  • File——>Project Setting将Build System修改为Legacy Build System否则编译报错
  • 切记安装sshpass

插件编写

MonKeyDev支持多种Hook框架,我这里使用Tweak插件。
具体hook代码如下:

#import <substrate.h>
#import <dlfcn.h>
#import <mach-o/dyld.h>

// 用于保存原函数指针
int (*old_get_Gold)();

// 新函数
int new_get_Gold()
{
return 9999;
}

%ctor{
// 执行hook
unsigned long Gold = _dyld_get_image_vmaddr_slide(0) + 0x1011aa060;
MSHookFunction((void *)Gold, (void *)&new_get_Gold, (void **)&old_get_Gold);
}

iOS未越狱修改

修改汇编

首先查看get_Gold函数返回位置汇编,返回时传入X1进行经过函数转换为int返回,那么可以将9999传入X0,然后直接ret即可

 

 

通过汇编指令生成工具生成我们需要的机器码

 

 

ret的机器码为C0 03 5F D6

 

最后修改对应地址的机器码即可

 

重打包签名

将修改后的app1可执行文件重新放回原处,将解压后的ipa包重新压缩,最终改名为app.ipa,将该文件放到IPAPatch的Assets目录下,替换掉原本的app.ipa文件。

 

 

最终安装到未越狱手机上效果如下

 

隔山打牛

iOS免越狱hook主要是通过iosOpenDev生成dylib注入目标APP实现Hook,iosOpenDev是apple官方支持的插件生成工具,可直接由Xcode生成。可生成CaptainHookTweak、Logos Tweak两种dylib。在注入dylib之后对APP进行重打包签名。

 

我们接下来用到的MonKeyDev是对原有iOSOpenDev的升级,更加方便于非越狱插件的编写。

新建项目&编译

MonKeyDev安装完成之后,打开Xcode新建项目,滑动到最下方可以看到MonKeyDev提供的模块,选择第一个。

 

 

新建之后需要配置General——>Signing,设置自己的AppleID后续用于签名。

 

 

接下来将砸壳后的ipa或ipa解压后的xxx.app放入Your_P
roject/TargetApp目录下,编译整个项目,最终安装到未越狱手机上信任之后正常运行表明签名成功。

 

寻找注入点Hook

虽然最终没能成功实现免越狱hook修改游戏,但是我们还是拿它下手

 

首先通过Class-dump将头文件dump下来,在其中寻找一个又代表性的函数进行Hook,最终决定hook UnityAppController这个类中的init函数,在他调用的时候弹出弹框。

 

在your_projectDylib.xm中Hook代码如下:

#import <substrate.h>
#import <sys/sysctl.h>
#import <UIKit/UIKit.h>

%hook UnityAppController


// Hooking an instance method with an argument.
- (void)init{
%orig;

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hook成功" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
//[alert release];
}

%end

运行程序将ipa装到未越狱手机上,游戏打开之后会有弹框出现

 

总结

本来准备写一篇免越狱Hook结合Unity3D游戏修改为一体的文章,但是但是在Hook c函数的过程中遇到了难题,目前还没有找到未越狱手机上inlinhook的好方案,只能将两者分开来写,之后找到好的方案之后再进行修改为大家分享。

 

下面附上本人iOS Unity3D入门看的一篇文章,本文大致参考了这位大佬的框架。iOS上的Unity逆向与弓箭传说游戏修改

**本文仅用来学习交流,禁止用来做恶意事情,否则后果自付!如有侵权,请联系作者删除**


HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最新回复 (13)
雪    币: 3245
活跃值: 活跃值 (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wanttobeno 活跃值 2020-6-5 14:46
2
0
感谢分享工具和教程!
雪    币: 4799
活跃值: 活跃值 (2745)
能力值: (RANK:65 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2020-6-5 14:57
3
0
前排
雪    币: 2607
活跃值: 活跃值 (66)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
小调调 活跃值 2020-6-5 15:10
4
0
免越狱hook只可替换方法表是可行的,但是要修改代码段的代码是不可行的,苹果系统本身会对整个程序循环检测签名校验,或者你可以更简单点,直接修改Ipa硬编码,然后重新签名打包
雪    币: 714
活跃值: 活跃值 (242)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
麦麦2020 活跃值 2020-6-5 16:53
5
0
我最近也在研究unity游戏的修改可以加个好友吗
雪    币: 798
活跃值: 活跃值 (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Night_elf 活跃值 2020-6-5 16:57
6
0
小调调 免越狱hook只可替换方法表是可行的,但是要修改代码段的代码是不可行的,苹果系统本身会对整个程序循环检测签名校验,或者你可以更简单点,直接修改Ipa硬编码,然后重新签名打包
你说的是直接修改汇编然后重打包吗,文章里也写了这种方法
雪    币: 798
活跃值: 活跃值 (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Night_elf 活跃值 2020-6-5 16:57
7
0
麦麦2020 我最近也在研究unity游戏的修改[em_13]可以加个好友吗
你私我联系方式吧
雪    币: 8
活跃值: 活跃值 (47)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2020-6-5 18:45
8
0
可以修改代码段的代码吧,PSP模拟器都可以支持JIT了,你可以研究下,用的好像是lldb的调试方法,只是分配可执行代码区域并在此区域写代码是支持的,修改原有区域代码这个我也不明确,你应该可以从ppsspp模拟器的代码中获取到思路。
雪    币: 798
活跃值: 活跃值 (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Night_elf 活跃值 2020-6-5 19:15
9
0
sonyps 可以修改代码段的代码吧,PSP模拟器都可以支持JIT了,你可以研究下,用的好像是lldb的调试方法,只是分配可执行代码区域并在此区域写代码是支持的,修改原有区域代码这个我也不明确,你应该可以从ppss ...
多谢大佬指点,我去研究一下子
雪    币: 209
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
周小鱼 活跃值 2020-6-7 07:45
10
0
如果没有这么明显的Gold这种关键字,也无法通过内存定位金币数量的话,该如何分析?
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
迷你巨羊 活跃值 2020-7-9 14:57
11
0
不知道是不是有类似CE这样的软件,动态搜索内存
雪    币: 314
活跃值: 活跃值 (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
亚丝娜 活跃值 2020-7-10 15:23
12
0
你好,请问能否加个好友请教一些问题
雪    币: 798
活跃值: 活跃值 (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Night_elf 活跃值 2020-7-13 10:01
13
0
亚丝娜 你好,请问能否加个好友请教一些问题
私我联系方式
游客
登录 | 注册 方可回帖
返回