Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
bfinject — 适用于 iOS 11.0 - 11.1.2 的 Dylib 注入,兼容 LiberiOS 和 Electra 越狱 | Kitploit
工具/GitHubGitHub/bishopfox/bfinject
动态分析 (沙盒)iOS安全漏洞利用移动应用渗透测试渗透测试二进制分析
GitHubbishopfox/bfinject

bfinject

适用于 iOS 11.0 - 11.1.2 的 Dylib 注入,兼容 LiberiOS 和 Electra 越狱

查看仓库
6411504年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

bfinject

适用于已越狱 64 位 iOS 11.0 - 11.1.2 的简易 dylib 注入工具。兼容 Electra 和 LiberiOS 越狱。

bfinject 可将任意 dylib 注入正在运行的 App Store 应用。它内置了解密 App Store 应用的支持,并捆绑了 iSpy 和 Cycript。

bfinject 是一个封装工具,负责在使用 bfinject4realz 注入之前正确地对你的 dylib 进行代码签名。它完全独立运行,不依赖 jailbreakd、QiLin 或任何类似的东西。开箱即用。

注意:如果在 Electra 上启用了 "Tweaks",bfinject 将无法工作。请重启并重新运行不带 tweaks 的 Electra 以使用 bfinject。如果你看到与 "thread_create" 相关的错误,那就是这个问题。

注意:bfdecrypt 可在此处作为独立 dylib 获取:https://github.com/BishopFox/bfdecrypt/

导航

  • Electra 环境搭建
  • LiberiOS 环境搭建
  • 使用 bfinject
  • 测试 bfinject
  • 解密 App Store 应用
  • Cycript
  • 工作原理
  • 已知问题
  • 致谢

Electra 环境搭建

  • 使用 Electra >= b7 越狱你的 iOS 11.0 - 11.1.2 设备
  • 将 bfinject 压缩包 https://github.com/BishopFox/bfinject/raw/master/bfinject.tar 复制到你的越狱设备上。你可能需要先将其复制到你的笔记本电脑上,因为 Github 强制使用 SSL,而 Electra 版本的 wget 不支持 SSL。
root@kitploit:~
ssh root@your-device-ip # (密码是 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

LiberiOS 环境搭建

  • 使用 LiberiOS >= 11.0.3 越狱你的 iOS 11.0 - 11.1.2 设备
  • 将 bfinject 压缩包 https://github.com/BishopFox/bfinject/raw/master/bfinject.tar 复制到你的越狱设备上。你可能需要先将其复制到你的笔记本电脑上,因为 Github 强制使用 SSL,而 LiberiOS 版本的 wget 不支持 SSL。
root@kitploit:~
ssh root@your-device-ip # (密码是 'alpine')
export PATH=$PATH:/jb/usr/bin:/jb/bin:/jb/sbin:/jb/usr/sbin:/jb/usr/local/bin:
cd /jb
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

使用 bfinject

  • 启动你要注入共享库的目标应用
  • 输入 bash bfinject 查看帮助
  • 注意:在命令前加上 bash 前缀很重要,否则无法工作。沙盒等等原因。
root@kitploit:~
-bash-3.2# bash bfinject
Syntax: bfinject [-p PID | -P appname] [-l /path/to/yourdylib | -L feature]

For example:
   bfinject -P Reddit.app -l /path/to/evil.dylib   # Injects evil.dylib into the Reddit app
     or
   bfinject -p 1234 -L cycript                     # Inject Cycript into PID
     or
   bfinject -p 4566 -l /path/to/evil.dylib         # Injects the .dylib of your choice into PID

Instead of specifying the PID with -p, bfinject can search for the correct PID based on the app name.
Just enter "-P identifier" where "identifier" is a string unique to your app, e.g. "fing.app".

Available features:
  cycript    - Inject and run Cycript
  decrypt    - Create a decrypted copy of the target app
  test       - Inject a simple .dylib to make an entry in the console log
  ispy       - Inject iSpy. Browse to http://<DEVICE_IP>:31337/

简单测试

在进行更复杂的操作之前,先测试一下它是否能正常工作。bfinject 内置了自测功能。以下是以 Reddit 应用为目标的示例:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L test
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x12ac5c000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c016e1c0
[+] So long and thanks for all the fish.

在设备屏幕上你应该会看到:

如果没有,说明出了问题 ;)

解密 App Store 应用

以下是在 Electra 越狱的 iPhone 上解密 Reddit 应用的示例:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L decrypt
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/BCEBDD64-6738-45CE-9B3C-C6F933EA0793/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 3218.
[bfinject4realz] Calling thread_create() on PID 3218
[bfinject4realz] Looking for ROP gadget... found at 0x1016a5110
[bfinject4realz] Fake stack frame at 0x10a06c000
[bfinject4realz] Calling _pthread_set_self() at 0x181303814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1810c3460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c03e1100
[+] So long and thanks for all the fish.

你会在设备上看到这个画面:

完成后,系统会弹出一个 UI 提示框,询问你是否要启动一个服务,以便从该服务下载解密后的 IPA:

如果你点击 Yes,将在设备的 31336 端口上启动一个服务。连接到该服务后,你将会收到一份原始的 IPA 副本,可以使用 netcat 下载,如下所示:

root@kitploit:~
carl@calisto-3 /tmp $ nc 192.168.1.33 31336 > decrypted.ipa
carl@calisto-3 /tmp $ ls -l decrypted.ipa
-rw-r--r--  1 carl  wheel  14649063 Jan 25 16:57 decrypted.ipa
carl@calisto-3 /tmp $ file decrypted.ipa
decrypted.ipa: iOS App Zip archive data, at least v2.0 to extract

