53

来,教你如何破解一个 iOS App1539176455765609

 5 years ago
source link: https://mp.weixin.qq.com/s/4tIl10-F5rbjl6CHtXWFmA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

mEZ77zZ.gif

今天给大家来一个硬知识科普。

黑客中有一类人,注定跟程序开发者是“死对头”,是宿敌。

RrYJzaB.png!web

他们总跟开发者对着干:

开发者的日常是用一段段代码写出一个个软件,实现各种功能。

他们的日常则是把一个个完整的软件逆推,还原成一段段代码。

他们,就是传说中的 “逆向工程师”

假如让你钥匙撬开一把锁,你或许感到无从下手,但如果这把锁的外壳完全透明的,内部结构清晰可见,你便会觉得容易了许多。

fm6RraY.jpg!web

在赛博世界里,逆向工程就有这种看穿一个物体的本领。

22QjeiA.png!web

给他们一个手机APP、电脑程序,用不了多久,就能逆推出程序的运行逻辑,找到里头的关键代码,篡改、破解、发现漏洞。

人们把这种技术叫做“逆向工程”。 我们在网上看到的各种破解软件,多半都跟逆向工程有关。

然鹅,

逆向的江湖有正亦有邪。

正义的逆向者只是做安全研究,而那些邪恶的逆向者却拿着这项技能四处干坏事牟利。

比如盗版软件。开发者们累死累活才写好的程序,分分钟就被人逆向破解,植入广告和木马,重新打包成盗版。 拼多多变成拼夕夕,一款软件多出好几十个远方表亲。

uiYveu7.jpg!web

(网曝各种山寨的彩票软件)

再比如有朋友总抢不到群红包,怀疑有人用了外挂,其实所谓的“抢红包外挂”就是有人逆向破解了微信APP,在里头添加了自动领红包的代码。

eMz6F3U.jpg!web

(网上流传的破解软件)

对于那些跟钱打交道的金融类APP,逆向破解更是噩梦,一旦APP被逆向,就很容易面临巨额损失。

最近我撩到一位逆向技术大牛,聊了聊手机APP的破解与反破解,今天与诸位浅友分享一下。

话说,这位大牛有点奇特,虽然他是个逆向技术高手,却不去破解别人的手机应用。相反,他的日常是带着团队专门帮 iOS 应用开发者做 反破解

来,大家认识一下这位新朋友,他就是通付盾的研发副总裁、 iOS 加固项目的总负责人,华保健。

Z7nQ3yf.jpg!web

此人灰常厉害,他是中科大的计算机学博士,做了几十年信息安全、系统渗透等方面的工作, 2015年前后还 在微软主导过 Office 365 和 必应搜索(Bing)的研发项目,前两年加入通付盾,负责技术研发。

话说华博士一心做技术,人比较腼腆,所以我没能拿到他的1080P高清无码近照,只能从他的微信头像里扣下一张AV画质的照片。 关于他的技术故事,我相信非常精彩,不过来日方长,回头再写。

今天继续聊破解和反破解。

Z3Qvemq.png!web

华保健告诉我,要破解一个苹果手机的APP,其实有一些标准套路。

第一步是 脱壳

所谓“壳”,就是原有的软件代码上再外包一层“壳代码”。机器运行程序时,先运行壳代码,这样可以保护应用的代码逻辑不容易暴露。

苹果商店会给每个上架的 iOS APP 都加一层壳。

“不过,这层自带的壳并没什么实质性作用。” 

华保健说,由于 苹果商店给全世界几百万个 APP 都用的同一种加壳方法,因此全世界的逆向工程师、黑客们都盯着它,老早就做出了针对这种壳的脱壳工具,开源在网上供免费下载,总之,苹果自带的壳 分分钟就能脱掉。

脱壳之后,第二步是反编译。

到这一步,幺哥必须给大家先普及一个有趣的计算机知识。

各位同学请看,下图中的两个人是早期的程序员,他们正在检查代码:

u6ZziyR.jpg!web

也不知道是谁出的主意,早期的计算机代码就这么直接用打孔的方式记录在长长的纸带上。 打孔代表0,没打孔代表1,对应着电子元件的开闭状态,以此控制机器运行。

这种原始的代码记录方式叫 “机器码”, 是一种二进制编码。

rymaYrA.jpg!web

相信你已经发现,这种代码记录方式用起来非常麻烦。

据说,当时要编写一个程序,光是打孔就得几天几夜,还容易出错,程序员们不仅每天都在打孔、改错,还得记住一堆 0101010 这样长长的代码。

