用 Reveal 分析系统日历应用(碰到了一个大坑)

转自我自己的博客:http://vulgur.me/2016/04/14/reveal-the-mobilecal/

这篇博客的起因是这样的,前些日子的一个电话面试,其中一个问题是:如何实现 iOS 系统中的日历应用。

Calendar

我一边翻看手机中的 app,一边回答说有两种做法:一是用 UITableView+Cell,一是用 UIScrollView+UIView,在滑动的过程中计算即将显示的内容。

面试的结果是失败,当然不光是因为我上面的回答,但却激起了我的好奇心,这日历到底是怎么实现的?

于是我就打开了 Reveal,这个神器是我在初学 iOS 时就果断买的,当时还是折扣价,现在想想都觉得超值。如果没有这个东西我都无法想想我的第一个项目会遇到多大的困难,可能都无法完成交付。

用 Reveal 查看日历应用

关于使用 Reveal 查看任意 app 的方法,我就不再这里赘述了,网上有很多教程,在此给出一个参考链接:Reveal Loader

以前用 Reveal 看其他 app 的 UI 是如何实现的时候,一看一个准,从未遇到任何问题。但是这次让我碰到了一个大坑……其他的 app 都可以用 Reveal,唯独这个日历 app 不可以(后来经过搜索,发现相机应用也是不可以的),Reveal 就是死活连不上,真是奇了怪了。

鼓捣了半天后还是无法解决,只好 Google 大法了。一开始用中文关键字搜索,都是不着边际的搜索结果。改用了英文关键字,第一个结果就是我想要的!

搜到的结果网页是 Reveal 的一个 Support 页面,Unable to inspect Calendar (MobileCal) 。这里面说貌似日历应用阻止了和 Reveal HTTP Server 的连接,而在倒数第二楼里面也给出了 SO 的一个链接,Cannot bind() a socket inside Apple Calendar (dylib injection),里面就是更详细的原因和解决方法。

对于沙盒机制和 dylib 注入什么的我基本不懂,我就拣我看得懂的说。原因就是,日历应用(MobileCal)采用的是自定义沙盒,app 中有一个 Entitlements.xml 文件,里面就是规定这个 app 的各种权限。这个文件里又有一个特殊的字段(seatbelt-profiles),导致阻止了所以得网络通信。回答者也给出了两个解决方案,而第一个难度系数太高,所以就第二个给出了实际的操作方法。

简单来说,这个方法就是把 app 的权限导出,编辑后再塞回给 app。为什么不直接修改这个 Entitlements.xml 呢?因为真正的权限存在于 app 的二进制文件中。整个操作所使用的工具是ldid。操作的过程中我遇到的一个问题就是怎么在手机中找到 app 的文件位置,一开始我走了弯路,我误以为要拿到 ipa 文件,其实不是。网上搜到的都是说在/var/mobile/Applications/下面,还说所以得 app 都是以一些乱七八糟的标识符命名的文件夹,但是我的 4s 并没有这个目录。还是搜了半天才发现,真正的 app 都在/Applications/(好像是从 iOS 8.x 开始改的),而且所以得 app 目录就是以XXX.app命名的。

App Folders

接下来的就十分简单了,就是照着 SO 上面执行以下步骤:

  1. 导出权限,ldid -e MobileCal > entitlements.xml
  2. 手机上还没有 vi 和 vim,只好把这个 xml 复制到电脑中编辑,删掉那个seatbelt-profiles,再传回手机
Entitlements.xml
  1. 最后把权限导入,ldid -Sentitlements.xml MobileCal

这样就大功告成了,日历就可以在 Reveal 中一览无遗了。

Reveal

分析日历应用的实现

我主要看了月视图和年视图这两个页面的结构,发现这个应用的实现真是非主流啊。

Month
Year

月视图的页面主要是由 CompactMonthWeekViewCompactMonthWeekDayOverlay 组成的,这两个东西都是 UIView 的子类。诡异的是月视图中表示日期的1到31都看不到 UILabel,这些数字都是包含在 CompactMonthWeekView 中。而那些 CompactMonthWeekDayOverlay 也只是显示农历日期,看不到有任何的 subView。想不出这两个东西是如何封装的。当然,表示「今日」的控件是另外的一个类,可以看到其中的 UILabel。是我把手机切换到英文,再看日历,果然 CompactMonthWeekDayOverlay 这个东西就没了。

English Month

再来看年视图,主要是由CompactYearMultipleMonthViewCompactYearMonthView 组成。同样的是,数字都看不到 UILabel 的存在,也看不到 UIImageView,实在是奇怪。

还遇到一个奇怪的地方,4s 的月视图中点击日期除了「今天」都没有反应,而 iPhone 6 点击任意日期都可以进入日程的页面。

年视图和月视图可以无限上滑和下滑,在 Reveal 中可以看到对上一年(月)和下一年(月)都是有预加载的。年视图中不是整年的加载,大概是两行左右的预加载(在屏幕外)。月视图中下个月是整月加载,本月和上个月加载的不多,只有两三个星期。

这些控件应该不是固定的图片,理论上是可以通过算法计算出每个月视图和年视图中数字的排列的,但是在无限滑动中还能保持特别的顺畅,实在是费解。我只会用 Reveal 查看 app 的 UI 结构,对于逆向领域是一窍不通,如果有哪位有过研究的前辈还请告知,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容