7.3 逆向结果整理

本章的实例是针对iOS系统App的,在完全脱离IDA,仅凭Cycript和LLDB的情况下就可实现相应的功能(其实这里是用LLDB做了hook的工作,换用Theos可达到同样效果),虽然有一定的运气成分,但这也正体现了逆向工程的不确定性。为了完成Characount for Notes 8,我们的大致思路是下面这样的。

1.在界面上寻找适合显示字数的地方和方法

Notes从iOS 6演变到iOS 8时,原来的标题给演变没了,正好给我们留下了一个显示字数的地方。本章从note阅览界面入手,通过Cycript拿到NoteDisplayController,成功搞定显示字数的方法。

2.浏览class-dump出的头文件,在controller类里找到访问model的方法

通过controller访问model是MVC设计标准里规定的,苹果自身出品的App一定会遵守这个标准,因此在NoteDisplayController里一定能找到访问model的方法。我们仅仅通过浏览头文件,用Cycript测试可疑的属性,就拿到了NoteObject,从而拿到了一条note的字数。

3.在protocol里寻找实时监测字数变化的方法

实时调用的函数一般定义在protocol中,因为Objective-C的函数名可读性高,所以我们没有严谨地使用IDA和LLDB来寻找能够实时监测字数变化的方法,而是遍历了含有protocol关键词的头文件,人工筛选后再用LLDB测试,结果很快就找到了满足要求的方法。运气也好,猜测也罢,这就是逆向工程的魅力所在。