iOS应用逆向工程:分析与实战
上QQ阅读APP看书,第一时间看更新

自序

我是一个热爱自助旅游的人。在大学的每个寒暑假,我都会抽出7~10天的时间,挑选国内的一个地方当一次背包客。因为是自助游,没有导游帮忙安排一切,所以在出行前,我和同伴需要花费不少时间制定计划、确认路线、购买车票,考虑路上可能出现的状况,并思考对策。都说旅游能够开阔眼界,尤其是自助游,对此我深有体会:在路上见到的人和事让我增长见识,更重要的是,在开始这段旅程前,我就需要对这段旅程中的点点滴滴有所准备——当身体还站在起点时,我的头脑就已经到达终点了。这种思维方式对全局观的培养是有利的,也让我在思考其他问题时养成了从长计议的习惯。

在2009年攻读硕士研究生前,我就曾深入思考过自己想要从事的研究方向。我学习的是计算机专业,而从本科开始,身边绝大部分同学的研究平台是Windows。作为一名动手能力并不强的普通学生,如果我继续从事Windows的研究,有两点好处:

❏这个方向有海量成熟资料,我的学习之路上不会缺少参照;

❏研究人数众多,碰到问题可以请教讨论的人比比皆是。

但是,从另一个侧面来看,这两点“好处”也并非有百利而无一害:

❏参考的资料越多,意味着我会越多地重蹈前人的“覆辙”;

❏研究人数越多,意味着竞争压力更大。

总的来说,如果我从事与Windows相关的工作,起步会很顺利,但后续难保不被淹没在人海里;如果另寻他路,入门会很辛苦,但坚持下去或能独辟蹊径。

幸运的是,我的想法与导师的如出一辙。他推荐我选择当时国内“小荷才露尖尖角”的移动开发方向,而我在这之前一直使用的是一款飞利浦蓝屏手机,对智能手机毫无概念,更别说在上面开发软件了。但是,导师是我仔细分析所有硕士生导师特点、与数名学长交换意见之后谨慎挑选的师从对象,他的判断本身就含有我的判断,因此,我相信这个判断,于是开始搜寻移动开发的相关资料。仅仅是了解了一些移动互联网和智能手机的概念,我就隐隐发现,这个行业顺应了人们对计算机和互联网更小、更快、与生活融合更紧的历史发展趋势,一定大有可为,遂将研究方向定为iOS。

万事开头难,iOS与我熟悉的Windows有着太多太多的不同:类UNIX、完整生态系统、全封闭、Objective-C语言,还有影响我最深的“越狱”,这一切的一切在当时几乎找不到完整的参考资料,有半年多近一年的时间,我折腾黑苹果的时间要以星期为单位。我硬着头皮把《Objective-C基础教程》上宛如天书一般的Objective-C代码敲入Xcode,然后运行模拟器看效果,但代码和画面完全对不上号;对iOS上似UNIX非UNIX的东西(如后台运行)大肆在Google上搜索,屡败屡战。当同学们都发表了第一篇小论文时,我甚至没明确自己这个月究竟在干什么,我缺乏太多的基础知识;当同学们周末出去K歌、打牙祭时,我一个人闷在宿舍里对着电脑啃代码;当同学们躺在床上睡懒觉时,我一个人一大早爬起来去实验室。一个人是孤独的,但这种孤独换来的是学识的积累,从而转化成内心的笃定,到了最后,因为内在的充实,就不再感到外在的孤独了。男人因孤独而优秀,付出一定会有回报。经过一年多的磨合,在2011年3月的一天,以前晦涩难懂的代码突然变得平易近人了,每一句的含义、每一行的关系都变得清楚了,零散的知识点在我的脑袋里被连成了线,整个体系的逻辑慢慢清晰了。于是我快马加鞭,在2011年4月初完成了毕业设计的程序雏形,并得到了当时对此方向并不抱太大希望的导师的高度评价——“从以前自我感觉良好的优越感变成了肚里有货后的真正自信”,这标志着我对iOS研究的正式入门。明白自己在做什么之后,就能有的放矢,研究效率呈几何倍率提高。在这两年里,我知道了Theos从而“勾搭”上了作者DHowett,向Activator的作者rpetrich讨教过问题,跟TheBigBoss的管理员Optimo发生过争执,他们是我这一路走来帮我解决实际问题最多的朋友;在开发SMSNinja的过程中结识了本书另一作者航哥,在不断深入研究的同时认识了一票做人低调、办事高调的高手,意识到自己并不孤单——我们孤胆,我们并肩。

在本书即将出版的时候回望这4年,我不禁庆幸自己当初的选择是正确的。在iOS方向4年的积淀就足够出一本书,这在Windows方向是不可想象的,而Apple、Google和Microsoft三大巨头的不断发力和市场反馈也直接证明了这个行业一定会是互联网下一个十年的绝对主角,能够亲眼见证并参与其中,我三生有幸。人生苦短,必须果敢,所以,少年,不要犹豫了,快到碗里来吧!

在受到航哥的邀请写作本书时,我是有些犹豫的。中国人口众多,各行各业竞争都很激烈,自己走了那么多弯路,碰了N鼻子灰才总结提炼出的这些知识,一股脑儿全都交代出去了,会不会有意无意地培养出更多“竞争对手”?这么做是不是把自己的优势拱手相让了?但是纵观越狱iOS的发展历史,从基本的Cydia和MobileSubstrate到Theos这样的开发利器,再到Activator这样的神级插件,这些对我影响最为深远的软件无一不是开源的,正是因为这些大牛分享了自己的“优势”,我才能博采众长、逐渐成长;rpetrich牵头的tweakweek和posixninja牵头的openjailbreak也都把宝贵的独门秘籍大白于天下,让更多的爱好者参与越狱iOS生态环境的建设。他们是这个圈子里的一线开发者,他们的优势完全没有因为“分享”而减少。我是一个受益于这个分享链条的人,怎么能在小有所成之后就过河拆桥、断掉我这一环节呢?况且,我是打算在这条路上继续求索的,如果我不停下,我的优势就会一直保持——我的竞争对手只有我自己。相信我们的分享会帮到很多和当年的我一样在门外苦苦徘徊的开发者,集大家的智慧创造出的作品能够更好地让科技服务于人,而且我也能结交更多志同道合的朋友,精神生活得到更大满足。这也聊可算作是从长计议吧。

啰啰唆唆说了很多,有些严肃,但这也正是我对待科学技术的态度。本书的内容适合国内绝大多数不满足于折腾App Store的iOS爱好者,通篇干货,童叟无欺,比我的硕士毕业论文要实在得多。更多后续的内容还请关注本书的官方微博@iOS应用逆向工程。让我们一起提升中国iOS开发者在国际上的地位!

在这里,我要感谢母亲对我事业的全力支持,使我在钻研学术之时能尽可能少地因琐事分心。感谢我的爷爷为我的英语启蒙,良好的英语素养是跟国际同行交流的必要条件。感谢我的导师授我以渔,让我在硕士3年经历脱胎换骨的成长。感谢DHowett、rpetrich和Optimo等大牛对我的无私帮助和尖锐批评,让我在快速成长的同时认识到差距巨大,不敢懈怠。感谢Daniel、gradetwo、zhuliang、大老、Vincent等前辈对本书的审核与建议,以及对我这个初学者的点拨。感谢我的家人和朋友们,他们的支持与鼓励是我前进下去的不竭动力。还要感谢我未来的女朋友,你26年来的缺席让我能一心一意地学习知识,本书稿费啊有我的一半也有你的一半。事业、亲情、友情、爱情是我等凡人的毕生追求,但往往只能求二争三,不可四者兼得,因为这个原因而有意、无意冒犯、伤害过的人,我欠你们一声“对不起”,感谢你们对我的成全。

最后跟大家分享一首我喜爱的诗,啊!人生多么奇妙。

未选之路

罗伯特弗罗斯特Robert Frost(1874—1963),20世纪美国最受欢迎的诗人之一、四度普利策奖得主。本篇为其代表诗作,原题为“The Road Not Taken”。——编辑注

黄色的树林里分出两条路,

可惜我不能同时去涉足,

我在那路口久久伫立,

我向着一条路极目望去,

直到它消失在丛林深处。

但我却选了另外一条路,

它荒草萋萋,十分幽寂;

显得更诱人、更美丽,

虽然在这两条小路上,

都很少留下旅人的足迹。

那天清晨落叶满地,

两条路都未见脚印痕迹。

呵,留下一条路等改日再见!

但我知道路径延绵无尽头,

恐怕我难以再回返。

也许多少年后在某个地方,

我将轻声叹息把往事回顾:

一片树林里分出两条路,

而我选了人迹更少的一条,

从此决定了我一生的道路。

(谨以此书纪念我已仙逝的外祖父刘汉民、祖母吴朝玉)

snakeninny