type
status
date
slug
summary
tags
category
icon
password
朋友说想玩音游,让我来看看能不能逆向。游戏叫RhythmHive。第一件事就是先dump下来,没想到一开游戏就遭到迎头痛击。
在越狱的iPhone上直接报错有debugger,要强制退出。上网搜了个bypass给了两种解决方案。要么是直接把liapp的文件删了,要么用某些插件来避免检测。

删文件当然简单,但是删除之后弹窗依然存在。没有说具体的原因了,只是检测到安全性威胁。

从以上行为推测,liapp必然是集成在游戏的主可执行文件里了。不然删除那几个应该直接bypass了。先用appsdump2试试运气,如果直接dump下来的framework都没加密的话,可以直接开干。

果然,主程序加密没了。只有86kb,于是继续找,发现是Unity开发的,因为找到了UnityFramework。

直接拖进IDA,不出所料没有符号表。但是又看到了熟悉的il2cpp。再在目录里搜索一下,果然有globalmetadata,拖进010editor一看,也没加密。直接回复符号表。

报错不支持的版本。

有时候如果globalmetadata是加密的,那么也会出现这种结果,这里显然不是。看了一下il2cppdumper的issue,原来后面才加入31版本的支持,但release的不支持。31指的是中文版的unity。所以自己编译一下,再回复就可以了。

再用对应的python脚本在ida里恢复符号。搜一下liapp一搜一堆。

本来逆这种东西是很简单的事,搜一下字符串就应该出了。但是相关的字符串一个搜不到。去网上搜索了一下,原来liapp的所有字符串都是加密的。万幸的是,游戏开发者自己疏忽了一点。
先看integrity,这是完整性检查



断言失败junk ≠ 0导致程序退出。查找交叉引用,又是直接用的虚表索引调用的函数,反正就是怎么恶心怎么来。类名和方法名也是没意义的。

不过这里我就没细看了,我去看debuger那里了,那边会简单一点。完整性检查是一个类,类的方法去做工作,那边就是直接的函数。不过都差不多一样。可以看下面这个图,结构一致的。

然后再找一次交叉引用。

上面调用了f0urThlwO4XULZZZ4中的方法,而完整性检查叫f0urThlwO4XULZZZ3,更加肯定都是差不多的东西。随后又看到一堆乱七八糟的字符串,直接按照它的方式进行解密。
但每个字符串的加解密方法都不一样,但基本都是简单的异或和加减。只是数量太多。
先把上面这两个解出来,一个是ptrace,这里通过dlsym获取了ptrace的函数地址,从函数指针调用ptrace(31,0,0,0),让ptrace附加自身来反调试,非常常见的一个做法。
然后我们刚才来的那个函数作为if的条件,如果是真进入里面,里面这个字符串解出来是个[%d]Debugging Detected,和弹窗的格式一样。弹窗的格式都是[数字]原因。
顺着找下来,弹窗的字符串构造方式也出来了。



那其实反调、检测debugger、弹窗、强制退出全都在这函数里了,再找一下交叉引用来到sub_232823C,这里面全是对乱七八糟的类的方法的调用,看都懒得看。既然要去掉反作弊,直接从根上去除:有地方调用直接去调用它的地方看。另外这样做的另一个原因是:删除掉liapp的文件后,不报错debug了,报错变成threat了,说明在更前面检测的threat。往上找两个调用于是找到了sub_2325410。

接着解一下字符串,发现很巧,第一个字符串就是我们删除的文件之一。
再找交叉引用,只有两个。第二个叫initfunc,猜测是反作弊的初始化,第一个则是和目前这一个互相调用,所以只看第二个。

结果在这里发现

这里还用到了很多明文字符串

具体也查不到是干啥的 逆这种东西纯纯的半蒙半猜。
这个init函数还会return result,而且liapp又只在启动的时候检测,因此怀疑这里return 0了以后就没问题了。拿lldb断6BE3A08处 写寄存器x0为0后改pc到ret。直接进游戏了。

Tweak
下一步就是写一个tweak,这样在我的越狱的手机上调试很方便。调明白了知道需要patch哪些地方,再统一的进行patch、打包后给未越狱iPhone安装即可。
首先在mac安装theos。brew是必须的,但是不能通过brew直接安装theos。装好后再用脚本

可以看上面这个教程,教了一些tweak基本写法。
但是,我们要hook的函数,只知道是UnityFramework+6BE3A08,并没有类名+方法。
一般对于类名+方法,使用logos来写hook就行了
Logos 语法是一种专门用于编写 iOS tweak 的语言。Logos 是一个基于 C 语言的语法扩展,主要用于 Theos 框架,允许开发者以简洁的方式编写用于 Hook iOS 应用的代码。
Logos 语法简要说明:
- Hook 类和方法:你可以使用
%hook
和%end
来定义一个类的方法 hook。
- 调用原始方法:使用
%orig
来调用被 Hook 的原方法。
例如:
这段代码的含义是:
MyClass
是你想 Hook 的类。
someMethod
是你想 Hook 的方法。
%orig
表示调用原本的方法实现。
这里我们要用
MSHookFunction
- 使用
MSHookFunction
进行 Hook 需要手动指定目标函数的地址,并提供自定义的实现。
- 可以用于更广泛的场景,包括非 Theos 项目。它通常用于处理一些不符合标准 Logos 的情况,或者直接在 C 代码中进行 Hook。
关键问题:怎么获得UnityFramework的基地址。这就像Windows里的dll一样。要么用
dlopen
,这种情况必须知道模块的路径;要么用以下这种方法,遍历已经加载的模块。拿到模块基地址后,再进行hook就简单了。
使用在makefile内写好手机对应的ip,用make package install来编译并安装。主要需要改的就是ip,架构,编译目标特别要注意iOS版本以及目标进程。

手机用线插到电脑上,再用idevicesyslog来查看日志即可。

如上图,函数被hook,我们自己的init函数被执行。


- Author:Lynnette177
- URL:https://next.lynnette.uk/article/RhythmHack
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!