试水ios-一次过闪退记录

一次过ios应用闪退的记录

Posted by hmoytx on January 6, 2022

试水ios-一次过闪退记录

讲点屁话

上次写文章还是2021年,一下就一年过去了,最近挖洞有点累,研究了一手ios的应用,为后面挖洞先未雨绸缪下。踩了不少坑,但是还是学到不少东西,简单记录下一个app从闪退到”基本“能进行调试的过程。

背景

之前有安排过测试这个企业内部的办公app,移动端安卓,ios都有,pc端同样也有win和osx的。之前搞不定,这次继续硬着头皮搞。

测试环境

ipx ios 13.6 已越狱
xcode 10.x
可能会有问题,需要去GitHub下载对应的设备支持文件(你高版本xcode没关系)。
放到下面的目录:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

还有问题就谷歌吧。

开始

从appstore中下载该应用,直接点开发现闪退(意料之中)。
要去分析肯定第一步是要砸壳(应用商店下载的都有壳),尝试直接从cydia安装CrackerXI来砸壳,并不行。还是老老实实用frida砸壳,好在没有什么别的问题。
1
看一下砸壳以后的二进制文件,已经没有壳了。看文件名像是企业微信。
2

真机调试

完成上面两步,开始尝试真机调试(肯定还不能调,有检测)。
安装monkeyDev,创建项目,真机运行。
让它跑,到断下来。
3
查看堆栈调用信息,一眼能看到这个checkEnv,它有问题。
4
看他的调用应该是在framework,找到它ida慢慢分析它。
5

过闪退

已经找到闪退的调用处了,一点一点改,它的调用还是很常规,exit、svc之类的。 都能改问题就不大。
一处一处找,一处一处patch,有好几处,检测越狱,注入,调试等。
6
我这里后来选用的是把exit调用跳掉,svc我是nop。
7
最后伪码是这样的,打印不管,退出跳掉。
8

过签名检测

完成闪退修复后,发现进入仍然是有别的问题。会弹窗提示,不合法。
这种只能图层调试,但是我这个不行(伏笔,之前有手贱改过一处主文件,导致后面一个大问题)。
9
到这里其实是卡主了(思路和应用都是卡主了)。
正常思路是图层,找到弹窗的事件,然后去回推。
不过好在柳暗花明,发现调试信息如下:
10
去主文件找,”invalid team id”,很幸运,找到了。
11
这里只列出一部分,最开始if判断进入该逻辑后,输出检测信息,弹窗调用等,我if处给他反条件,成功绕过。
12
其实到这里重新打包,就已经能进行调试了,不闪退,不弹窗。没有账号没进行进一步测试。
抓包的问题这里不谈。
但是前面说到挖了坑,还要进行埋坑。

埋坑

完成上面的所有步骤,发现还是会崩溃断下来,可以说”屡试不爽“,调试崩溃断下来循环。
13
尝试找到崩溃的调用。
通过崩溃地址最近的主文件函数地址减去偏移,在主文件中找到函数调用。
14
发现了自己挖的坑,把这里nop了,后面的调用直接出问题。所以崩溃了。
15
还原成原来的样子,再xcode run起来,一切都很美好了。

总结

难度不是很高,在大佬的指点下算是”基本“解决问题。
吸取教训,要耐心,不要手贱。