转载

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

  • 策划:侠天
  • 编辑:刘子洋

主持人-侠天

感谢大家抽时间听猫友会第一期微分享,这次由我先主持。

首先声明下猫友会的宗旨:改变武汉的互联网行业环境,需要每一个人出力,每个人做出一点点,它就会慢慢改变!

欢迎大家参加今天的猫友会群直播分享活动,我先介绍下这次活动的基本情况。群分享是由讲师在群中通过文字+图片形式给大家分享技术,和线下演讲的内容差不多,只不过讲线下口头的内容转换成文字+图片在群里面分享,同时分享完之后讲师还会在群中跟大家交流及答疑。希望「猫友会群」能够通过今天这样的分享形式让大家更有效率的学习及交流。

由于人员众多,为了高效方便的分享,我们预先定义了如下规则方便大家交流:

  1. 提问请勿使用语音
  2. 请务必不要打开实时对讲
  3. 群分享阶段,请勿开启无关本主题的话题
  4. 为确保讲解流畅,问题请在讨论环节提问,或者直接小窗我(讲师要求互动除外)
  5. 关于分享方式和形式的建议请直接小窗我

分享总体分为三个环节:

  1. 讲师分享 – 图文形式,大约45~60分钟
  2. 问题以及讨论环节
  3. 答谢环节

背景规则介绍完毕,言归正传,今天主题是《阿凹机器人背后的秘密》,很荣幸邀请到了来自「华寓中国」的沙梓社:越狱开发者, 逆向达人,《iOS应用逆向工程》的作者,GitHub 2600+ star,首位WWJC 中国演讲者,「华寓中国」联合创始人。

讲师分享-沙梓社

大家好,我是沙梓社,湖北武汉人,很荣幸加入猫头鹰这个平台,感谢锦哥提供的宝贵机会,可以跟大家分享逆向工程相关的知识。

我今天跟大家分享的主题是《iOS逆向工程简介》,希望能够用尽可能简单的文字和图片,结合尽可能通俗的交流,跟大家普及iOS逆向工程的常识。

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

简单自我介绍一下,我是《iOS应用逆向工程》系列图书的作者,在Cydia(最大的越狱iOS商店)上有11款独立作品,接受过CSDN的专访,书的英文版在GitHub上开源后收获了2600+ stars,是首位在WWJC上发表演讲的中国人,以「提升中国iOS开发者在国际上的地位」为己任。

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

在很多朋友的眼里,iOS逆向工程是一个小众、神秘的方向,为什么我会选择这个小众的方向呢?这要从我最喜欢的一首诗说起。第一次,我是在李开复的自传《世界因你不同》里看到这首诗,当时就感觉身心得到了非常强烈的震撼:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

因为我感觉到自己就是这类人:如果有两条路给我选,我确实会选更少人走的那一条。我发现自己是一个刻意保持自己跟别人不同的人。

在初次读到这首诗时,我还没有开始学习iOS。在从事iOS方面的研究后,又从乔帮主亲自配音的广告中寻找到了灵感,发现苹果跟我的价值观非常一致,就是要追求不同。因此,我更加认定iOS就是我的主攻方向。

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

我的成长之路,就是一条与众不同的未选之路:别人都在学「大众情人」Windows时,我开始学「小众路人」iOS;别人都在学iOS正向开发时,我开始学iOS逆向工程。正是因为追求不同,我写的《iOS应用逆向工程》成为了全球唯一一本iOS逆向相关书籍,而且有美国和韩国的出版社想要引进本书,打破了中国iOS知识产权零输出的尴尬纪录。我用自己的努力代表中国iOS开发者在国际上发声,而且为iOS主流社区所认可,作为中国人我感到非常自豪。

简单来说,我所研究的,主要是iOS应用层的逆向工程,对内核层的逆向工程只是稍有涉猎,没有入门。应用层的逆向工程,我感觉自己玩得差不多了,应用层的所有逆向工程相关问题,都可以用我那本书上介绍过的知识和技术得到解决,我觉得没有太大挑战性了,主要是劳动量问题。到了这个地步,我的规划主要分为2个方向:

  1. 继续从事内核研究,这个方向的终点是「越狱」(越狱即通过漏洞利用拿到iOS的root权限,代表了iOS技术研究的最高境界);
  2. 换个脑子,用一些非技术能力武装自己,让自己成为一专多能的人才。这个方向的终点就是创业。

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

当然,很多朋友会问,IT人员创业的普遍做法,都是去BAT这样的互联网公司干2年,观察一下他们的玩法,然后拉一个团队出来干。你问啥不这么干呢?主要是碰到了一个很好的项目。大公司一直都在那里,想什么时候去都可以;而好项目却不常有,机会过去就过去了,不等人,所以我在准备并不算充分的情况下选择了创业这条路。

交代完了我的背景,咱们可以进入正题了:grin:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

「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.」逆向工程有异曲同工之妙。