或者,查看设备的控制台日志,它会告诉你解密后的 IPA 存储在哪里。例如:

root@kitploit:~
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa

你也可以像这样在文件系统中搜索 IPA:

root@kitploit:~
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

可以使用 netcat 将 .ipa 从设备中取出。在你的笔记本电脑上设置一个监听服务:

root@kitploit:~
ncat -l 0.0.0.0 12345 > decrypted.ipa

然后在越狱设备上:

root@kitploit:~
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345

这个 .ipa 将是 App Store 原始 .ipa 的克隆,区别在于主二进制文件及其所有附带的框架和共享库都将被解密。在每个之前加密的文件中,CRYPTID 标志将为 0。你可以获取该 .ipa,解压应用,按需修改,使用你自己的开发者证书重新签名,然后根据需要将其部署到非越狱设备上。

Cycript

bfinject 的功能之一是整合常见的渗透测试工具,例如 Cycript。随着时间推移,将加入更多工具。要使用 Cycript,你需要在你的 MacBook 上安装 Cycript 命令行客户端 (http://www.cycript.org/)。然后,一旦 bfinject 安装到你的测试设备上,可以像下面这个示例一样操作,我们将 Cycript 注入 Reddit 应用:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L cycript
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c01786c0
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c4179680
[+] So long and thanks for all the fish.

Cycript 注入完成后,你会在设备上看到以下消息:

你可以从 MacBook 连接到 Cycript,如下所示(假设你将 Cycript 安装到了 ~/bin/ 中):

root@kitploit:~
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#

工作原理

在高层面上,bfinject4realz 将一个自签名的 .dylib 侧载到正在运行的、由 Apple 签名的 App Store 应用中。

该过程分两个阶段完成。

1. 签名要注入的 dylib

iOS 上的代码签名检查包括用户空间服务 (amfid) 和内核服务 (AppleMobileFileIntegrity)。LiberiOS 和 Electra 都会修补用户空间的 amfid 进程以绕过代码签名检查,但内核还会执行进一步的检查。

然而,Electra 和 LiberiOS 是 KPPless 的,这意味着它们不会在内核中修补任何内容,一个字节都不会。这是因为内核补丁保护("KPP"),这是 Apple 的一项安全技术,它执行复杂的内核自省来检测并阻止内核补丁。因此,内核代码签名检查仍然完好无损。

对我们来说幸运的是,内核似乎假定 amfid 已经检查了附加到 dylib 权限上的加密签名的有效性。因此,如果我们希望内核接受该 dylib,我们只需要在 dylib 中自签名两个权限:

  • 第一个是 platform-application 权限,我认为这表示该 dylib 是 Apple 软件。
  • 第二个是我们正在注入的代码所使用签名证书的 Team ID。例如,Reddit 应用由 Team ID 2TDUX39LX8 签名。因此,要将 dylib 注入 Reddit 应用,我们必须使用相同的 Team ID 2TDUX39LX8 来签名该 dylib。

bfinject 会为你处理所有这些签名相关的麻烦事,这很不错。

2. 将正确签名的 dylib 注入目标进程

  • 使用 task_for_pid() 获取目标进程的 mach 端口
  • 使用该端口来操纵目标进程中的线程和不可执行内存段
    • 注意:在没有内核补丁的情况下,无法修改进程中的可执行代码。
    • 因此,我们必须使用 ROP 技巧来执行我们选择的代码。
  • 在远程进程中分配一些内存页作为新的临时栈
  • 将字符串 "/path/to/my.dylib" 放在栈中的已知位置
  • 使用一些技巧在远程进程中查找 dlopen() 的地址
  • 在可执行页中找到一个简单的 RET ROP gadget(在 arm64 上 RET = "\xc0\x03\x5f\xd6")
  • 在目标进程中创建一个新线程
  • 设置线程的 CPU 寄存器:
    • $pc = dlopen() 的地址
    • $x0 = dlopen 的参数 1:临时栈中字符串 "/path/to/dylib" 的地址
    • $x1 = dlopen 的参数 2:值 RTLD_LAZY | RTLD_GLOBAL
    • $sp = 临时栈的中间位置
    • $fp = 临时栈的四分之一处
    • $lr = ROP gadget 的地址
  • 恢复线程。接下来将发生以下事情:
    • 调用 _pthread_set_self 来为 dlopen() 设置线程环境
    • 调用 dlopen() 以注入我们恶意的共享库
    • dlopen() 将 RET 到 $lr 寄存器中的值,这又是一条 RET 指令
    • RET 将返回到 RET,RET 再返回到 RET……如此循环,以至无穷
  • 轮询线程的寄存器,检查 $pc == ROP gadget 的地址(即 RET 指令)
  • 一旦命中该 gadget,终止线程,释放内存,任务完成。

有关底层描述,请参阅源码。

已知问题

请注意,在 Electra 上,jtool(@morpheus 的代码签名多功能工具)版本不支持平台二进制权限,因此 bfinject 会提供来自 LiberiOS 的 jtool 并使用它来代替。bfinject 不使用 Electra 的 inject_criticald。

致谢

  • Stefan Esser (10n1c),dumpdecrypted 背后的原始想法和代码 (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • Dmitry Rodionov,lorgnette (https://github.com/rodionovd/liblorgnette/)
  • Jonathan Levin,LiberiOS 越狱 (http://newosxbook.com/liberios/)
  • Ian Beer,async_wake 漏洞利用 (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • Apple,出色的移动操作系统
下载工具