type
status
date
slug
summary
tags
category
icon
password
朋友说想玩音游,让我来看看能不能逆向。游戏叫RhythmHive。第一件事就是先dump下来,没想到一开游戏就遭到迎头痛击。
在越狱的iPhone上直接报错有debugger,要强制退出。上网搜了个bypass给了两种解决方案。要么是直接把liapp的文件删了,要么用某些插件来避免检测。
notion image
删文件当然简单,但是删除之后弹窗依然存在。没有说具体的原因了,只是检测到安全性威胁。
notion image
从以上行为推测,liapp必然是集成在游戏的主可执行文件里了。不然删除那几个应该直接bypass了。先用appsdump2试试运气,如果直接dump下来的framework都没加密的话,可以直接开干。
notion image
果然,主程序加密没了。只有86kb,于是继续找,发现是Unity开发的,因为找到了UnityFramework。
notion image
直接拖进IDA,不出所料没有符号表。但是又看到了熟悉的il2cpp。再在目录里搜索一下,果然有globalmetadata,拖进010editor一看,也没加密。直接回复符号表。
notion image
报错不支持的版本。
notion image
有时候如果globalmetadata是加密的,那么也会出现这种结果,这里显然不是。看了一下il2cppdumper的issue,原来后面才加入31版本的支持,但release的不支持。31指的是中文版的unity。所以自己编译一下,再回复就可以了。
notion image
再用对应的python脚本在ida里恢复符号。搜一下liapp一搜一堆。
notion image
本来逆这种东西是很简单的事,搜一下字符串就应该出了。但是相关的字符串一个搜不到。去网上搜索了一下,原来liapp的所有字符串都是加密的。万幸的是,游戏开发者自己疏忽了一点。
先看integrity,这是完整性检查
notion image
notion image
notion image
断言失败junk ≠ 0导致程序退出。查找交叉引用,又是直接用的虚表索引调用的函数,反正就是怎么恶心怎么来。类名和方法名也是没意义的。
notion image
不过这里我就没细看了,我去看debuger那里了,那边会简单一点。完整性检查是一个类,类的方法去做工作,那边就是直接的函数。不过都差不多一样。可以看下面这个图,结构一致的。
notion image
然后再找一次交叉引用。
notion image
上面调用了f0urThlwO4XULZZZ4中的方法,而完整性检查叫f0urThlwO4XULZZZ3,更加肯定都是差不多的东西。随后又看到一堆乱七八糟的字符串,直接按照它的方式进行解密。
但每个字符串的加解密方法都不一样,但基本都是简单的异或和加减。只是数量太多。
先把上面这两个解出来,一个是ptrace,这里通过dlsym获取了ptrace的函数地址,从函数指针调用ptrace(31,0,0,0),让ptrace附加自身来反调试,非常常见的一个做法。
然后我们刚才来的那个函数作为if的条件,如果是真进入里面,里面这个字符串解出来是个[%d]Debugging Detected,和弹窗的格式一样。弹窗的格式都是[数字]原因。
顺着找下来,弹窗的字符串构造方式也出来了。
notion image
notion image
notion image
那其实反调、检测debugger、弹窗、强制退出全都在这函数里了,再找一下交叉引用来到sub_232823C,这里面全是对乱七八糟的类的方法的调用,看都懒得看。既然要去掉反作弊,直接从根上去除:有地方调用直接去调用它的地方看。另外这样做的另一个原因是:删除掉liapp的文件后,不报错debug了,报错变成threat了,说明在更前面检测的threat。往上找两个调用于是找到了sub_2325410。
notion image
接着解一下字符串,发现很巧,第一个字符串就是我们删除的文件之一。
再找交叉引用,只有两个。第二个叫initfunc,猜测是反作弊的初始化,第一个则是和目前这一个互相调用,所以只看第二个。
notion image
结果在这里发现
notion image
这里还用到了很多明文字符串
notion image
具体也查不到是干啥的 逆这种东西纯纯的半蒙半猜。
这个init函数还会return result,而且liapp又只在启动的时候检测,因此怀疑这里return 0了以后就没问题了。拿lldb断6BE3A08处 写寄存器x0为0后改pc到ret。直接进游戏了。
notion image
 

Tweak

下一步就是写一个tweak,这样在我的越狱的手机上调试很方便。调明白了知道需要patch哪些地方,再统一的进行patch、打包后给未越狱iPhone安装即可。
首先在mac安装theos。brew是必须的,但是不能通过brew直接安装theos。装好后再用脚本
notion image
可以看上面这个教程,教了一些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版本以及目标进程。
notion image
手机用线插到电脑上,再用idevicesyslog来查看日志即可。
notion image
如上图,函数被hook,我们自己的init函数被执行。
notion image
notion image
iOS逆向——某跑步软件的文件上传手动实现的seh
Loading...
Lynnette177
Lynnette177
建议开着梯子访问站点。图片是直接从Notion获取的,不开梯子容易看不见图片。
Latest posts
写一个Android Hook小框架
2025-6-23
一些macos常用软件破解记录
2025-6-22
iOS典型反调反越狱app分析
2025-6-22
iOS网易新闻登录算法逆向
2025-6-22
小红书shield Chomper模拟
2025-6-22
一加11 内核、ROM爆改+脱壳机 LineageOS 22.2 Android 15
2025-6-22
Announcement
🎉2024.6.9 上线🎉