iOS逆向攻防实战-飞
发布时间: 2023-07-06
前言

本文是自己对iOS逆向工程领域所学的一个总结,文中所用的例子仅为学习研究使用。

1. 逆向工程是什么?

从iOS应用的功能或行为入手,通过脱壳、运行时分析、静态分析、动态调试、Hook、注入等一系列技术手段,推导出目标文件的结构、流程、算法、代码等,称为“iOS应用逆向工程。

iOS逆向工程包括但不限于以下内容:

2. 为什么要学习逆向工程?

通常我们对某个APP进行逆向是为了在没有源代码的情况下了解这个APP的结构或该APP某个关键功能的代码实现等,比如可以针对某个第三方APP进行界面布局或者功能逻辑的分析等。

本文将介绍iOS逆向领域中的一些常用攻防技术,运用这些技术来分析第三方APP中存在的一些安全问题并且给出防御方案。

3. 如何开始逆向?

首先我们需要准备一台越狱手机。由于iOS平台存在着沙盒机制,沙盒的原理是把应用程序生成和修改的文件重定向到自身文件夹中,在沙盒机制下,每个程序之间的文件夹不能互相访问。所以非越狱手机无法了解它的内部结构、运行时机制等。

越狱后推荐安装的插件 (越狱后会自动安装一个叫做 Cydia的应用,通过Cydia安装插件) :

Cydia Substrate :逆向必备基本框架,封装了很多函数,加入了安全的防崩溃保护机制,使插件开发变得简单高效。

AFC2:用于激活助手类工具对iOS设备所有路径的访问权限。

adv-cmds:提供ps命令,用于查看当前运行进程的PID以及应用的路径。

AppSync Unified:用来绕过系统对应用的签名验证,可以随意安装和运行脱壳后的ipa。

Filza File Manager:可以在iPhone上自由访问iOS文件系统。

NewTerm 2:能运行在手机上的终端工具。

4. 脱壳

iOS端App在上线之前会由苹果商店进行FairPlayDRM数字版权加密保护(称为“加壳”)。

4.1. 什么是加壳?

利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。

要对应用进行分析,就必须先解密(称为“脱壳”),从而得到原始未加密的二进制文件。

4.2. 怎么脱壳?

iOS中有很多好用的脱壳工具,比如Clutch、dumpdecrypted、AppCrackr、Crackulous。

以dumpdecrypted为例进行脱壳,流程如下:

a. 首先我们要生成“砸壳”用的动态库dumpdecrypted.dylib;

b. 到越狱手机上寻找要“砸壳”的app路径(通过ssh连接设备,在终端用ps -e | grep wordios命令获取设备当前运行的所有应用信息中名字包括wordios的应用,我们可以找到wordios的运行路径;

c. 使用Cycript注入wordios进程,然后输入以下指令获取Document目录


d. 然后通过爱思助手进入该目录,将dumpdecrypted.dylib拷贝到该目录下;

e. 终端进入该目录,执行下方命令:

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/48C8B703-726F-4304-89E8-7D6F725792F4/wordios.app/wordios

f. 执行命令后会生成已脱壳的可执行文件,后缀名为.decrypted;


g. 通过MachOView工具分析,LC_ENCRYPTION_INFO_64 中的Crypt ID 为0,说明脱壳成功。


5. 攻5.1. 攻击手段一:运行时分析

运行时分析是常用的攻击手段,具体方案或工具有Cycript / Reveal / LookinLoader / Flex / class-dump等。

5.1.1. Cycript

Cycript是一款脚本语言,混合了OC与JS语法解释器,能够探测和修改运行中的应用程序,主要用于注入目标程序来实现运行时调试,在重启程序后所有的修改会失效。

利用Cycript向目标App注入代码,从表面现象入手来获取当前的界面布局及控制器,从而定位可疑方法或函数,然后进行各种调用测试,最终定位被逆向功能的入口。

安装方法: 越狱设备直接在Cydia中安装

使用方法:
a. 注入目标程序,例如注入运行中的wordios;

b. 使用Cycript语法进行运行时分析。

实例一:

查看wordios的BundleId / APP运行路径 / DocumentPath / CachePath / 当前的KeyWindow / 当前控制器 / 视图层级等等

其中jjcript是我事先封装好的一个接口文件,部分接口实现如下:

实例二:获取按钮点击事件

Cycript还可以获取某个按钮的点击事件,也就是方法名,这对我们分析代码逻辑有很大的帮助,比如我们在使用某社交APP时,使用某个付费功能,如果你是非会员就会弹出一个会员引导弹框,这时候我们可以通过分析这个点击事件,看能否绕过付费的代码逻辑直接使用付费功能。


5.1.2. Reveal / LookinLoader

Reveal / LookinLoader 是一款强大的UI调试工具,可以调试任何一个iOS应用。它可以在运行时查看App的界面层级关系,还可以实时修改程序界面,不用重新运行程序就可以看到修改之后的效果,免去了每次修改代码后又重新启动的过程。逆向工程里面通常用Reveal / LookinLoader来快速定位感兴趣的控件,进而找到控制器,再用Cycript进行事件分析。

(Reveal)

(LookinLoader)

5.1.3. Flex

Flex是一个iOS应用的内部调试工具。当它加载时,会向目标程序上方添加一个悬浮的工具栏,通过这个工具栏可以查看和修改视图的层级结构、动态修改类的属性、动态调用实例和方法、动态查看类和框架以及动态修改UI等。


5.1.4. class-dump

class-dump是一个命令行工具,它利用Object-C语言的运行时特性将二进制文件中的类、方法及属性等信息导出为头文件。

下载方法:从http://stevenygard.com/projects/class-dump/下载最新安装包,双击打开,将“class-dump”拖动到/usr/local/bin目录下即可使用。

以wordios为例来讲解它的使用方法:

class-dump -S -s -H wordios.decrypted -o ./Headers


5.2. 攻击手段二:监听和拦截函数调用

Frida是一个跨平台的轻量级Hook框架,支持所有主流操作系统,它可以帮助逆向研究人员对指定的进程进行分析。它主要提供了精简的Python接口和功能丰富的JS接口,除了使用自身的控制台交互以外,还可以利用Python将JS脚本库注入目标进程。使用Frida可以获取进程详细信息、拦截和调用指定函数、注入代码、修改函数、从iOS应用程序中dump类和类方法信息等。

Frida能实现很多功能,以下介绍几种比较常用的功能:

5.2.1. 获取可用设备列表

● frida-ls-devices

图中显示有一个连接usb接口名为iPhone的设备。

5.2.2. 获取设备进程列表

● frida-ps -U //-U 代表连接到 USB 设备


图中显示该设备正在运行的进程有文档表格编辑,其id为2432。

5.2.3. 结束设备上的某个进程

frida-kill -U 2432//2432就是上面所获取的文档表格编辑的id


在终端运行之后就会立即杀死文档表格编辑进程。

5.2.4. 跟踪函数 / 方法调用

跟踪函数: 比如跟踪id为9218的进程中的compress函数:

frida-trace -U -i compress 9218

当触发该方法时会在终端输出。

跟踪 OC 方法: 比如跟踪文档表格编辑中CourseVC 控制器中的viewWillAppear方法

frida-trace -U -m "-[wordios.CourseVC viewWillAppear*]" 文档表格编辑 //由于该app做了代码混淆处理,经过分析,类名需要wordios.CourseVC这样调用才行。



每次进入CourseVC 界面的时候就会触发viewWillAppear,如图终端中输出了2次,代表CourseVC 触发了2次viewWillAppear方法。

5.2.5. 拦截某个类的所有方法

比如以下场景,文档表格编辑的教程界面,点击Word文档之后,如果是非会员就会弹出解锁功能

微信