在经过越狱开发之后,我开始了接触非越狱开发。
相比之下,他们之间有很多相似点:比如都是通过砸壳以后的IPA包去dump头文件来进行分析,分析代码逻辑之后去hook对我们有用的类做一些自己的事情,封装成动态库后注入到包内的二进制Mach-O文件中,在程序dyld的时候加载到程序的内存中运行。
而不同的是非越狱情况下会出现很多权限的限制,不能够对一些系统级别的环境(Springboard之类)去做修改,同样苹果在APPStore也有一套自己的加密机制,而要让自己注入的APP能够在非越狱机型上运行,就还需要对苹果的签名机制做一些修改。
下面根据我学习的一些情况对非越狱开发的整个步骤和一些细节做一个总结。现在来说,已经有很多大神对非越狱方面的开发做了许多的贡献,比如iOSOpenDev(https://github.com/Urinx/iOSAppHook )以及MonkeyDev(https://github.com/AloneMonkey/MonkeyDev ),这两个框架集成了很多功能,比如很好用的Tweak编译,LLDBTools动态调试以及fishhook等都是逆向必备的。对于一般的应用可以省去很多中间繁琐的步骤,不过同样也存在不能够去逆向PlugIns以及Watch等APP Extension的遗憾。为什么会这样呢,要分析的话,就需要从非越狱逆向的步骤开始熟悉。
应用解密-砸壳
应用上传至APP Store后,苹果会对应用的代码部分进行加密,当应用运行时才会动态解密,在这样的情况下是无法直接使用class-dump和IDA进行代码分析的。所以,在分析应用之前,要把应用加密的内容解密,然后把应用和解密后的可执行文件导出到计算机中。
以下有三种方法进行解密:
- 使用dumpdecrypted动态注入后,dump内存中解密后的代码部分。
- 使用Clutch,通过调用posix_spawnp生成一个进程,然后暂停进程,dump内存
- 使用Frida,跟上面dumpdecrypted类似
需要注意的是,这些工具需要通过越狱手机在越狱环境下才能够实现。
下面简单介绍一下frida-ios-dump的用法:
该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件,通过以下方式配置完成之后真的就是一条命令砸壳。
环境配置
首先上面也说了该工具基于frida,所以首先要在手机和mac电脑上面安装frida,安装方式参数官网的文档:(https://www.frida.re/docs/home/ )
越狱手机在Cydia中安装Frida Server:
Mac上面使用如下命令安装即可:
sudo pip install frida –upgrade –ignore-installed six
然后将越狱设备通过USB连上电脑进行端口映射:
iproxy 2222 22
到此环境就配置好了,接下来就可以一键砸壳了!
一键砸壳
最简单的方式直接使用./dump + 应用显示的名字即可,如下:
完成之后可以用otool来查看,otool可以输出app的load commands,然后通过查看cryptid这个标志位来判断app是否被加密。1代表加密了,0代表被解密了:
鉴于百度输入法是一个多targets的应用,包含一个Watch以及 App Extension。所以同理,我们还需要依次确认以下二进制文件,这里就跳过了。
注入动态库
在进行一顿分析class-dump头文件以及IDA导出来的伪代码之后,相应的就可以去构建自己的动态库了,动态库中主要就是通过hook应用中已有的代码来完成对动态库的修改。下面来介绍注入动态库的两种工具:
一个是yololib工具,一个是insert_dylib工具;
在学习dyld之后,我们知道当应用加载的文件的时候,这个文件就是一个Mach-O类型的通用二进制文件:
我们重点关注Load Command
字段,Load Command
告诉系统应当如何加载文件中的数据,对系统内核加载器核动态链接器起指导作用。其中LC_LOAD_DYLIB
代表的是依赖的动态库,包括动态库名称、当前版本号、兼容版本号。可以使用otool -L xxx
命令来查看。
上面