之前现已介绍过 cycript 这个越狱动态剖析的神器,cycript 是纯指令式的剖析东西,关于大多数人/普通开发者来说,这种方式仍是显得太极客了。仍是图形化的界面更容易接受和运用,所以今日介绍的便是这样一款神器 Reveal 。许多 iOS 的正向开发人员会感觉到困惑,说我用 Xcode 的 view debugger 用的挺好的啊。还去了解这个 Reveal 干什么。。。我只能说跟我在没接触逆向开发之前的想法如出一辙,Reveal 不仅能够剖析你的 APP 界面,它还能够剖析其他开发者的 APP 界面,乃至剖析 iOS 体系自带的 APP 界面。而且关于 flutter 项目生成的 App 运用 view debugger 只能看到视图层级结构内容却只显现一片黑色,而 Reveal 却能看到其中的内容。而且 Reveal 在剖析 APP 界面的时分相同不需求中止剖析的 APP 进程。

Cycript 比较 Reveal 功用愈加强壮,除了能够检查 APP 的 UI 界面以外,还能够获取 APP 中更多的信息,比如方针的成员变量,属性,方针办法,类办法等等。。。尽管 Reveal 仅限 UI 界面剖析修改 UI 属性等简略功用,但 Reveal 提供的图形界面对大多数人愈加友好。剖析界面时挑选哪个取决于你的个人爱好,但想动态调试调用办法,获取更多的信息的话,或许 Cycript 会更适宜。

正向开发中运用 Reveal

由于正向开发进程中运用 Reveal 的含义并不大(根本都是运用 Xcode 的 view debugger),而且就算要运用,集成进程也十分简略。在 官网 下载好 Reveal 之后,翻开 Reveal 找到 iOS Library,然后将它集成到 APP 中不需求增加一行代码就完事了。然后发动 APP 从头(或许也不需求?)翻开 Reveal 就能够看到你的 APP 显现在 Reveal 界面。

找到 Reveal 的 iOS Library:

Reveal

呃,集成进程仍是讲一下吧,不然或许会发动就崩溃。将 iOS Library 复制到项目的根目录下

Reveal

然后找到你的 target -> general -> frameworks,libraries,and embedded content -> RevealServer.framework 右侧挑选 Embed & sign 。

Reveal

这样会将 RevealServer.framework 打包到 APP 包的 Frameworks 目录下。如下图:

Reveal

只有这样,才不会发动崩溃,(这是在我的 Reveal 版别 21 上是这样的,假如你不是这个版别,或许不会有这样的问题)。Reveal 界面如下:

Reveal

逆向开发中中运用 Reveal

未越狱环境运用

相同仍是引荐运用 AloneMonkey 的 MonkeyApp 项目模板,项目模板默许就集成了 Reveal ,不过需求注意的是 AloneMonkey 自带的 RevealServer.framework 库版别十分古老了。所以需求将你的 Reveal 的 RevealServer.framework 替换曩昔。在 Reveal 的 help 中找到 iOS Library,替换 AloneMonkey 中的 RevealServer.framework,AloneMonkey 的 RevealServer.framework 路径如下:

/opt/MonkeyDev/Frameworks/RevealServer.framework

越狱环境运用

越狱环境的运用需求以下三个过程

  1. 从 Cydia/Sileo 安装 Reveal2Loader

    Reveal
  2. 将 Mac 上的 Reveal 的 iOS Library 中的 RevealServer.framework 复制到越狱设备的 /Library/Frameworks/RevealServer.framework 路径。能够运用 scp 指令,也能够运用 iFunBox 图形界面操作更直观。

  3. 在 iOS 设置 APP 中找到 Reveal -> Enabled Applications 挑选你想要调试的 APP 翻开右侧的开关。

执行上述过程之后,翻开 Mac 的 Reveal 就能够看到越狱 iPhone 上能够调试的 APP 了,能够看到体系的 APP 也能够。下面是体系 备忘录 APP 的界面结构:

Reveal

最终

经过 Reveal 剖析优异的 APP 的 UI 界面简直是太棒了!当然这仅仅从 UI 层面的剖析,这个时分或许许多人就会说了,光看一下 UI 界面有什么用啊,还不是不知道详细怎样完成的。

直接看到源码是不太或许的(除非你是苹果公司的工程师),苹果并没有开源这些 APP 。但是想要检查和源码等价的伪代码也不是彻底不或许,能够经过反汇编,反编译东西(hopperghidraIDA Pro等东西)还原为高级代码,这些内容都会在后续的文章中更新。

还有许多 iOS 开发者常常在运用体系库的进程中,或许会遇到一些不可思议的问题,如 UIKit ,作者就曾经在子类化 UIRefreshControl 的时分遇到过古怪的问题,许多时分都会在 - (instancetype)initWithCoder:(NSCoder *)coder- (instancetype)initWithFrame:(CGRect)frame 办法内执行一些通用的公共的初始化办法,所以便完成了一个 - (void)_commonInit 办法完结这个方针。所以古怪的现象发生了,代码并没有依照预期的那样运行。在作者百思不得其解的时分,想到了经过检查剖析 UIRefreshControl 类的反编译伪代码发现,我自己的办法名 _commonInit 与该视图类的私有办法重名了,才导致出现不可思议的 bug 。

iOS 开发者们或许很好奇,常常运用 Xcode 跳到 UIKit 框架的头文件中阅读,然后还想测验一下找到 UIKit.framework 地点的路径,经过 show in Finder 跳转到了指定的文件却始终找不到 UIKit 的二进制文件?那体系是怎么知道 UIKit 的详细完成的?一般的 APP 在它的包内就能找到二进制文件(在 iOS 中也叫 MachO 文件),但是 iOS 体系库的二进制文件的确不太好找。关于怎么找到体系库的二进制文件,怎么检查它的反编译伪代码,这一切的答案都会在后续的文章更新中揭晓。