感谢大家抽时间听猫友会第一期微分享,这次由我先主持。
首先声明下猫友会的宗旨:改变武汉的互联网行业环境,需要每一个人出力,每个人做出一点点,它就会慢慢改变!
欢迎大家参加今天的猫友会群直播分享活动,我先介绍下这次活动的基本情况。群分享是由讲师在群中通过文字+图片形式给大家分享技术,和线下演讲的内容差不多,只不过讲线下口头的内容转换成文字+图片在群里面分享,同时分享完之后讲师还会在群中跟大家交流及答疑。希望「猫友会群」能够通过今天这样的分享形式让大家更有效率的学习及交流。
由于人员众多,为了高效方便的分享,我们预先定义了如下规则方便大家交流:
分享总体分为三个环节:
背景规则介绍完毕,言归正传,今天主题是《阿凹机器人背后的秘密》,很荣幸邀请到了来自「华寓中国」的沙梓社:越狱开发者, 逆向达人,《iOS应用逆向工程》的作者,GitHub 2600+ star,首位WWJC 中国演讲者,「华寓中国」联合创始人。
大家好,我是沙梓社,湖北武汉人,很荣幸加入猫头鹰这个平台,感谢锦哥提供的宝贵机会,可以跟大家分享逆向工程相关的知识。
我今天跟大家分享的主题是《iOS逆向工程简介》,希望能够用尽可能简单的文字和图片,结合尽可能通俗的交流,跟大家普及iOS逆向工程的常识。
简单自我介绍一下,我是《iOS应用逆向工程》系列图书的作者,在Cydia(最大的越狱iOS商店)上有11款独立作品,接受过CSDN的专访,书的英文版在GitHub上开源后收获了2600+ stars,是首位在WWJC上发表演讲的中国人,以「提升中国iOS开发者在国际上的地位」为己任。
在很多朋友的眼里,iOS逆向工程是一个小众、神秘的方向,为什么我会选择这个小众的方向呢?这要从我最喜欢的一首诗说起。第一次,我是在李开复的自传《世界因你不同》里看到这首诗,当时就感觉身心得到了非常强烈的震撼:
因为我感觉到自己就是这类人:如果有两条路给我选,我确实会选更少人走的那一条。我发现自己是一个刻意保持自己跟别人不同的人。
在初次读到这首诗时,我还没有开始学习iOS。在从事iOS方面的研究后,又从乔帮主亲自配音的广告中寻找到了灵感,发现苹果跟我的价值观非常一致,就是要追求不同。因此,我更加认定iOS就是我的主攻方向。
我的成长之路,就是一条与众不同的未选之路:别人都在学「大众情人」Windows时,我开始学「小众路人」iOS;别人都在学iOS正向开发时,我开始学iOS逆向工程。正是因为追求不同,我写的《iOS应用逆向工程》成为了全球唯一一本iOS逆向相关书籍,而且有美国和韩国的出版社想要引进本书,打破了中国iOS知识产权零输出的尴尬纪录。我用自己的努力代表中国iOS开发者在国际上发声,而且为iOS主流社区所认可,作为中国人我感到非常自豪。
简单来说,我所研究的,主要是iOS应用层的逆向工程,对内核层的逆向工程只是稍有涉猎,没有入门。应用层的逆向工程,我感觉自己玩得差不多了,应用层的所有逆向工程相关问题,都可以用我那本书上介绍过的知识和技术得到解决,我觉得没有太大挑战性了,主要是劳动量问题。到了这个地步,我的规划主要分为2个方向:
当然,很多朋友会问,IT人员创业的普遍做法,都是去BAT这样的互联网公司干2年,观察一下他们的玩法,然后拉一个团队出来干。你问啥不这么干呢?主要是碰到了一个很好的项目。大公司一直都在那里,想什么时候去都可以;而好项目却不常有,机会过去就过去了,不等人,所以我在准备并不算充分的情况下选择了创业这条路。
交代完了我的背景,咱们可以进入正题了:grin:
「The process of discovering the technological principles of a device … for either purposes of maintenance or to support creation of a new device or program that does the same thing, without using or simply duplicating (without understanding) the original.」 大意是「通过研究现有功能的实现原理,理解并融会贯通,在此基础上实现(甚至增强)这个功能。」也就是说,不是照猫画虎,而是师夷长技,「借刀杀人」。
在我的理解里,逆向工程是一种工程师式的高级思维方式。给你水、面粉、糖、芝麻,让你做烧饼,这是正向工程;给你一个烧饼,让你分析出它是由多少水、多少面粉、多少糖、多少芝麻组成的,这是逆向工程。也就是说,根据图纸制作实物的这个过程是正向工程,而根据实物倒推图纸的这个过程则是逆向工程。乔布斯曾说「Good artists copy; Great artists steal.」逆向工程有异曲同工之妙。
举几个通过逆向工程师夷长技的例子:
除了去学习别人的长处,逆向工程还可以发现自己和别人的短处:
这种低级错误,星巴克可以犯,但1Password不能犯;这取决于你的产品定位。这个错误当然是通过逆向工程发现的。
这是某世界500强企业犯的,通过HTTP协议明文传输用户手机和密码的低级错误:
这是某突破3亿用户的移动App:
把传输协议的密钥硬编码在代码里,有逆向工程基础的朋友可以轻松还原整套网络传输协议。淘宝上一堆堆的这个刷榜那个刷赞,就是这个原理。
阿凹,是「借刀杀人」最典型的运用之一:
阿凹的实现原理,简单说,就是通过逆向工程的方式找出微信iOS客户端的收发信息等私有接口,然后基于自己的逻辑调用这些接口,实现针对特殊事件的自动化应答功能。
我个人最常用的iOS逆向工程工具主要有这些:
class-dump的效果,图中显示的是新浪微博App的所有头文件:
Cycript的效果,可以看到微信星号密码的明文:
Theos开发插件的运行效果:
所有进程的[NSDictionary dictionaryWithContentsOfFile:]方法均被「hook」,可以随意篡改。
IDA的效果:
对于熟悉汇编语言(图里是ARM汇编)的朋友来说,所有未加密的二进制文件,均等同于开源。这是什么概念,做技术的都懂。
接下来我简单介绍下阿凹的制作流程:
核心在于找到收发微信消息的函数,然后加以修改利用:
我要介绍的就是这么多。
大家有任何关于iOS的问题都可以随便提问,正向的我懂的少点,逆向的我尽量回答:grin::
【问】沙大神,如果我成功找到了一个应用的加密函数,然后剩下的工作就是把它翻译成OC语言,这个过程有什么技巧么?我ARM汇编没怎么接触过,除了硬着头皮上,有木有什么捷径= =!
【答】如果你是土豪,那么可以购买IDA pro,1年十几万上下。可以把二进制文件给反编译成C语言。如果你不是,可以500块人民币购买Hopper,Hopper支持32位ARM汇编的反编译,直接反编译成C语言
【问】SOGA,也就是我需要从一台ARM v7的机器拿到二进制文件,之后采用这种方法对么
【答】是的,买一台二手iPhone 5即可
【问】你好沙神,比如说我用SQLCipher对用户的聊天记录SQLite进行加密,逆向工程能破解这个本地化的库文件么
【答】可以破
【问】那就是SQLCipher其实也不是绝对安全
【答】只要这个库在本地,可以被你的App解密,那么我就也可以解密;如果这个库在你本地没法解密,那我可能也没法解密。微信本身提供了红包功能,阿凹就可以抢红包,只是这个功能我没开放出来,破坏游戏平衡了;微信本身没有提供冲厕所的功能,所以我也没办法实现。
【问】额,意思 那就是只能看逆向者的三观了
【答】是这样的,这是把双刃剑。GitHub上一个复旦大学生开源的Android抢红包代码,1000多个star,洋洋洒洒几千行代码,各种术语,各种牛比,我可以50行以内搞定,我只是觉得开源出来没啥意义,就算了
【问】那我又得问正向问题,就没有级别比较高的用户本地数据全保障方法了么
【答】参考支付宝和1Password
【问】能给讲下支付宝和1Password大概是怎么处理的么
【答】我也没有研究过,因为暂时用不到……
【问】阿凹回答问题的答案是调的什么资源?还是通过自己分词得来的?
【答】是用的图灵机器人。微信本身只提供了消息收发接口,发的是什么消息,是由图灵机器人决定的。我本来打算加入语音识别功能的,用科大讯飞,但是现在太忙了,没时间,就先搁置了:disappointed_relieved:
【问】既然说到微信抢红包,沙大神我再问个问题。我猜想微信抢红包和发送聊天消息有点类似,通过检测红包发送消息和找到红包点击函数来快速抢红包。那么之前我也见过有人因为抢红包被微信发现禁用抢红包功能7天,请问沙大神,如果你是微信开发人员,你会采取什么手段来防范逆向开发人员
【答】这取决于用逆向工程干什么,如果是写个阿凹这样的机器人,我觉得无伤大雅。如果是抢红包,那我能想到的一个直观防范方式,就是如果发红包和抢红包的时间间隔非常短,比如1秒内,那么说明是用外挂了。另外就是把这部分代码写得难懂一点,那么逆向工程的难度也就大一点。
【问】我理解,理论上逆向工程都可以通过找到对应函数完成应用原本的功能,比如点击事件等
【答】是这样的,矛和盾总是没有止境的,只是看逆向工程付出的代价多大了。提高逆向工程的难度,让逆向工程师觉得不值得,是最好的防范方式。苹果防越狱,就非常高明,我把你们越狱社区最好的点子全都学习到了正版iOS里,用户觉得苹果越来越好用了,越狱越来越没有意义了。越的人少了,高手觉得没意思了,自然就防住了。
【问】嗯,那么能简单介绍几种常用提高逆向成本的正向开发手段么
【答】用C/C++函数写核心功能;关键功能函数名起个完全不相干的东西;编译MachO时加上ptrace、__restrict标记等方法;Swift/ObjC混编。这几个方法,可以防住绝大多数脚本小子了。
【问】我以前看过一本安全的书说用C++写然后代码用大量模版,逆向人就会疯了,是这样么?
【答】C++确实不好逆向
我(沙梓社)在上海创业,现在找靠谱java后端,找的火急火燎。这里有一个我们的简介:http://iosre.com/t/30-ios-hacker/1618;和我的2015年终总结:http://iosre.com/t/topic/2523。如果大家在上海有认识的靠谱java后端,麻烦帮我引荐一下,叩谢!