VSCode 下的 frida 插件
2021-04-08 18:57:00 Author: paper.seebug.org(查看原文) 阅读量:207 收藏

作者:0xcc
原文链接:https://mp.weixin.qq.com/s/1wm4fNHdBNgNdW84YMUNlQ

又到工作日了,推送一个作者原创的工具。

VSCode 的生态日渐强大,各种插件让编辑器如虎添翼。想必 frida 的大名大家已经耳熟能详,不做赘述。

那么把两者做一个有机结合如何?

我把一些常用的命令集成到 VSCode 的图形界面里方便日常使用,如动画所示。这个插件在市场里搜索 frida Workbench,安装 codecolorist.vscode-frida 即可。

图片

插件依赖 Python3 和 frida-tools。当然,还有 VSCode。

在 Windows 和 macOS 上测试过,其他系统理论上不会有问题。一些功能是可选的,依赖一些需要手动安装对应的工具。例如 Objection 和 SSH 相关,下文会详细介绍。

先来介绍常用的功能。

安装之前请确保 Python3 命令在 PATH 当中能正常找到,并运行过 pip3 install frida-tools。

成功安装之后 VSCode 的左边就有一个倒转的 R 图标,即可切换到插件窗格,列出所有 App 和进程列表,可以直接选择附加 frida 或者创建一个新的进程实例。

图片

笔者做 iOS 工作比较多,一些功能 Android 也是可以用的。当然还需要系统路径里安装了 adb。

目前只支持 USB 的方式连接设备。在 Windows 上 USB 连接 iPhone 还需要安装 iTunes。如果连接失败,最好保持 iTunes 运行的状态下使用。

图片

绿色三角对应 frida 的 -f (spawn)模式。如果进程正在运行,会多一个左边的 attach 图标。两种方式都会在 VSCode 的下方打开一个 frida 的 REPL。如需要创建新进程到暂停的状态,请使用右键菜单的 Spawn Suspended 命令。

图片

如果当前有活动的 REPL,而且使用编辑器打开了 js 源文件,编辑器的右上角会多出来一个 frida 的图标:

图片

点击即可将当前的代码提交到 REPL 当中运行。

View Debug Logs 菜单打开一个窗格显示应用的日志。

通常查看 iOS 的应用日志可以使用 macOS 自带的 Console.app 或者 libimobiledevice 的 idevicesyslog 命令。但在近几个 iOS 大版本之后,系统对日志实现做了修改,os_log 系列函数才会正常输出,输出到 stderr(如 NSLog 函数)的内容不再显示。这个小功能可以帮你找回 stderr 的内容。

如果是 Android,则会简单地调用 adb logcat 并设置 app 的过滤器。

说到右键读者会发现下面还有 Objection 和 lldb 的功能。

图片

Objection 需要安装对应的 pip 包,对操作系统没有特定的要求。

lldb 目前只在 macOS 上测试过。由于此类调试通常需要依赖 Xcode 工具链,在其他系统确实也没太大意义。该功能需要首先在设备上初始化配置。

配置 SSH

在电脑端,macOS 和 Linux 环境都自带了 SSH 命令。Windows 10 支持 SSH 客户端命令,可能需要在控制面板安装先启用对应的可选组件,确保 ssh.exe 命令可以使用。

本插件的一些命令需要 SSH 交互,首先用 ssh-keygen 生成密钥,然后右键设备选择 Install SSH Public Key,免去每次输入密码。

图片

为验证命令成功完成,右键设备并选择 Open Shell,检查是否在 VSCode 当中直接打开终端。

建立 SSH 通信的底层还有 iproxy,在插件里虽然我用 Python 实现了一个,但性能肯定比不上原生的命令。可以安装 libimobiledevice 并将 iproxy 添加到环境变量中,插件会优先使用之。

配置 debugserver

首先需要在设备上预先挂载好 Xcode Developer Disk Image (DDI)。挂载的方式有两种。

只要使用 Xcode 在设备上调试过任意 App 源代码,Xcode 就会自动挂载对应的 DDI 镜像。

如果是其他操作系统,还可以使用 libimobiledevice [1] 工具包的 ideviceimagemounter 命令。而这种情况需要从 Xcode 当中获取一个 dmg 的 DDI 镜像,可以自行从 mac 上复制,而 GitHub 上也有人收集了各个版本的镜像。当然有了 Xcode 投毒的前车之鉴,对于非官方来源的文件,使用前请慎重做好签名的校验工作。

图片

确保 DDI 在设备上配置完成后,VSCode 里选择该设备并右键,选择 Setup LLDB debugserver,将会自动使用 ldid 工具为 /Developers/usr/bin/debugserver 创建一个带有全局调试权限的副本。

目前相当一部分越狱环境自带 ldid。如果这一步操作失败,请尝试手工编译该命令放置到设备中。

如果一切就绪,任选一个 App 右键,选择 Debug with lldb,稍等片刻就可以打开调试控制台,而无需手工逐个运行 iproxy 等命令。

配置 FlexDecrypt

iOS 对第三方应用的 DRM 加密机制是每一本逆向资料都会提到的常识。从 dumpdecrypted 之后,从内存当中转储解密过的 App 可执行文件已经成为标准步骤,还被先后移植到了命令行工具、frida 脚本、lldb 脚本等多种形式上,实现都大同小异。

今年出现的 FlexDecrypt[2] 则让人眼前一亮。这个工具调用了链接器内部使用的 mremap_encrypted 系统调用来让内核解密应用,却又无需真正运行代码,可以看作是静态解密。

之前的解密(砸壳)方式都需要先运行代码,对于一些做了反调试或越狱检测的应用,可能会触发应用的检测逻辑而异常退出。FlexDecrypt 完全规避了这种问题,并完美支持 App Extension 的多进程模式和延迟加载的框架代码的解密。

唯一的麻烦之处在于,FlexDecrypt 一次只解密一个文件,需要手动定位到 App 的 bundle 目录然后逐个文件处理。因此在这个插件里特地实现了一个右键菜单,一次性解密整个 app 并下载为 .ipa (zip) 压缩包。

图片

图片

第一次使用 FlexDecrypt 同样需要预先配置。在按照前文设置好 SSH 之后,在设备上选择 Install FlexDecrypt 右键菜单。插件会自动到 FlexDecrypt 的 GitHub 上拉取最新的 FlexDecrypt 安装包,通过 SSH 和 dpkg 的方式自动部署到越狱 iOS 上。

关于功能和 bug 的反馈可以直接公众号私信,或者点击“阅读原文”到 GitHub 仓库中提 issue。

参考资料

[1]. https://github.com/libimobiledevice/libimobiledevice#utilities

[2]. https://github.com/JohnCoates/flexdecrypt


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1553/



文章来源: https://paper.seebug.org/1553/
如有侵权请联系:admin#unsafe.sh