看了好多好多天,最后完全不知道从哪里说起了,既然是给自己看的,就简单点好,否则再憋下去也写不出来,因为有关的知识已经超过我目前脑袋可以接受的容量了,最后决定从加载动态库说起

先看下动态库、静态库的区别

OS库–.a与.framework

如何在iOS中加载一个动态库?看一下Reveal的官方教程

集成Reveal:动态加载

可以知道,直接集成后,会在应用启动后加载,不集成时,需要手动使用dlopen加载,关于使用dlopen,可以看苹果官方的文档

DLOPEN(3)

然而,除了自己的工程外,对于已经编译好的应用,完全无解,不过,既然已经越狱了,可以用dyld来手动注入代码,下面是有关动态链接的知识

Dynamic Linking On OS X

Simple code injection using DYLD_INSERT_LIBRARIES

可以通过向宏DYLD_INSERT_LIBRARIES里写入动态库完整路径,在执行文件加载时将该动态库插入。

代码注入可以通过类别覆写方法或者利用运行时,使用method swizzling来动态注入,cydiasubstrate对方法替换做了一个封装,而theos又基于它,实现了更方便的注入方式,但执行所有注入的前提,是对可执行文件的分析,首先需要获取一个已破壳的可执行文件,因为每个从app store下载的应用,都使用了用户信息来加密,只有解密后,才能使用class-dump来导出头文件,做进一步分析。

dumpdecrypted

1.破壳工具

clutch:在iOS9上已经失效,用它对应用破壳会失败,也有可能造成应用无法启动,不过可以用它来查看应用的Bundle ID,可以在Cydia中直接搜索安装,若需要手动查看,可以直接访问应用的Info.plist文件,虽然有点麻烦。

dumpdecrypted:它需要手动编译,Github地址是dumpdecrypted,教程详细,我选择使用它来解密应用。

PS:系统应用是没有加密的,可以直接dump出头文件。

2.将dumpdecrypted.dylib复制到iPhone上的/var/root/文件夹下,iPhone的应用全部安装在/var/mobile/Containers/Bundle/Application/下,使用一个唯一标识表示,一个个翻,当然是不科学的了,假如我们要找UC浏览器,那么先打开UC,然后输入

ps -ef|grep UC 
/var/mobile/Containers/Bundle/Application/52FDEC71-B2BA-4F75-8F49-C65BB7595822/UCWEB.app/UCWEB

可以看到UC浏览器可执行文件的绝对路径

3.解密

 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/52FDEC71-B2BA-4F75-8F49-C65BB7595822/UCWEB.app/UCWEB

这样就会在当前目录下生成一个UCWEB.decrypted文件,把它拷贝到mac上,使用class-dump可以导出头文件

class-dump -H UCWEB.decrypted -o UCWEBHeaders

所有的头文件都导出到UCWEBHeaders文件中