非越狱砸壳方式总结及坑

一、引言

大家都知道,在进行非越狱开发的过程中,需要对第三方应用的包进行重签名,并向MachO文件实行相关自定义库的注入操作,而这些都离不开需要对原始的二进制进行砸壳,原因是AppStore上的应用在开发者提交上去的时候都进行了加密。
虽然对于版本要求不高的应用可以通过PP助手直接下载已经砸壳的应用,但是仍有一些需求需要直接拿到当前线上版本的应用来进行处理,这就不得不需要自行掌握砸壳的一些技巧或方式。

二、事项

砸壳方式

目前提供了两种方式,一种手动lldb进行砸壳;一种是运用工具砸壳,工具砸壳又分为两种:静态砸壳(Clutch)及动态砸壳(dumpdecrypt, frida-ios-dump)。
其中静态砸壳局限较高,是硬性解密的过程,而动态砸壳是通过读取加载到内存中的信息进行Mach-O文件的解密替换。

局限性

目前砸壳只能通过越狱手机来做,并且最终的Mach-O可执行文件只会对当前砸壳用的越狱手机架构解密,可通过otool -l xxx | grep -B 2 crypt来查看解密状态。

运用frida-ios-dump工具这种动态砸壳的方式进行砸壳,首先脚本进行了优化,可以预先加载包内所有的framework到内存,但是尚不能加载appex等信息,是因为不能自动启动appex等进程。

具体解决办法是: 可以通过手动启动这些Appex进程,并用dumpdecrypt工具逐个对应用宝中Plugin目录对应的几个appex二进制进行内存dump,然后依次对原包中的appex二进制文件进行替换。当然也可以采用硬性解码的方式Clutch来进行砸壳。

三、坑

砸壳之后的应用可能存在装不上手机的问题,具体看安装过程中出现的问题;具体可采用ideviceinstaller工具进行具体安装问题的排查。
通过源码分析可知,它依赖了libimobiledevice库,-install指令下实际调用的是installation_proxy.c文件下的instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data)函数,而在这个文件中还定义了许多安装错误类型,具体可以通过链接查看。

常见错误

1.The application is not build for this device. (ideviceinstaller报错:DeviceNotSupportedByThining)

由于砸壳后ipa做了瘦身,一些UI支持的设备在info.plist里显示不全,只需要修改info.plist的UISupportedDevices项以及Required device capabilities段以适配即将安装的设备类型。

2. APIInternalError

一般属于设备系统出现问题,请重启设备再安装。

3. EmbeddedProfileInstallFailed

一般是Provision profile文件过期或无效导致

4.ApplicationVerificationFailed

应用包的重签名未成功导致

这样便可以在自己重签名的过程中厘清系统安装包的检测步骤,在找问题原因的时候方便很多。

你可能感兴趣的:(iOS开发)