后来有人发明了一种 汇编语言 ,这才开始用英文字符来替代一串串的二进制字符。

从此,像1000100111011000 这样的代码就可以用“mov ax,bx”这样的一串字母来替代,它的意思是“把b寄存器 (一种机器元件) 里的数据挪到a寄存器”。

FnEzUzA.png!web

再后来,程序越来越复杂,汇编语言也不够用, 更高级的语言就诞生了。比如   C、C++、Java、Python、PHP、Rust、Nodejs 等等……

从此,程序员圈子里便有了“谁才是世界上最好的编程语言之争”……

AV36buA.jpg!web

所以,当今程序世界里的规则是这样的:

程序员们先用 高级语言 写好程序代码,编译器把它们编译成机器能读懂的机器码用来执行。

逆向工程师的工作恰恰相反,他们直接从机器里抓取机器码,然后反汇编成汇编语言,再反编译成高级语言。

BFb6fyN.jpg!web

到这里,恭喜你已经学会了反编译的原理,现在我们继续破解iOS应用。

“反编译工具网上有很多,但大体上方法分为两类: 静态分析 动态调试 。”

华保健说,所谓“静态分析”就是在程序不运行的状态直接反编译,把它从二进制的机器码转化成十六进制的编码、再到汇编代码,再到人类能直接理解的语言,一路转化。

在这个过程中,如果对方没有做任何防护措施,你就能直接找到并改掉里头的关键信息,比如版权信息、游戏数值等等,单挑 BOSS 怒刷装备。

ymU77jj.jpg!web

(十六进制查看程序是这样子,图源自网络)

华保健告诉我,由于 反编译涉及很多不同的语言,所以没法把机器码直接还原成源代码,但是能用 伪代码 的形式把源代码的逻辑还原个七七八八。

所谓动态调试,顾名思义就是让程序先运行起来,在里头输入不同的值来观察各种组件、函数的反应,从而梳理出它们之间的关系。

如果把静态分析比作翻译一本外国漫画,动态调试就是翻译一部蓝光高清有码外国大片。

在整个过程中,逆向工程师需要反复调试,并且需要给程序打上“断点”,随时暂停下来慢慢欣赏,反复把玩。

iIbU3ye.jpg!web

经过这两步,一个程序的运行逻辑就被完全还原。 接下来,只需要找到登录验证、加密、授权等关键部位找出漏洞,篡改掉关键数据,完成破解,为所欲为。

最后,再从网上买个iOS签名,就能把代码重新打包成一个APP,安装在自己或别人的手机里。

AfYbMjJ.jpg!web

华保健 :到这一步,一个iOS应用破解的流程就讲完啦~ 其实破解很简单,就三步,脱壳、反编译、签名打包,懂了吗?

谢幺 :懂了!~

华保健:好的,既然懂了,现在随便找个APP去练练手吧~不如就试试破解微信吧!

谢幺 :呃……这……

iaMrAzv.jpg!web

veENNjQ.png!web懂了逆向破解的基本套路,自然也就能对症下药。

华保健的解决方法是, 给APP做加固。

如果你玩过《植物大战僵尸》这款游戏,就能理解“APP加固”的意义。

nEzIVvI.jpg!web

华保健告诉我,通付盾的iOS加固第一步是 “环境检测”

他们会在 APP 的最外层布置很多探针,探针实时监测运行环境,一旦发现手机处于越狱状态,或者发现环境中有逆向分析工具,就立即进入警戒状态,告警提示,或者直接让程序崩溃。

这让我不禁脑补出一万个土豆雷围着代码的样子……

qm2um27.jpg!web

第二步,叫威胁感知。

除了检测运行环境,探针还会实时监测应用的运行状态,因为一旦程序中途中止,那就说明有人设置了“程序断点”,正在做动态调试。

第三步和第四步有些类似,分别是 常量加密 符号隐藏

代码中有一些内容永远是破解者的重点关注对象,比如一些名叫 password 的字符串,比如一些隐秘的URL。

了防止破解者定位到这些关键位置,“常量加密”会把这些关键的字符都加密隐藏掉。 “符号隐藏”类似,也是把一些类名、方法名、属性名加密隐藏起来。

总之,这两步的关键在于 “打码”,保护关键部位。

第五步是“代码逻辑混淆”。

这个其实很好理解,我给大家做个比喻:

你想去超市买冈本卷纸杜蕾斯,但又是不想让人知道,于是你先去 买了冈本和地瓜回来,又去操场跑两圈,再去趟超市买了卷纸和可乐,最后再去买了杜蕾斯回来。

虽然最后都买回来了冈本卷纸杜蕾斯,但是你隐藏了自己的行动目的。

