结论
Reveal动态库加载流程如下图:
- 红色’dlopen’箭头代表:左边被加载的库内部会调用dlopen加载箭头右边的库。
- 箭头1号相继dlopen了右边的两个库。
- substitute-inserter.dylib、libsubstitute.dylib、substitute-loader.dylib属于越狱后系统所带的库,可以从Cydia中看到。
- RHRevealLoader.dylib、libReveal.dylib属于Reveal的库。
背景
越狱手机配置Reveal后,可以查看手机所安装的App的界面结构如下图:
这里有一个困扰我的问题:Reveal能够查看越狱手机所安装的所有App运行起时界面结构,它是如何做到的呢?
推测其运作流程
- 手机启动后加载Reveal的动态库。
- 手机Reveal库相关代码绘制页面bitmap。
- 从手机端向Mac传输渲染信息
- Mac端Reveal显示。
其中第2步即是手机app图层中各个view的bitmap,大概率是draw,或着纯色不绘制等技术实现。
第3步,可以选择USB/WIFI。
第4步就是Mac端对传输过来的信息进行整合渲染。
本篇文章主要探讨第1步——reveal的动态库是如何在越狱手机上各个App手机上加在的?
探究越狱手机Reveal库的加载
查看App的动态库列表
- MAC连接手机,USB映射通信接口。
- LLDB连接调试指定APP(极少数安全防护比较高的app会阻止ptrace,可以通过调试手段绕过)。
- 查看APP运行时链接接的库。
既然其中有三方动体库加载,那这些动态库能够被加载进来,这里推测出于以下2个原因:
- 静态修改:Mach-o文件头文件被修改,添加了依赖动态库。
- 动态修改:App时候设置了DYLD_INSERT_LIBRARY 环境变量。
LLDB链接越狱记被调试应用
首先端口映射,然后使用LLDB与debugserver命令链接越狱手机的相应app,使得断点停在__dyld_start。具体如下图:
DYLD_INSERT_LIBRARIES的值
- 根据dyld的加载流程,紧接目前程序暂停的位置,搜索符号“dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&)“。
- 触发断点后,再次出查看内存中映射的module。下图同时可以看出,内存中加载的module绝大部分是DSC(共享缓存库)。
- 查找‘getenv‘符号并在此处设置断点,触发条件设置为第一个参数等于“DYLD_INSERT_LIBRARIES”,并打印第一个参数。触发断点后,使用‘finish’命令,然后查看‘getenv’的返回值DYLD_INSERT_LIBRARIES = /usr/lib/substitute-inserter.dylib,该库是越狱系统带的。
dlopen断点查看相关库加载过程
- 为dlopen设置断点,触发条件设置为当第一个参数中包含‘Reveal’或‘substitute’。
- 第一次触发的是‘substitute-insert.dylib’触发open ‘libsubstitute.dylib’。
- 第二次触发的是‘substitute-insert.dylib’触发open ‘substitute-loader.dylib’。
- 第三次触发的是‘substitute-loader.dylib’’触发open ‘RHRevealLoader.dylib’。
- 第四次触发的是‘RHRevealLoader.dylib’触发open ‘libReveal.dylib’。
越狱手机Reveal配置
- 手机越狱工具un0ver,截止写该文章时可以越狱iOS11.0-14.8.
- Mac安装Reveal.
- Mac下载ifunBox (用于查看越狱手机文件树,拖拽Mac/iphone文件交换)。
- iphone越狱后Cydia搜索Reveal Loader,并在设置里面打开需要观察的App。
- Cydia下载OpenSSH。
- Cydia下载 “Apple File Conduit 2”。
- 将Mac端的Reveal库( Help–>Show Reveal Library in Finder–>iOS Library)framework包内RevealServer改名libReveal.dylib,迁移进iphone的/Library/RHRevealLoader/ 文件夹下(如果没有就创建文件夹)。
- iphone设置内Reveal Loader,Enable需要观察的App。