适用于已越狱 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/
wget 不支持 SSL。ssh root@your-device-ip # (密码是 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar
wget 不支持 SSL。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
bash bfinject 查看帮助bash 前缀很重要,否则无法工作。沙盒等等原因。-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 应用为目标的示例:
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.
在设备屏幕上你应该会看到:
如果没有,说明出了问题 ;)
以下是在 Electra 越狱的 iPhone 上解密 Reddit 应用的示例:
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 下载,如下所示:
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 存储在哪里。例如:
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa
你也可以像这样在文件系统中搜索 IPA:
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa
可以使用 netcat 将 .ipa 从设备中取出。在你的笔记本电脑上设置一个监听服务:
ncat -l 0.0.0.0 12345 > decrypted.ipa
然后在越狱设备上:
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345
这个 .ipa 将是 App Store 原始 .ipa 的克隆,区别在于主二进制文件及其所有附带的框架和共享库都将被解密。在每个之前加密的文件中,CRYPTID 标志将为 0。你可以获取该 .ipa,解压应用,按需修改,使用你自己的开发者证书重新签名,然后根据需要将其部署到非越狱设备上。
bfinject 的功能之一是整合常见的渗透测试工具,例如 Cycript。随着时间推移,将加入更多工具。要使用 Cycript,你需要在你的 MacBook 上安装 Cycript 命令行客户端 (http://www.cycript.org/)。然后,一旦 bfinject 安装到你的测试设备上,可以像下面这个示例一样操作,我们将 Cycript 注入 Reddit 应用:
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/ 中):
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#
在高层面上,bfinject4realz 将一个自签名的 .dylib 侧载到正在运行的、由 Apple 签名的 App Store 应用中。
该过程分两个阶段完成。
iOS 上的代码签名检查包括用户空间服务 (amfid) 和内核服务 (AppleMobileFileIntegrity)。LiberiOS 和 Electra 都会修补用户空间的 amfid 进程以绕过代码签名检查,但内核还会执行进一步的检查。
然而,Electra 和 LiberiOS 是 KPPless 的,这意味着它们不会在内核中修补任何内容,一个字节都不会。这是因为内核补丁保护("KPP"),这是 Apple 的一项安全技术,它执行复杂的内核自省来检测并阻止内核补丁。因此,内核代码签名检查仍然完好无损。
对我们来说幸运的是,内核似乎假定 amfid 已经检查了附加到 dylib 权限上的加密签名的有效性。因此,如果我们希望内核接受该 dylib,我们只需要在 dylib 中自签名两个权限:
platform-application 权限,我认为这表示该 dylib 是 Apple 软件。2TDUX39LX8 签名。因此,要将 dylib 注入 Reddit 应用,我们必须使用相同的 Team ID 2TDUX39LX8 来签名该 dylib。bfinject 会为你处理所有这些签名相关的麻烦事,这很不错。
task_for_pid() 获取目标进程的 mach 端口有关底层描述,请参阅源码。
请注意,在 Electra 上,jtool(@morpheus 的代码签名多功能工具)版本不支持平台二进制权限,因此 bfinject 会提供来自 LiberiOS 的 jtool 并使用它来代替。bfinject 不使用 Electra 的 inject_criticald。