by 知识小集 · Lefe_x前端
最近各大“媒体”都在报道《iOS应用逆向与安全》这本书,这是自“小黄书”出版后的又一本关于逆向安全的书。而目前不少 iOS 开发者对逆向还很是“小白”,以致于盲目地以为逆向很难、很厉害。而这本书的出现,无疑为逆向这个世界打开了另外一扇窗,咱们一块儿看看这扇窗里究竟“藏”了什么。本文并不打算介绍书中具体细节,只是说明每一章都讲了哪些内容,点到为止。ios
本章主要对逆向总体进行描述,分别从应用中存在的风险、如何保护应用的安全、和开发工具的使用来介绍。而我以为本章的核心是掌握逆向的流程和做用,了解 APP 开发中须要注意的安全问题。git
逆向流程: 逆向的整个流程基本是相同的,而这些流程能够总结为:github
**应用场景:**掌握逆向确定很是有用,若是你想从事安全方面的工做,能够深究,不然没必要投入太多的精力,毕竟正向开发中不多用到逆向知识。学习逆向知识能够总结为:算法
本章主要讲解越狱在逆向中的做用及越狱工具的使用。这里须要强调一点,逆向不必定须要越狱,而想要更好地掌握逆向的原理,一台越狱设备是必不可少的。目前市面上不少越狱工具,也提供了一键越狱,读者可自行搜索。数据库
登陆越狱设备:小程序
手机越狱后,会安装一个 Cydia 的软件,它主要用来在越狱手机上安装各类工具,至关于越狱中的 “App Store” 。想要读取越狱设备中的资源文件,必须进行远程登陆。搞服务器的同窗都知道使用 SSH 进行远程登陆,而登陆越狱设备也可使用 SSH 登陆。经过 Cydia 搜索 OpenSSH 来安装便可,安装完后执行:安全
sudo ssh root@手机ip地址
复制代码
登陆成功便可对越狱设备进行操做了。做者还介绍了其它登陆越狱设备的方式,使用公钥匙登陆,USB 登陆。bash
文件目录:服务器
若是想查看设备的文件系统,在 Mac 上可以使用 iFunBox,手机端须要安装 Apple File Conduit 2 。安装成功后,便可经过 iFunBox 查看手机的目录结构,好比安装的 APP 沙盒目录,系统自代 APP 的沙盒目录,各类 Frameworks 等等。
越狱必备工具
你可能仅仅停留在对这些工具(dumpdecrypted、Clutch、class-dump、Reveal、Cycript、Charles、Wireshark)的使用上,好比我。而做者却给咱们讲解了原理,可见他的功力很深。
dumpdecrypted
AppStore 中的应用都是通过加密的,而逆向的前提须要把加密的内容解密出来。dumpdecrypted 这个工具就是专干这件事的。固然,若是你不想解密,能够直接从越狱市场上下载被解密的 APP。不过有时候越狱市场上没有你要的应用就不得不自行解密了。它的原理引用做者的原话:
dumpdecrypted 是一个开源的工具,它会注入可执行文件,动态地从内存中 dump 出解密后的内容。
Clutch
除了使用 dumpdecrypted 进行解密,Clutch 也能够作到。不过做者提到使用这个常常会出错,建议使用 dumpdecrypted。
class-dump
class-dump 的做用是从可执行文件中导出类、方法、属性信息的工具,这里须要强调一下可执行文件,被解密的 APP 应用中会有一个可执行文件(Mach-O)。能够从 xxx.app 中的 info.plist 文件找到 Executable file 它的值便是 xxx.app 的可执行文件。使用 MatchOView 能够查看 Mach-O 文件。
导出 We.app 的头文件:
class-dump -H ~/Desktop/reverse/ipa/We.app -o ~/Desktop/reverse/header/we
复制代码
Reveal
是用来查看APP界面的工具,查看第三方 APP 不必定非用越狱设备。
Cycript
Cycript 是一个容许开发者使用 Objective-C++ 和 JavaScript 组合语法查看及修改运行时 APP 的内存信息的工具。在逆向中主要用来验证某些猜想是否正确,查看界面信息等。好比查看当前显示的 VC,某个对象执行某个函数后的结果,动态修改某个 UI 的信息。
Charles、Wireshark
介绍了这两个抓包工具的使用。
这一章主要介绍正向开发的一些知识,而这些知识对逆向开发很重要。
ipa 包
获取应用的 ipa 包,主要能够经过两种方式获取:
应用包的构建过程:
界面与事件传递
介绍了 iOS 中的 UI 、事件传递和事件响应。
类与方法
主要介绍了类的底层实现,OC 中的消息机制,runtime 的一些使用场景。
App签名
正向开发中,每一个同窗都会经历一次苹果的证书配置。而做者在这里主要讲解了 App 签名的原理,这样为逆向重签名作好铺垫。
前面四章主要为后四章作一个铺垫,从接下来的章节中正式开启了逆向。本章主要从静态分析和动态调试来介绍逆向。
静态分析,指在不容许 App 的前提下对程序分析的一种方法。通常有如下几种方式:
反汇编
反汇编主要有两个工具:Hopper 和 IDA。而这两个工具能够查看源代码实现的汇编代码,关键还能够查看伪代码。之前一直以为 Hopper 很差用就没用,今天下载了一个用起来发现比 IDA 用着舒服。
Hopper 只支持 Mac 和 Linux,相对于 IDA 比较弱一些。而 IDA 支持 Windows 平台。
静态库分析
有时候想看某个静态库的实现,其实也可使用 Hopper 查看他的汇编代码。
➜ 5.1 静态分析 ls
Crashlytics UserLogin
➜ 5.1 静态分析 lipo -info Crashlytics
Architectures in the fat file: Crashlytics are: armv7 armv7s i386 x86_64 arm64
➜ 5.1 静态分析 lipo Crashlytics -thin arm64 -output Crashlytics_arm64
➜ 5.1 静态分析 mkdir Objects
➜ 5.1 静态分析 cd Objects
➜ Objects ar -x ../Crashlytics_arm64
➜ Objects grep "Upload" -rn ./
Binary file .//CLSReportsController.o matches
Binary file .//CLSCrashReportingController.o matches
Binary file .//CLSNetworkClient.o matches
➜ Objects otool -l Crashlytics.o|grep bitcode
sectname __bitcode
➜ Objects ld -r -arch arm64 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -bitcode_bundle ./*.o -o ../output
复制代码
动态调试
动态调试是在程序运行的时候执行一系列操做,好比获取某个对象的值,执行上下文等。
LLDB 动态调试:正向开发中常会使用到 LLDB 来调试程序,而在逆向中它也发挥很大做用。
用 Xcode 调试第三方应用:使用 Xcode 在非越狱设备中调试第三方应用、进行符号的还原、查看带符号的堆栈调用。不过调试的时候须要一个第三方应用。
Theos
越狱开发中除了 Thoes 外还有一个叫 iOSOpenDev 的工具,功能和 Thoes 是同样的,不一样点是iOSOpenDev 是整合到 Xcode 中使用的,而 MonkeyDev 和 iOSOpenDev 属于同一类型的工具。
MonkeyDev
MonkeyDev 是做者开发的一个工具,主要用 Xcode 进行越狱开发。具体使用能够查看 MonkeyDev 的 wiki 。
这一章,看着比较吃力。不少都没接触到,这里简单的作个介绍,若是之后用到这部份内容再继续深究。
程序加载
在程序执行 Main 函数以前,都作了哪些事。
Mach-O 文件格式
对于每一个 ipa 包,都会包含一个可执行文件,而这个文件就是 Mach-O 文件。
ARM 汇编
逆向若是想看懂代码,那么必须学会汇编。
hook
hook 直译为 钩子,经过 hook 能够改变程序执行逻辑。hook 最多见的有如下三种方式:
经过 runtime 交换方法的实现。
fishhook 是 facebook 开源的一个库。
A library that enables dynamically rebinding symbols in Mach-O binaries running on iOS.
动态库
特色:
在逆向中会常常用到动态库,好比使用 Reveal 调试第三方应用时须要把 RevealServer. framework 注入到 APP 程序中。能够经过引入头文件的方式调用 和 dlopen 动态加载的方式调用动态库。
这章主要应用前几章学到的知识。而逆向开发能够在越狱设备和非越狱设备中开发。
越狱设备
目标是给 WhatsApp 长按消息添加一个收藏菜单,并在设置中添加已收藏的消息。分别在越狱设备、非越狱设备进行分析。
非越狱设备
目标是给 WhatsApp 添加自动回复功能。越狱设备分析有诸多繁琐的工做,好比导出头文件,使用 Reveal,使用 LLDB 调试不方便等。因此做者把这些功能都集成到了 MonkeyDev 这个工具中,经过 MonkeyDev 新建工程将自动集成 class-dump、符号还原、Reveal、Cycript、注入动态库、自动重签名等一系列重复性的工做,能够直接在非越狱设备上进行逆向分析。具体使用参考
Frida 实战应用
Frida 是一款跨平台的注入工具,经过注入 JS 与 Native 的 JS 引擎进行交互,从而执行 Native 的代码进行 hook 和动态调用。这个工具能够用于 Android 和 iOS,它能够经过一段 JS 来调试应用。
前面讲了这么多能够调试别人的 App 如同调试本身的同样,这就须要在开发的过程当中来保护咱们本身的 App 免受攻击,重要的数据须要进行加密处理。而本章主要讲有哪些手段能够保护咱们的 App 尽量的不被破解。主要采用的手段有:
- 数据加密:静态字符串、本地存储及网络传输加密
不论是本地的数据仍是网络中传输的数据,对敏感数据须要采用加密算法进行加密处理,而经常使用的加密算法有 AES,RSA。对于网络传输的数据可使用 AES+RSA 的方式对数据进行加密,若是使用 Https 的方式须要对证书进行校验。而对于一些常量字符串有时候也须要加密处理,以防止被静态分析。这里做者提使用 libclang 方式,具体 源码。
- 静态混淆:类名、方法名、属性的混淆;
使用 class-dump 导出的头文件很容易根据名字知道某个类,方法的做用,这时候须要对类名,方法名进行混淆。第一种方法:经过宏定义混淆,在 pch 文件中好比这样写 #define MyClass 89s343ss
。网上有一个开源的库 ios-class-guard。第二种方法:二进制修改,修改可执行文件的 __obj_classname
和 objc_methname
。
- 动态保护:反调试、注入检测、hook 检测,越狱检测、签名检测等;
虽然静态混淆后不能猜到类名方法名的做用,可是若是采用动态的方式仍是能知道某些方法的参数、以及加密后的数据等。这就是要防动态调试。
- 代码混淆:提升分析难度
未混淆的代码能够经过 Hopper 和 IDA 等汇编工具获得汇编代码,甚至能够获得对应的伪代码。为了提升分析难度,须要对代码进行混淆。混淆主要经过 LLVM。
知识小集是一个团队公众号,主要定位在移动开发领域,分享移动开发技术,包括 iOS、Android、小程序、移动前端、React Native、weex 等。每周都会有 原创 文章分享,咱们的文章都会在公众号首发。欢迎关注查看更多内容。