Frida官方手册 - 在iOS上使用Frida

发布者:freakish
发布于:2017-10-20 20:49

在iOS上使用Frida

  • 在iOS设备上,Frida支持两种使用模式,具体使用哪种模式要看你的iOS设备是否已经越狱。

使用场景

  1. 已越狱机器
  2. 未越狱机器

已越狱机器

  • 在越狱的环境下,是用户权限最大的场景,在这样的环境下你可以很轻松的调用系统服务和基础组件。
  • 在这篇教程中,我们来看下如何在iOS设备上进行函数追踪。

设置iOS设备

  • 启动 Cydia 然后通过 Manage -> Sources -> Edit -> Add 这个操作步骤把 https://build.frida.re 这个代码仓库加入进去。然后你就可以在 Cydia 里面找到 Frida 的安装包了,然后你就可以把你的iOS设备插入电脑,并可以开始使用 Frida 了,但是现在还没有必要马上插到电脑上。

快速的冒烟测试

  • 现在在你的主控端电脑上(Windows、macOS)执行如下命令,确保Frida可以正常工作:
  • 如果你还没有把你的iOS设备插入到电脑里面(或者插到电脑但是没有被正常识别),那应该会像下面这样提示:
  • 如果iOS设备已经正常连接了,那应该会看到设备上的进程列表了,大致如下:
  • 如果到了这一步没有问题,那就可以很开心的继续往下走了。

跟踪Twitter中的加密函数

  • OK,现在我们来开始搞点好玩的。在你的设备上启动Twitter,然后让它持续的保持在前台,并确保你的机器不会进入睡眠状态。现在在你的主控端的机器上执行如下命令:
  • 目前, 很多App的加密、解密、哈希算法基本上都是使用 CCryptorCreate 和相关的一组加密函数。
  • 现在,开始尝试在App里面触发一些网络操作,然后就应该能看到一些输出了,比如我的输出是下面这样的:
  • 现在,你还可以实时的修改JavaScript脚本,然后继续在App里面深挖各种功能。

没有越狱的iOS设备

  • 为了让一个App能使用Frida,必须想办法让它加载一个 .dylib,就是一个 Gadget 模块。
  • 在这篇教程里面我们需要配置一下 xcode 的编译配置来让你的App可以集成Frida。当然也可以使用相关的工具来修改一个已经编译好的App, 比如 insert_dylib 这样的工具。
定制你的xCode工程
  • 给iOS设备下载最新的 FridaGadget.dylib 库,然后给这个库签名:
  • 在xCode里面打开你的工程,然后把 Frameworks 文件夹拖动到 AppDelegate 旁边,注意一定要拖动整个文件夹,而不是文件,xCode会提示你 Choose options for adding these files:, 然后选择 Copy items if needed 选项,并且勾选 Create folder references,然后点击 完成。然后选中项目,切换到 Build Phases 页面,展开 Frameworks 文件夹,然后把 FridaGadget.dylib拖进 Link Binary With Libraries 一节,并确保 Frameworks 文件夹被加入了 Copy Bundle Resours 一节。
快速的冒烟测试
  • 在xCode里面启动App,然后就应该能看到下面的输出:
  • 现在你会发现App处于挂起状态,这是因为集成进来的Frida起作用了,Frida正在等待你来执行任何你感兴趣的API 或者你可以选择直接让程序继续运行。
  • 现在Frida正在等待我们操作,并且集成到App内部的Gadgetfrida-server提供的是一样的接口,现在我们尝试枚举一下进程列表试试:
  • 不同于 frida-server,我们只能枚举到一个进程,就是这个App本身。
  • 我们还可以使用下面的命令来看下可以运行哪些App:
  • 到目前为止还不错, 现在如果我们调用 attach() 函数,目标App就会结束等待状态,继续运行。但是如果我们一开始使用 spawn([“re.frida.Gadget”]) 启动App的话,我们这个时候再 attach() 的话,这个时候目标App也不会直接运行的, 除非我们主动调用resume(),也就是说使用前一种方式我们的代码执行时机晚一点,后一种方式可以在更早的时机执行我们的代码。
跟踪libc函数
  • 现在假如你使用xCode启动的程序,现在App处于挂起状态,现在我们尝试开始和Frida交互吧,看下面的例子:
  • 现在你可以实时的编辑JavaScript脚本了,然后继续在iOS的App里面深挖。
使用模拟器
  • 现在在模拟器中进行测试,就要把上面的命令行中的 -U 替换成 -R,这样一来底层的内部调用也从 get_usb_device() 变成 get_remote_device()
打造自己的工具
  • 像是 Frida,Frida-trace 等这些工具确实很有用,但是有时候你会发现你还是需要定制自己更加个性化的功能,那就最好去读一下 FunctionsMessages 这两章,比如当你使用到 frida.attach() 的时候,其实底层调用的就是 frida.get_usb_device().attach()

声明:该文观点仅代表作者本人,转载请注明来自看雪