最新消息:本站技术交流 QQ 群:28124927

【Frida实战】在 iOS 上分析应用

iOS/MacOSX/移动安全 exchen 13633浏览 0评论

本文是 Frida 分析实战系列教程的第一篇,以 iOS 平台讲解 Frida 的基本使用,后续还会继续分享更多关于 Frida 实战的使用技巧。Frida 是一个跨平台的动态分析工具,支持 iOS、Android、macOS 等主流的操作系统,提供了功能丰富的 Python 和 JavaScript 接口,能够在运行时注入进程,获取进程相关信息、Hook 函数、修改参数、调用指定函数等等,逆向研究人员如果运用好 Frida 这一神兵利器,能够快速定位到关键点,提高分析的效率。

安装 Frida

Frida 的使用类似于 LLDB 与 debugserver 那样需要安装在 macOS 和 iOS 上,macOS 做为控制端,iOS 做为被控端,由控制端发送指令去操作被控制端。默认 macOS 没有安装 pip,首先安装 pip,如果已经安装的可以忽略

安装 frida 和 frida-tools

然后在 iOS 上打开 Cydia 添加源:https://build.frida.re,如果设备是 64 位的安装 Frida,如果是 32 位的安装 Frida for 32-bit devices。需要注意的是由于 Frida 官方源服务器在国外,下载速度可能会非常慢,有时需要半个小时才能完成,我建议大家换成 iOS 安全论坛的源,这样下载会快很多,地址是 http://apt.ioshacker.net。

Frida 相关工具

Frida安装完后,打开 /Users/exchen/Library/Python/2.7/bin 目录可以看到分别有 frida、frida-ls-devices、frida-ps、frida-kill、frida-trace、frida-discover 这几个工具,下面我们介绍这些工具的使用方法。

1. frida-ls-devices

frida-ls-devices 用于查看当前的设备列表,一般在多个设备连接时会用到,它能显示当前所有连接设备的 Id,这个 Id 实际上就是设备的 UDID,获取的信息如下:

2. frida-ps

frida-ps 用于查看设备上当前所有运行的进程,我们来查看它的帮助信息:

--version 显示版本号。

-D 指定需要连接的设备 UDID,在多个设备连接时才会用到,如果只有一个设备不必用它。

-U 连接 USB 设备。

-a 只显示正在运行的应用。

-i 显示所有已安装的应用。

下面我们看看实际操作 frida-ps 几个用法:

(1) 查看进程 USB 设备的进程,这里查看到的是所有正在运行的进程,包括 Daemon(守护程序)。

还可以使用 grep 进行过滤,比如只需要查看 Cydia。

(2) 查看正在运行的应用。

(3) 查看所有安装的应用。

(4) 如果有多个设备时,可以指定查看某个设备的进程。

3. frida-kill

frida-kill 用于结束进程,需要指定应用名称或 PID,比如结束 App Store 进程

如果 App Store 进程的 PID 是 1161

4. frida-trace

frida-trace 用于跟踪函数或者 Objective-C 方法的调用,frida-trace -h 能够查看它的帮助,最重要的有下面几个参数:

-i 跟踪某个函数,-x 排除某个函数。

-m 跟踪某个 Objective-C 方法,-M 排除某个 Objective-C 方法。

-a 跟踪某一个地址,需要指名模块的名称。

接下来实际操作一下,比如需要跟踪 Cydia 点击关于的操作,输入以下命令,它会在当前目录下生成一个 handlers 目录,然后再生成一个 HomeController_aboutButtonClicked.js 文件,在 Cydia 点击关于时,会输出以下信息,按 Ctrl-C 可以停止跟踪。

打开 HomeController_aboutButtonClock.js 文件,会看到有两个函数,onEnter 是进入该函数时会执行的代码,onLeave 是该函数执行完离开时会执行的代码,在相应的位置添加 Thread.backrace 这句代码可以打印出调用栈。

再次执行 frida-trace, HomeController_aboutButtonClicked.js 不会覆盖,会调用刚才我们添加好的代码,打印调用栈信息如下:

frida-trace 可以支持通配符,比如我们想跟踪 Home 开头的类,方法名是任意的,可以执行下面的命令:

跟踪函数实例

在上面我们简单地了解 frida-trace 的使用,趁热打铁,我们来做一个实例。很多应用在登录时都会加密数据,我们的目标是获取某个应用的 AES 加密的原文和密钥。AES 加解密一般会调用 CCCrypt 这个函数,该函数原型如下:

尝试对 CCCrypt 进行跟踪,命令如下:

在 CCCrypt.js 添加如下代码:

再次执行 frida-trace 跟踪,在登录时可以发现原文、密钥,IV 都打印出来了,一目了然。

通过一个实例我们见证到 Frida 的强大,不需要编译代码,所有的操作都是编写脚本语言进行的,区区十几行 JavaScript 脚本代码即可轻松获取 AES 加密的密钥和相关参数。试想如果没有 Frida,我们的分析方法可能是编写动态库注入,对 CCCrypt 进行 Hook,然后打印相关的参数,或者是使用 LLDB 连接程序给 CCCrypt 添加断点,这些方法都不如使用 Frida 跟踪函数功能的效率高、上手快。

frida 官网:https://frida.re
frida 代码:https://github.com/frida

转载请注明:exchen's blog » 【Frida实战】在 iOS 上分析应用

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址