quiYvqu.jpg!web

“代码逻辑混淆”就是这样,在清晰明了的代码里加入各种多余的垃圾指令和代码,把原来的逻辑拆分成各种怪癖语法,改得连亲妈都不认识,从而防止破解。

“只要做完这几步,逆向破解的难度就会大大提高,虽然从理论上来讲没有破解不了的系统,但是只要把破解成本提高到足够高,黑客就会放弃破解,或者转向那些更容易的目标。”

华保健说。

只要做完加固就能抗住大部分破解?

是的。

听起来,反破解挺简单,就那么回事。

然鹅,现实永远比你想象得残酷。

ryqaYvZ.png!web

“令我头疼的,不是扛不住逆向破解,而是开发者们都不肯用加固。”

华保健说,目前市面上只有20%左右的 iOS 应用做了加固,其中金融类的APP比例略高,但也只有50%左右,很多中小型金融机构甚至银行的APP都没做加固。

谢幺:纳尼?既然加固这么安全,为什么大家都喜欢裸奔呢?

华保健:因为裸奔更凉快呀~

谢幺:???

华保健说, 以往的加固方法虽然安全,但弊端也很明显, 这跟“衣服穿多了会显得臃肿”是一个道理 (果然是裸奔更凉快。。。 。。。 )

首先是拖慢程序性能。

就拿代码逻辑混淆来说,原本一步能干完的活,现在非得分成好多步,为了迷惑对手还得故意磨洋工,那可不就拖慢性能了。

其次是程序体积会更大。

“一般来说,基于源码的加固方式 能让程序增大20~30%的体积” ,华保健直言,这一点很多开发者都接受不了,因为体积增大会降低用户的下载欲望。

不过,最令开发者受不了的是加固带来的代码泄露风险,以及兼容性问题。

“传统的 iOS 应用加固技术普遍采用的是源码编译的方式, 需要开发者把程序的源代码提交给第三方加固平台 ,光这一点就让不少开发者打退堂鼓。”

RrMfAjN.jpg!web

“并且基于源码的加固过程需要反复改动代码, 可能影响对机型、系统版本的兼容适配 ,导致程序闪退,影响用户体验。” 

华保健坦言,在很长一段时间里,他不是在琢磨如何抗住更厉害的逆向破解者,而是在解决“怎么让开发者愿意用加固” 的问题。

一开始,他们试着“戴着镣铐跳舞”,牺牲一小部分安全性来提高性能,却发现解决不了多少问题,并且一味地降低加固强度显然不是个办法。

华保健带着团队研究了大半年,这才想到一个新的思路。

于是他们开始借鉴安卓应用“加壳”的技术思路,直接对 iOS 应用程序的 IPA (iOS程序安装包) 进行一层专门的加壳。在此基础上,再用 底层二进制代码从程序中抽取出关键部分的代码逻辑进行混淆。

如此一来,开发者就不再需要把程序源代码上传给第三方加固厂商,并且由于不用对源代码进行大量逻辑混淆和修改,加固的性能、安装包体积、兼容性也都可以兼顾。

rUNZ3q6.jpg!web

按照华保健的说法,开发者 把 IPA 安装包上传到他们的加固平台,10分钟就能直接加固完成。

通付盾的iOS加固具体的体验和强度如何, 幺哥其实没来得及做详细测试,诸位有兴趣可以自己试试。

不过话说到这,我忽然发现 ,其实华保健遇到的“安全与体验如何平衡”的问题,大部分安全创业者都会遇到。

qiuaUvn.png!web

之前就遇到一个做安全创业的朋友很纳闷,他说自家产品明明比竞争对手的技术更好,更安全,为什么就是干不过别的竞争对手?

最后转了一大圈才发现,因为他的产品太难用了!我的这位朋友是个耿直的技术流,只想着一股脑把安全强度做到最高,却忽略了一件事: 安全的本质是维护业务,技术的本质是输出实用价值。

人也好公司也好,偶尔换个视角,兴许看起来像是一种妥协,但实际上也是一种以退为进。

Mn2qe2A.jpg!web

最后再介绍一下我自己吧,我是 谢幺 ,科技科普作者一枚, 日常是把各种高大上的技术知识、黑科技讲得通俗有趣。 如果有什么有意思的科技类问题,可以加我的个人 微信:dexter0 不想走丢的话,请关注 【浅黑科技】

---- 点击图片阅读更多精彩文章 ----

v2aaA3R.jpg!webIVBbAvJ.jpg!web

让普通人读懂技术

mm6Zfyz.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK