iOS应用逆向工程(第2版)

更多详情

内容简介: 仔细阅读了本书从字里行间可以感受到作者的认真,在当今这个浮躁的大环境中,这是非常难得的,单从认真这点来看,这本书绝不是一本“水货”,强烈推荐大家阅读,尤其是初学者。
本书的前六章侧重于理论的介绍,但又不局限于理论,几乎每章都有至少一个小例子来帮助读者理解相关的理论。后面的几章侧重于实践,并且使用了一些大家耳熟能详的App作为例子,以此来降低读者的陌生感,可见作者用心之良苦。

目录: 推荐序一
推荐序二
第2版序
第1版序
前言
第一部分 概 念 篇
第1章 iOS逆向工程简介 3
1.1 iOS逆向工程的要求 3
1.2 iOS应用逆向工程的作用 4
1.2.1 安全相关的iOS逆向工程 5
1.2.2 开发相关的iOS逆向工程 6
1.3 iOS应用逆向工程的过程 7
1.3.1 系统分析 7
1.3.2 代码分析 8
1.4 iOS应用逆向工程的工具 8
1.4.1 监测工具 9
1.4.2 反汇编工具 9
1.4.3 调试工具 10
1.4.4 开发工具 11
1.5 小结 11
第2章 越狱iOS平台简介 12
2.1 iOS系统结构 12
2.1.1 iOS目录结构简介 13
2.1.2 iOS文件权限简介 16
2.2 iOS二进制文件类型 17
2.2.1 Application 17
2.2.2 Dynamic Library 20
2.2.3 Daemon 20
2.3 小结 22
第二部分 工 具 篇
第3章 OSX工具集 25
3.1 class-dump 25
3.2 Theos 27
3.2.1 Theos简介 27
3.2.2 安装Theos 28
3.2.3 Theos用法介绍 30
3.2.4 Theos开发tweak示例 51
3.3 Reveal 53
3.4 IDA 57
3.4.1 IDA简介 57
3.4.2 IDA使用说明 58
3.4.3 IDA分析示例 68
3.5 iFunBox 71
3.6 dyld_decache 72
3.7 小结 73
第4章 iOS工具集 74
4.1 CydiaSubstrate 74
4.1.1 MobileHooker 74
4.1.2 MobileLoader 84
4.1.3 Safe mode 84
4.2 Cycript 85
4.3 LLDB与debugserver 89
4.3.1 LLDB简介 89
4.3.2 debugserver简介 90
4.3.3 配置debugserver 90
4.3.4 用debugserver启动或附加进程 91
4.3.5 LLDB的使用说明 92
4.3.6 LLDB使用小提示 107
4.4 dumpdecrypted 107
4.5 OpenSSH 111
4.6 usbmuxd 112
4.7 iFile 113
4.8 MTerminal 114
4.9 syslogd to /var/log/syslog 115
4.10 小结 115
第三部分 理 论 篇
第5章 Objective-C相关的iOS逆向理论基础 119
5.1 tweak在Objective-C中的工作方式 119
5.2 tweak 的编写套路 121
5.2.1 寻找灵感 121
5.2.2 定位目标文件 123
5.2.3 定位目标函数 127
5.2.4 测试函数功能 129
5.2.5 解析函数参数 130
5.2.6 class-dump的局限性 133
5.3 实例演示 133
5.3.1 得到灵感 134
5.3.2 定位文件 135
5.3.3 定位函数 143
5.3.4 测试函数 145
5.3.5 编写实例代码 145
5.4 小结 147
第6章 ARM汇编相关的iOS逆向理论基础 148
6.1 ARM汇编基础 148
6.1.1 基本概念 149
6.1.2 ARM/THUMB指令解读 152
6.1.3 ARM调用规则 159
6.2 tweak的编写套路 161
6.2.1 从现象切入App,找出UI函数 162
6.2.2 以UI函数为起点,寻找目标函数 173
6.3 LLDB的使用技巧 203
6.3.1 寻找函数调用者 203
6.3.2 更改进程执行逻辑 208
6.4 小结 211
第四部分 实 战 篇
第7章 实战1:Characount for Notes 8 215
7.1 备忘录 215
7.2 搭建tweak原型 216
7.2.1 定位Notes的可执行文件 217
7.2.2 class-dump出MobileNotes的头文件 218
7.2.3 用Cycript找到阅览界面及其controller 218
7.2.4 从NoteDisplayController找到当前note对象 220
7.2.5 找到实时监测note内容变化的方法 223
7.3 逆向结果整理 227
7.4 编写tweak 228
7.4.1 用Theos新建tweak工程“CharacountForNotes8” 228
7.4.2 构造CharacountForNotes8.h 229
7.4.3 编辑Tweak.xm 229
7.4.4 编辑Makefile及control 230
7.4.5 测试 230
7.5 小结 233
第8章 实战2:自动将指定电子邮件标记为已读 234
8.1 电子邮件 234
8.2 搭建tweak原型 235
8.2.1 定位Mail的可执行文件并class-dump它 237
8.2.2 把头文件导入Xcode 238
8.2.3 用Cycript找到Mailboxes界面的controller 239
8.2.4 用Reveal和Cycript找到All Inboxes界面的delegate 240
8.2.5 在MailboxContentViewController中定位“刷新完成”的响应函数 242
8.2.6 从MessageMegaMall中拿到所有邮件 246
8.2.7 从MFLibraryMessage中提取发件人地址,用MessageMegaMall标记
已读 248
8.3 逆向结果整理 254
8.4 编写tweak 255
8.4.1 用Theos新建tweak工程“iOSREMailMarker” 255
8.4.2 构造iOSREMailMarker.h 255
8.4.3 编辑Tweak.xm 256
8.4.4 编辑Makefile及control 257
8.4.5 测试 258
8.5 小结 259
第9章 实战3:保存与分享微信小视频 260
9.1 微信 260
9.2 搭建tweak原型 261
9.2.1 观察小视频播放窗口,寻找逆向切入点 261
9.2.2 class-dump获取头文件 262
9.2.3 把头文件导入Xcode 263
9.2.4 用Reveal找到小视频播放窗口 264
9.2.5 找到长按手势响应函数 265
9.2.6 用Cycript定位小视频的controller 270
9.2.7 从WCTimeLineViewController找到小视频对象 272
9.2.8 从WCContentItemViewTemplateNewSight中提取WCDataItem对象 276
9.2.9 从WCDataItem中提取目标信息 278
9.3 逆向结果整理 288
9.4 编写tweak 289
9.4.1 用Theos新建tweak工程“iOSREWCVideoDownloader” 289
9.4.2 构造iOSREWCVideoDownloader.h 289
9.4.3 编辑Tweak.xm 290
9.4.4 编辑Makefile及control 292
9.4.5 测试 293
9.5 彩蛋放送 294
9.5.1 从UIMenuItem切入,找到小视频对象 294
9.5.2 微信历史版本头文件个数变迁 295
9.6 小结 298
第10章 实战4:检测与发送iMessage 299
10.1 iMessage 299
10.2 检测一个号码或邮箱地址是否支持iMessage 299
10.2.1 观察MobileSMS界面元素的变化,寻找逆向切入点 299
10.2.2 用Cycript找出placeholder 302
10.2.3 用IDA和LLDB找出placeholderText的一重数据源 308
10.2.4 用IDA和LLDB找出placeholderText的N重数据源 311
10.2.5 还原原始数据源生成placeholderText的过程 340
10.3 发送iMessage 341
10.3.1 从MobileSMS界面元素寻找逆向切入点 341
10.3.2 用Cycript找出“Send”按钮的响应函数 342
10.3.3 在响应函数中寻找可疑的发送操作 344
10.4 逆向结果整理 369
10.5 编写tweak 370
10.5.1 用Theos新建tweak工程“iOSREMadridMessenger” 370
10.5.2 构造iOSREMadridMessenger.h 371
10.5.3 编辑Tweak.xm 372
10.5.4 编辑Makefile及control 372
10.5.5 用Cycript测试 373
10.6 小结 373
越狱开发一览 375
沙箱逃脱 380
编写tweak——新时代的hacking 382

前言: 为什么要写这本书
两年前我正式从传统网络设备行业转行进入移动互联网行业,当时正是移动应用开发市场最火爆的时候,创业公司如雨后春笋般的成立,尤其社交类App更是大受追捧,只要有一个不错的构想就可能拿到千万级投资,高价挖人组队的信息更是让人眼花缭乱。那时我已经开发了几个颇具难度的企业应用类App,对于那些轻量级的普通社交App不是太看得上,想着要玩点比较酷的技术,机缘巧合进入了安全管家(北京安管佳科技有限公司),从零开始搭建iOS团队,负责包括越狱方向在内的iOS开发。
其实iOS越狱开发的基础就是iOS逆向工程,那个时候我并没有这方面的经验,面向的是一个完全未知的领域,不过好在有Google,国内国外的信息多少还是能够搜到点,而且对于iOS开发者,越狱开发和逆向工程并不是一个完全隔离的世界,虽然被分享出来的都是零零散散甚至重复度很高的知识,但是只要投入大量精力,把知识归纳总结,慢慢可以整理出一幅完整的图谱。
然而独自一人学习的过程是孤独的,尤其是遇见困难和问题无人交流,让人一筹莫展。每次一个人扛下所有问题的时候,总是感叹:要是有一个水平不错的交流者该是多么幸福?虽然也可以给Ryan Petrich等一线大牛发邮件请教,但很多在我们看来当时解决不了的难题在这类高手眼中很可能就是个低级问题,不苦心钻研一番根本不好意思去问。这个阶段大概持续了有大半年,直到2012年在微博上遇到本书的另一作者snakeninny,那时他还是一个面临毕业的研究生,整天“不务正业”地研究iOS底层,而且研究得还相当有深度。我曾和他提过:“你看,有多少人都投入到App领域捞钱去了,你咋不去呢?”他说:“弟的目标远大,要玩就朝着国际一线大牛的目标去!”小兄弟,你够狠!
不过,多数时候我们都是自己在折腾,只是偶尔在网上交流一下问题及解决方法,但往往能碰撞出一些有价值的内容。在一起合写本书之前,我们曾经合作逆向分析过陌陌,做了一个插件用于在陌陌iOS版上把美女的位置标注在地图上。当然我们都是善意的开发者,主动将这个漏洞告诉了陌陌,他们很快就修复了。这次,我们再次合作,将iOS逆向工程方向的知识整理出版,呈现给各位读者。
在接触越狱开发、逆向工程的这些年,个人感觉最大的收获就是看待App时,完全以一种庖丁解牛的眼光去审视:App如何构成、性能如何,可以直接反映出开发团队水平高低。这些经验知识不仅可用于越狱开发,也适用于传统的App开发,至于带来的影响,有正有负吧!我们不能因为苹果不提倡越狱就否定这个领域的存在,盲目地相信本书曝光的安全问题不存在不过是掩耳盗铃罢了。
有经验的开发者都明白,知识掌握得越深,越会接触到底层技术。比如sandbox保护机制具体体现在哪些方面?runtime只用来研究理论知识是不是有点大材小用了?
在Android领域,底层技术已经被扩散开,而在iOS领域,这个方向展现出来的内容还只是冰山一角。虽然国外也有几本iOS安全方向的书籍,比如《Hacking and Securing iOS Applications》、《iOS Hacker’s Handbook》,但是内容太难,绝大多数人根本读不懂,即使我们这些有一定经验的开发者,读这些书也非常吃力,效果不好。
阳春白雪不为我们这些喜欢实践的技术宅所好,那么来点下里巴人的,不必遮遮掩掩,直接全面展开这些知识岂不是更痛快?于是就有了我们这本书,书中的内容以概念、工具、理论、实战的形式全面、系统地展开知识点,由浅入深,图文并茂,带着读者一步步地探索App的内在。我们不会像一些技术博客那样貌似很高深地独立分析某一片段的代码,也不纠结“茴”字有几种写法,而是尽我们所能将一个完整的知识体系呈现给读者,提供一整套iOS应用逆向工程的方法论,相信读者一定会有所收获。
近些年,国内投入在越狱iOS这个方向的人越来越多,但都比较低调,他们开发出的越狱工具、App助手、Cydia插件影响着整个iOS的发展。他们积累的技术非我们这些散兵游勇所能及,但我们更愿意分享这些知识,希望能够抛砖引玉。
读者对象
本书主要面向以下读者:
iOS狂热爱好者。
中高级iOS开发人员。他们在掌握了App开发之后对iOS有更深的渴求。
架构师。在逆向App的整个过程中,架构师能学习那些优秀App的架构设计,以这种方式博采众长,提高自己的架构设计能力。
在别的系统上从事逆向工程,想要转向iOS逆向工程的工程师。
如何阅读本书
本书将分为四大部分,分别是概念、工具、理论和实战。前三部分介绍iOS逆向工程这个领域的背景、知识体系,以及相应的工具集、理论知识;第四部分则以4个具体案例将前面的知识以实战的方式展开,让读者可以实践验证前面学到的知识,加深对iOS逆向工程的理解。
如果读者不具备iOS逆向工程经验,建议还是从头开始按顺序阅读,而不要直接跨越到第四部分去模拟实战。虽然实战的成果很炫,但知其然而不知其所以然也没意思,对不对?
勘误和支持
由于作者的水平有限,编写的时间也很仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正,欢迎访问本书的官方论坛http://bbs.iosre.com,全球的iOS逆向工程师都在这里聚集,你的问题应该会得到满意的解答。如果你有更多的宝贵意见,也欢迎你通过微博@iOS应用逆向工程或官方论坛与我们联系,我们很期待能够听到你们的真挚反馈。
致谢
首先要感谢evad3rs、盘古、太极、saurik等顶级团队与高手,他们奠定了越狱iOS的基石;还要感谢DHowett,是他提供了Theos这个强大的开发工具使我得以迈进iOS逆向工程的大门。
感谢安全管家,为我进入iOS逆向工程领域提供了一个充分发挥的环境,虽然我早已离开,但希望它发展得更好。
感谢微博上每一位热心的朋友——唐巧_boy、卢明华、你在瓦西里、isdada、Jagie、onevcat、戴铭、费西FISH、xuzhanji、Life无法Debug、移动开发小冉、HorseLuke、网络蝎子、hongjiang_wang、月之舞狼、StayNStay、bluesea哈哈哈、郑州IOS、青年土豆的烦恼、木土吉吉,以及这个仓促写就的名单之外的更多朋友,感谢你们对我的支持和鼓励。特地感谢唐巧_boy的引荐,他的热心帮助促成了本书的出版。
感谢机械工业出版社华章公司的编辑杨绣国老师,感谢她的魄力和远见,在这三个月的时间里始终支持我的写作,她的指点和帮助引导我们顺利完成全部书稿。
谨以此书献给我最亲爱的家人,以及众多热爱iOS开发的朋友们。
吴航(hangcom2010)

序言: 推荐序一
前一段时间跟吴航在微博上私信聊天,他说正在写一本iOS方面的图书,我让他书出来的时候送一本给我。之后他在私信上跟我说书写完了,让我给写个序,我当即表示“压力山大”,但还是欣然答应了。
我认识吴航是在2011年9月,当时安全管家在找iOS开发高手,吴航作为我们安全管家iOS开发组的第一个工程师进来了,他和我们从零开始搭建iOS团队,并着手安全管家越狱版的开发。到了2012年年中,我认识到iOS自身的安全性非常好,在非越狱的iOS上我们能做的关于安全的事情并不多,而越狱行为本身就是一个最大的安全风险,是用户主动选择的结果,跟我们自身的安全理念不符,因此无须投入太多关注,恰好吴航本人也想出去做自己的事情,于是我支持了他的决定。
在那大半年的接触中,我发现吴航是个难得的技术人才,在技术的钻研上有股子狠劲,拥有丰富的开发实战经验,又善于利用各种工具解决问题,因此在他带团队的时候,评估出来的开发进度基本上都能达成。我印象深刻的有两件事,第一件是在开发越狱版安全管家时,由于这方面官方公开的资料几乎没有,很多涉及系统底层的开发,需要自己摸着石头过河,并得反复尝试。当时我们制定了一个比较紧的开发周期,希望在较短的时间内开发出越狱版安全管家的原型。吴航的压力不小,他接连几个月都在研究系统底层,向各路高人请教,通过Google找寻国外网站上的资料,没日没夜地想办法,后来终于在既定的时间内完成,这让我看到了吴航不仅不惧困难,而且敢于负责任。另一件事是在开发App Store版安全管家时,有个版本在我的手机上在不同页面间快速切换时会有极小的概率导致安全管家崩溃,我就反馈给了吴航。虽然只是小概率事件,但他亲自反复高强度测试,细致地排查代码,最终揪出了导致这个问题的内存指针Bug,这足见其严谨的技术态度和对质量高标准的追求。
虽然我不做开发很多年了,但是至今仍忘不了年轻时作为一个工程师,非常渴望与更高水平的人交流,希望聆听高手们实战经验分享的情景。吴航愿意把他的经验总结成书,是广大iOS开发者的福音,这本书能够带给大家实实在在的干货,让大家都能在技术的道路再攀高峰。
赵岗
安全管家创始人
推荐序二
In our lives, we pay very little attention to things that work. Everything we interact with hides a fractal of complexity—hundreds of smaller components, all of which serve a vital role, each disappearing into its destined form and function. Every day, millions of people take to the streets with phones in their hands, and every day hardware, firmware, and software blend into one contiguous mass of games, photographs, phone calls, and text messages.
It holds, then, that each component retains leverage over the others. Hardware owns firmware, firmware loads and reins in software, and software in turn directs hardware. If you could take control of one of them, could you influence a device to enact your own desires?
iOS 8 App Reverse Engineering provides a unique view inside the software running on iOS?, the operating system that powers the Apple iPhone? and iPad?. Within, you will learn what makes up application code and how each component fits into the software ecosystem at large. You will explore the hidden second life your phone leads, wherein it is a full-fledged computer and software development platform and there is no practical limit to its functionality.
So, young developer, break free of restricted software and find out exactly what makes your iPhone tick!
(在生活中,我们经常会忽略许多习以为常的事物。事实上,那些我们每天都与之打交道的东西,往往都蕴含了一种“复杂”的美感——它们由成百上千的微小组件构成,各个微小组件各司其职,在各自的岗位上发挥着不可替代的关键作用。现代生活中,智能手机已经成了我们每天必不可少的工具,通过硬件、软件和固件协同合作,它为我们带来了好玩的游戏、有趣的照片,以及便利的沟通渠道——电话和短信。
在一个巴掌大的手机里,各个组件之间的关系错综复杂,互相影响。硬件为固件的运行提供支撑平台,固件掌管软件,而软件又回过头来调度硬件。如果你能控制它们之中的哪怕一个,不就可以让手机听命于你了吗?但App Store的插手,又为你对它们的控制加上了重重阻力。
本书从独特的角度剖析iOS应用,你会从比App Store App更低一级的深度去了解软件的各个组件在构造整个软件时起到的作用,你会由此发现手机的“里世界”——它的能力远不止App Store所许可的那样有限,确切地说,它是一台功能齐全的计算机,在它的“里世界”里,一切皆有可能。
年轻的开发者,从这里开始打破App Store的限制,重新认识真正的iPhone吧!)
Dustin L. Howett
iPhone Tweak 开发者
第2版序
转眼,本书第1版面世已经快1年了,在这一年里,因为有大家的认可与推广,本书得到了广泛关注。与此同时,iOS逆向工程也在国内iOS开发者圈子里“漫延”开来,并达到了前所未有的高度,正是因为大家的努力,才使得该技术得到发展,而我们作者团队也贡献了一点力量,甚感欣慰!
随着盘古、太极等国内越狱团队的横空出世,以及各种第三方市场的蓬勃发展,iOS技术层面的较量已经从App开发转向底层研究;随着WireLurker等病毒的出现,一些深藏不露的安全问题也开始浮出水面,苹果构建的封闭系统正在出现一条条裂缝。不管是进攻还是防守,都离不开iOS逆向工程技术的使用。在可以预见的未来,苹果将进入恶意软件重度防御时
代,iOS逆向工程的应用一定会越来越广泛,让我们拭目以待。
自本书第1版上市后,反响一直不错,京东等各大网店的好评率高达95%以上。随着iOS 8的发布,我们清楚地意识到第1版的内容已经不再适合最新的iOS 8。同时根据一年多以来跟大家不断的沟通和交流,也意识到第1版存在缺憾和不足,例如讲解不够细致,术多道少等,影响了书的可读性。因此,在即将推出全新升级的《iOS应用逆向工程》里,不但全面支持iOS 8,还大幅更新了章节内容,涵盖更多细节,配备了更多的例子,增加了“道”的分量,比第1版的逻辑性更强,更易读了。在升级版中,我们尝试从抽象的逆向工程中抽离出一个通用的方法论,试图传递给大家一种逆向工程的思想,而不仅仅是工具的使用。
本书第1版上市之后,我曾把书的目录和内容框架发布到国际iOS越狱社区上,得到了非常正面的反馈,包括Cydia的作者saurik、OSX著名研究员fG!、Theos作者DHowett等国际一线开发者均对本书表示了浓厚的兴趣,这也让我萌生了让该书走向国际的想法。在整理这一版时,我与编辑沟通了该想法,没想到还真促成了此事。国际版将由美国CRC出版社在全球出版发行,由8位国外知名研究员(5位美国籍、1位加拿大籍、1位阿根廷籍、1位丹麦籍)审核,全球iOS逆向工程社区对国际版寄予了厚望。在第1版的前言里,航哥曾提到我夸下的海口:“弟的目标远大,要玩就朝着国际一线大牛的目标去!”虽然离这个目标还差得很远,但我已经在朝这个目标努力迈进了,不是么?
第1版序
我是一个热爱自助旅游的人。在大学的每个寒暑假,我都会抽出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的过程中结识了本书另一作者航哥,在不断深入研究的同时认识了一票做人低调、办事高调的高手,意识到自己并不孤单——我们孤胆,我们并肩。
在本书即将出版的时候回望这5年,我不禁庆幸自己当初的选择是正确的。在iOS方向5年的积淀就足够出一本书,这在Windows方向是不可想象的,而Apple、Google和Microsoft三大巨头的不断发力和市场反馈也直接证明了这个行业一定会是下一个互联网十年的绝对主角,能够亲眼见证并参与其中,我三生有幸。人生苦短,必须果敢,所以,少年,不要犹豫了,快到碗里来吧!
在受到航哥的邀请写作本书时,我是有些犹豫的。中国人口众多,各行各业竞争都很激烈,自己走了那么多弯路,碰了N鼻子灰才总结提炼出的这些知识,一股脑儿全都交代出去了,会不会有意无意地培养出更多“竞争对手”?这么做是不是把自己的优势拱手相让了?但是纵观越狱iOS的发展历史,从基本的Cydia和CydiaSubstrate,到Theos这样的开发利器,再到Activator这样的神级插件,这些对我影响最为深远的软件无一不是开源的,正是因为这些大牛分享了自己的“优势”,我才能博采众长、逐渐成长;rpetrich牵头的tweakweek和posixninja牵头的openjailbreak也都把宝贵的独门秘籍大白天下,让更多的爱好者参与越狱iOS生态环境的建设。他们是这个圈子里的一线开发者,他们的优势完全没有因为“分享”而减少。我是一个受益于这个分享链条的人,怎么能在小有所成之后就过河拆桥,断掉我这一环节呢?况且,我是打算在这条路上继续求索的,如果我不停下,我的优势就会一直保持——我的竞争对手只有我自己。相信我们的分享会帮到很多和当年的我一样在门外苦苦徘徊的开发者,集大家智慧创造出的作品能够更好地让科技服务于人,而且我也能结交更多志同道合的朋友,精神生活得到更大满足。这也聊可算作是从长计议吧。
啰啰嗦嗦地说了很多,有些严肃,但这也正是我对待科学技术的态度。本书的内容适合国内绝大多数不满足于折腾App Store的iOS爱好者,通篇干货,童叟无欺,比我的硕士毕业论文要实在得多。更多后续的内容,还请关注本书的官方论坛http://bbs.iosre.com和官方微博@iOS应用逆向工程。让我们一起提升中国iOS开发者在国际上的地位!
在这里,我要感谢母亲对我事业的全力支持,使我在钻研学术之时能尽可能少地因琐事分心。感谢我的爷爷为我的英语启蒙,良好的英语素养是跟国际同行交流的必要条件;感谢我的导师授我以渔,让我在硕士3年经历脱胎换骨的成长;感谢DHowett、rpetrich和Optimo等大牛对我的无私帮助和尖锐批评,让我在快速成长的同时认识到差距巨大,不敢懈怠;感谢念茜、flyingbird、INT80、jerryxjtu、漏网之鱼、Proteas等前辈对本书的审核与建议,和对我这个初学者的点拨;感谢我的家人和朋友们,你们的支持与鼓励是我前进下去的不竭动力;还要感谢我未来的女朋友,你的缺席让能我一心一意地学习知识,本书稿费啊有我的一半也有你的一半。事业、亲情、友情、爱情是我等凡人的毕生追求,但往往只能求二争三,不可四者兼得,因为这个原因而有意、无意冒犯、伤害过的人,我欠你们一声“对不起”,感谢你们对我的成全。
最后跟大家分享一首我喜爱的诗,啊,人生!多么奇妙。
未选之路
罗伯特·弗罗斯特
黄色的树林里分出两条路,
可惜我不能同时去涉足,
我在那路口久久伫立,
我向着一条路极目望去,
直到它消失在丛林深处。
但我却选了另外一条路,
它荒草萋萋,十分幽寂;
显得更诱人、更美丽,
虽然在这两条小路上,
都很少留下旅人的足迹。
虽然那天清晨落叶满地,
两条路都未见脚印痕迹。
呵,留下一条路等改日再见!
但我知道路径延绵无尽头,
恐怕我难以再回返。
也许多少年后在某个地方,
我将轻声叹息把往事回顾:
一片树林里分出两条路,
而我选了人迹更少的一条,
从此决定了我一生的道路。
(谨以此书纪念我已仙逝的外祖父刘汉民、祖母吴朝玉)
沙梓社(snakeninny)

媒体评论: 逆向工程对实践性要求非常高,因此学会与没学会的标准只有一个,那就是能不能抛开书本,使用与书中相同或者不同的方法,实现出相同的效果。大家在实践的过程中必然会遇到困难,可能会感觉学不下去了,但是希望大家在这时绝不要放弃,有句话叫“念念不忘,必有回响”,在感觉自己学不会时,可以先把这件事情放一放,但是不要忘记,过段时间再继续。经过几次这样的迭代后,相信你会掌握iOS逆向工程相关的理论与技巧。
——Proteas独立iOS研究员
每一个iOS开发者都应了解的逆向知识都在这里了。这本书详细地介绍了常用的静态分析手法以及实用的动态分析技巧。不但可以帮助逆向新手快速上手,同时也能激发iOS开发熟手对应用安全的思考,把主动防御的思想渗透到项目开发中。
——念茜 支付宝iOS开发工程师
本书语言通俗易懂,内容由浅入深,通过介绍逆向分析过程中的各种工具的使用揭开iOS应用逆向分析的神秘面纱;通过详细讲解heos框架开发技巧引领大家走进越狱开发的殿堂。如果你希望成为一个iOS高手或者安全研究人员,本书是你通往成功路上最好的向导。
——漏网之鱼 独立iOS研究员
如果你觉得对普通iOS App的开发已经有点疲倦了,iOS逆向工程绝对是你值得尝试的新领域。
本书非常适合有一定iOS开发经验的读者,一步一步引导你走进逆向工程的大门。
各种实用工具的讲解,让你倦意顿失;手把手的实践,让你意犹未尽。
现在iOS越狱进入常态化,越狱开发的势头很猛,学会了逆向开发,多一种选择,对于普通开发也是受益颇多。
——沈悦 独立iOS开发者