举几个通过逆向工程师夷长技的例子:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密
  • 通过逆向工程分析instagram滤镜算法。一个人可以“steal”一个滤镜算法团队的工作成果;
  • 研究微信的网络传输协议,就像@58沈剑 在博客里说到的那样。就我目前对微信九牛一毛的研究来说,就已经发现了一处可以进一步节省流量的地方,但是估计是因为历史遗留问题,这块代码不好动;
  • 看看1Password做了哪些防护。1Password是专门用于保存密码的,类似于保险柜,安全系数必须很高,它把我们的密码存在了哪里,通过什么方式加密?这些都是值得我们学习借鉴的地方。

除了去学习别人的长处,逆向工程还可以发现自己和别人的短处:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

这种低级错误,星巴克可以犯,但1Password不能犯;这取决于你的产品定位。这个错误当然是通过逆向工程发现的。

这是某世界500强企业犯的,通过HTTP协议明文传输用户手机和密码的低级错误:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

这是某突破3亿用户的移动App:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

把传输协议的密钥硬编码在代码里,有逆向工程基础的朋友可以轻松还原整套网络传输协议。淘宝上一堆堆的这个刷榜那个刷赞,就是这个原理。

阿凹,是「借刀杀人」最典型的运用之一:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

阿凹的实现原理,简单说,就是通过逆向工程的方式找出微信iOS客户端的收发信息等私有接口,然后基于自己的逻辑调用这些接口,实现针对特殊事件的自动化应答功能。

我个人最常用的iOS逆向工程工具主要有这些:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

  • dumpdecrypted:将苹果加过密的App砸壳。通过AppStore处理的App,都是加过密的,不能直接进行二进制分析,需要先解秘,业界称为「砸壳」。它的原理是等App完全加载进内存,得到解密后,再把解密过的内存给dump出来,形成解密后的二进制文件,可以直接分析。
  • class-dump:导出MachO文件里的ObjC类及方法定义。因为ObjC是一门强烈依赖于运行时的语言,它的文件类型是MachO(类比于Windows里的PE文件类型),MachO里存放了大量运行时需要用到的信息,从中可以收集整理,还原出一个App源代码里的ObjC头文件。
  • CydiaSubstrate:将第三方动态库注入进程。它是越狱插件的存在前提。在iOS开机时,会把特定目录下的所有库,给加载到指定的进程里,俗称「hook」或「钩子」。
  • Cycript:用JS语法写ObjC方法。这是Cydia之父Saurik发明的一门语言,我个人主要用它来测试私有函数。
  • Theos:越狱插件开发工具。是我的书序作者DHowett开发的。iOS正向开发用Xcode,逆向开发用Theos。
  • IDA:全平台反汇编、反编译工具。搞技术的一般都听说过这个软件,就不多介绍了。
  • Hopper:OSX反汇编、反编译工具。比IDA便宜了1000倍,但功能跟IDA差不多;主攻苹果系操作系统。
  • debugserver + LLDB:动态调试器。是大名鼎鼎的「苹果版」GDB。

class-dump的效果,图中显示的是新浪微博App的所有头文件:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

Cycript的效果,可以看到微信星号密码的明文:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

Theos开发插件的运行效果:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

所有进程的[NSDictionary dictionaryWithContentsOfFile:]方法均被「hook」,可以随意篡改。

IDA的效果:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

对于熟悉汇编语言(图里是ARM汇编)的朋友来说,所有未加密的二进制文件,均等同于开源。这是什么概念,做技术的都懂。

接下来我简单介绍下阿凹的制作流程:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

核心在于找到收发微信消息的函数,然后加以修改利用:

猫友会大讲坛第1期 – 阿凹机器人背后的秘密
  1. 用dumpdecrypted给微信砸壳,解密出的文件近50M: 猫友会大讲坛第1期 – 阿凹机器人背后的秘密
  2. class-dump出微信的所有头文件,近7000个: 猫友会大讲坛第1期 – 阿凹机器人背后的秘密
  3. 定位到收消息的View,进而定位到V对应的C,找出逻辑层的收消息函数。
  4. 定位到发消息的按钮(也是一个View),进而定位到对应的C,找出逻辑层的发消息函数(这个过程没法用截图表现出来,所以我只简单描述下)。
  5. 组合收发函数,完成阿凹的逻辑,最后写代码: 猫友会大讲坛第1期 – 阿凹机器人背后的秘密

我要介绍的就是这么多。

问题及讨论环节

大家有任何关于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++确实不好逆向

猫友会大讲坛第1期 – 阿凹机器人背后的秘密

最后插播一则广告

我(沙梓社)在上海创业,现在找靠谱java后端,找的火急火燎。这里有一个我们的简介:http://iosre.com/t/30-ios-hacker/1618;和我的2015年终总结:http://iosre.com/t/topic/2523。如果大家在上海有认识的靠谱java后端,麻烦帮我引荐一下,叩谢!

原文  http://mtydev.net/?p=585
正文到此结束
Loading...