# vphone-cli
PCC ๋ฆฌ์์น VM ์ธํ๋ผ์ Apple์ Virtualization.framework๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ iPhone(iOS 26)์ ๋ถํ
ํฉ๋๋ค.

## ํ
์คํธ๋ ํ๊ฒฝ
| Host | iPhone | CloudOS |
| ------------- | --------------------- | ------------- |
| Mac16,12 26.3 | `17,3_26.1_23B85` | `26.1-23B85` |
| Mac16,12 26.3 | `17,3_26.3_23D127` | `26.1-23B85` |
| Mac16,12 26.3 | `17,3_26.3_23D127` | `26.3-23D128` |
| Mac16,12 26.3 | `17,3_26.3.1_23D8133` | `26.3-23D128` |
## ํ์จ์ด ๋ณํ
๋ณด์ ์ฐํ ์์ค์ด ๋ค๋ฅธ 3๊ฐ์ง ํจ์น ๋ณํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
| ๋ณํ | ๋ถํธ ์ฒด์ธ | CFW | Make ํ๊ฒ |
| -------- | :-------: | :-------: | ---------------------------------- |
| **์ผ๋ฐ** | 41 ํจ์น | 10 ํ์ด์ฆ | `fw_patch` + `cfw_install` |
| **๊ฐ๋ฐ** | 52 ํจ์น | 12 ํ์ด์ฆ | `fw_patch_dev` + `cfw_install_dev` |
| **ํ์ฅ** | 112 ํจ์น | 14 ํ์ด์ฆ | `fw_patch_jb` + `cfw_install_jb` |
> JB ์ต์ข
์ค์ (์ฌ๋ณผ๋ฆญ ๋งํฌ, Sileo, apt, TrollStore)์ `/cores/vphone_jb_setup.sh` LaunchDaemon์ ํตํด ์ฒซ ๋ฒ์งธ ๋ถํ
์ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค. ์งํ ์ํฉ ํ์ธ: `/var/log/vphone_jb_setup.log`.
์ปดํฌ๋ํธ๋ณ ์์ธ ๋ถ๋ฅ๋ [research/0_binary_patch_comparison.md](../research/0_binary_patch_comparison.md)๋ฅผ ์ฐธ์กฐํ์ธ์.
## ์ฌ์ ์๊ตฌ ์ฌํญ
**ํธ์คํธ OS:** PV=3 ๊ฐ์ํ๋ฅผ ์ํด macOS 15+(Sequoia)๊ฐ ํ์ํฉ๋๋ค.
**SIP/AMFI ์ค์ ** โ Private Virtualization.framework ๊ถํ๊ณผ ์๋ช
๋์ง ์์ ๋ฐ์ด๋๋ฆฌ ์ํฌํ๋ก์ฐ์ ํ์ํฉ๋๋ค.
๋ณต๊ตฌ ๋ชจ๋(์ ์ ๋ฒํผ ๊ธธ๊ฒ ๋๋ฅด๊ธฐ)๋ก ๋ถํ
ํ ํ ํฐ๋ฏธ๋์ ์ด๊ณ , ๋ค์ ํ์ ์ค์ ์ ์ ์ฉํฉ๋๋ค:
๋ณต๊ตฌ ๋ชจ๋์์:
```bash
csrutil disable
csrutil allow-research-guests enable
```
macOS๋ก ๋ค์ ์์ํ ํ:
```bash
sudo nvram boot-args="amfi_get_out_of_my_way=1 -v"
```
ํ ๋ฒ ๋ ์ฌ์์ํฉ๋๋ค.
**์์กด์ฑ(Dependencies) ์ค์น:**
`make setup_tools`๋ ํ์ํ ํธ์คํธ ๋๊ตฌ๋ฅผ ์ค์นํ๊ณ , ํ์ ์ `git-lfs`๋ฅผ ์ค์นํ๋ฉฐ, vendored `inject`์ `ldid`๋ฅผ ๋น๋ํฉ๋๋ค.
**Submodules** โ ์ด ์ ์ฅ์๋ ๋ฆฌ์์ค ์์นด์ด๋ธ๋ฅผ ์ํด git submodule์ ์ฌ์ฉํฉ๋๋ค. ํด๋ก ์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ธ์:
```bash
git clone --recurse-submodules https://github.com/Lakr233/vphone-cli.git
```
## ๋น ๋ฅธ ์์
```bash
make setup_machine # "First Boot"๊น์ง์ ์ ์ฒด ๊ณผ์ ์๋ํ (๋ณต์/Ramdisk/์ปค์คํ
ํ์จ์ด ํฌํจ)
# ์ต์
: NONE_INTERACTIVE=1 SUDO_PASSWORD=...
```
## ์๋ ์ค์
```bash
make setup_tools # ํ์ํ ํธ์คํธ ๋๊ตฌ๋ฅผ ์ค์นํ๊ณ vendored inject/ldid ๋น๋
make build # vphone-cli ๋น๋ ๋ฐ ์๋ช
make vm_new # VM ๋๋ ํ ๋ฆฌ ๋ฐ ๋งค๋ํ์คํธ(config.plist) ์์ฑ
# ์ต์
: CPU=8 MEMORY=8192 DISK_SIZE=64
make fw_prepare # IPSW ๋ค์ด๋ก๋, ์ถ์ถ, ๋ณํฉ, manifest ์์ฑ
make fw_patch # ๋ถํธ ์ฒด์ธ ํจ์น (์ผ๋ฐ ๋ณํ)
# ๋๋: make fw_patch_dev # ๊ฐ๋ฐ ๋ณํ (+ TXM ๊ถํ/๋๋ฒ๊ทธ ์ฐํ)
# ๋๋: make fw_patch_jb # ํ์ฅ ๋ณํ (dev + ์ ์ฒด ๋ณด์ ์ฐํ)
```
### VM ์ค์
v1.0๋ถํฐ VM ์ค์ ์ `vm/config.plist`์ ์ ์ฅ๋ฉ๋๋ค. VM ์์ฑ ์ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ํฌ๊ธฐ๋ฅผ ์ค์ ํ์ธ์:
```bash
# ์ฌ์ฉ์ ์ ์ ์ค์ ์ผ๋ก VM ์์ฑ
make vm_new CPU=16 MEMORY=16384 DISK_SIZE=128
# ๋ถํ
์ config.plist์์ ์ค์ ์๋ ๋ก๋
make boot
```
๋งค๋ํ์คํธ ํ์ผ์ ๋ชจ๋ VM ์ค์ (CPU, ๋ฉ๋ชจ๋ฆฌ, ํ๋ฉด, ROM, ์ ์ฅ์)์ ์ ์ฅํ๋ฉฐ [security-pcc์ VMBundle.Config ํ์](https://github.com/apple/security-pcc)๊ณผ ํธํ๋ฉ๋๋ค.
## ๋ณต์
๋ณต์ ํ๋ก์ธ์ค๋ฅผ ์ํด **๋ ๊ฐ์ ํฐ๋ฏธ๋**์ด ํ์ํฉ๋๋ค. ํฐ๋ฏธ๋ 2๋ฅผ ์ฌ์ฉํ๋ ๋์ ํฐ๋ฏธ๋ 1์ ๊ณ์ ์คํ ์ํ๋ก ๋์ธ์.
```bash
# ํฐ๋ฏธ๋ 1
make boot_dfu # VM์ DFU ๋ชจ๋๋ก ๋ถํ
(๊ณ์ ์คํ ์ ์ง)
```
```bash
# ํฐ๋ฏธ๋ 2
make restore_get_shsh # MobileDevice.framework๋ก ๊ฐ์ธํ SHSH ๋ฐ์ดํฐ ์์ฒญ
make restore # MobileDevice.framework๋ก ํ์จ์ด ํ๋์ฑ
```
## ์ปค์คํ
ํ์จ์ด ์ค์น
ํฐ๋ฏธ๋ 1์ DFU ๋ถํ
์ ์ค๋จ(Ctrl+C)ํ ๋ค์, ๋จ๋์คํฌ๋ฅผ ์ํด ๋ค์ DFU๋ก ๋ถํ
ํฉ๋๋ค:
```bash
# ํฐ๋ฏธ๋ 1
make boot_dfu # ๊ณ์ ์คํ ์ ์ง
```
```bash
# ํฐ๋ฏธ๋ 2
sudo make ramdisk_build # ์๋ช
๋ SSH ๋จ๋์คํฌ ๋น๋
make ramdisk_send # ์ฅ์น๋ก ์ ์ก
```
๋จ๋์คํฌ๊ฐ ์คํ๋๋ฉด(์ถ๋ ฅ์ `Running server`๊ฐ ํ์๋จ), **์ธ ๋ฒ์งธ ํฐ๋ฏธ๋**์ ์ด์ด USBMux ํฌ์๋๋ฅผ ์์ํ ํ, ํฐ๋ฏธ๋ 2์์ ์ปค์คํ
ํ์จ์ด๋ฅผ ์ค์นํฉ๋๋ค:
```bash
# ํฐ๋ฏธ๋ 3 โ ๊ณ์ ์คํ ์ ์ง
./.build/debug/vphone-cli usbmux-forward --local-port 2222 --serial --remote-port 22
```
```bash
# ํฐ๋ฏธ๋ 2
make cfw_install
# ๋๋: make cfw_install_jb # ํ์ฅ ๋ณํ
```
## ์ฒซ ๋ถํ
ํฐ๋ฏธ๋ 1์ DFU ๋ถํ
์ ์ค๋จ(Ctrl+C)ํ ํ ๋ค์์ ์คํํฉ๋๋ค:
```bash
make boot
```
`cfw_install_jb` ์คํ ํ ํ์ฅ ๋ณํ์ ์ฒซ ๋ฒ์งธ ๋ถํ
์ **Sileo**์ **TrollStore**๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. Sileo์์ `openssh-server`๋ฅผ ์ค์นํ์ฌ SSH ์ ๊ทผ์ ํ์ฑํํ ์ ์์ต๋๋ค.
์ผ๋ฐ/๊ฐ๋ฐ ๋ณํ์ ๊ฒฝ์ฐ, VM์์ **direct console**์ด ๋ํ๋ฉ๋๋ค. `bash-4.4#`์ด ๋ณด์ด๋ฉด ์ํฐ๋ฅผ ๋๋ฅด๊ณ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์ ํ๊ฒฝ์ ์ด๊ธฐํํ๊ณ SSH ํธ์คํธ ํค๋ฅผ ์์ฑํ์ธ์:
```bash
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games:/iosbinpack64/usr/local/sbin:/iosbinpack64/usr/local/bin:/iosbinpack64/usr/sbin:/iosbinpack64/usr/bin:/iosbinpack64/sbin:/iosbinpack64/bin'
mkdir -p /var/dropbear
cp /iosbinpack64/etc/profile /var/profile
cp /iosbinpack64/etc/motd /var/motd
# SSH ํธ์คํธ ํค ์์ฑ (SSH ์๋์ ํ์)
dropbearkey -t rsa -f /var/dropbear/dropbear_rsa_host_key
dropbearkey -t ecdsa -f /var/dropbear/dropbear_ecdsa_host_key
shutdown -h now
```
> **์ฐธ๊ณ :** ํธ์คํธ ํค ์์ฑ ๋จ๊ณ๋ฅผ ๊ฑฐ์น์ง ์์ผ๋ฉด dropbear(SSH ์๋ฒ)๊ฐ ์ฐ๊ฒฐ์ ์๋ฝํ๋๋ผ๋ SSH ํธ๋์
ฐ์ดํฌ๋ฅผ ์ํํ ํค๊ฐ ์์ด ์ฆ์ ์ฐ๊ฒฐ์ ์ข
๋ฃํฉ๋๋ค.
## ์ดํ ๋ถํ
```bash
make boot
```
๋ณ๋์ ํฐ๋ฏธ๋์์ USBMux ํฌ์๋ฉ์ ์์ํฉ๋๋ค:
```bash
./.build/debug/vphone-cli usbmux-forward --local-port 22222 --serial --remote-port 22222
./.build/debug/vphone-cli usbmux-forward --local-port 2222 --serial --remote-port 22
./.build/debug/vphone-cli usbmux-forward --local-port 5901 --serial --remote-port 5901
./.build/debug/vphone-cli usbmux-forward --local-port 5910 --serial --remote-port 5910
```
๋ค์์ ํตํด ์ฐ๊ฒฐํฉ๋๋ค:
- **SSH (ํ์ฅ):** `ssh -p 2222 mobile@127.0.0.1` (password: `alpine`)
- **SSH (์ผ๋ฐ/๊ฐ๋ฐ):** `ssh -p 2222 root@127.0.0.1` (password: `alpine`)
- **VNC:** `vnc://127.0.0.1:5901`
- [**RPC:**](http://github.com/doronz88/rpc-project) `rpcclient -p 5910 127.0.0.1`
## FAQ
> **๋ฌด์๋ณด๋ค ๋จผ์ โ `git pull`์ ์คํํ์ฌ ์ต์ ๋ฒ์ ์ธ์ง ํ์ธํ์ธ์.**
**Q: ์คํํ๋ ค๊ณ ํ๋ฉด `zsh: killed ./vphone-cli` ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.**
AMFI/๋๋ฒ๊ทธ ์ ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฐํ๋์ง ์์์ต๋๋ค. ๋ณต๊ตฌ ๋ชจ๋ ์ค์ ๊ณผ ํธ์คํธ boot-args๋ฅผ ๋ค์ ํ์ธํ์ธ์:
- **ํ์ ํธ์คํธ ์ค์ :**
```bash
sudo nvram boot-args="amfi_get_out_of_my_way=1 -v"
```
**Q: ์์คํ
์ฑ(App Store, ๋ฉ์์ง ๋ฑ)์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์ค์นํ ์ ์์ต๋๋ค.**
iOS ์ด๊ธฐ ์ค์ ์ ์ง์ญ์ **์ผ๋ณธ** ๋๋ **์ ๋ฝ ์ฐํฉ**์ผ๋ก ์ ํํ์ง **๋ง์ธ์**. ์ด ์ง์ญ์์๋ ์ถ๊ฐ์ ์ธ ๊ท์ ๊ฒ์ฌ(์ฌ์ด๋๋ก๋ฉ ๊ณต๊ฐ, ์นด๋ฉ๋ผ ์
ํฐ์ ๋ฑ)๊ฐ ์ ์ฉ๋๋๋ฐ, ๊ฐ์ ๋จธ์ ์ ์ด๋ฌํ ์๊ฑด์ ์ถฉ์กฑํ ์ ์์ด ์์คํ
์ฑ์ ๋ค์ด๋ก๋ ๋ฐ ์ค์น๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด ๋ค๋ฅธ ์ง์ญ(์: ๋ฏธ๊ตญ)์ ์ ํํ์ธ์.
**Q: "Press home to continue" ํ๋ฉด์์ ๋ฉ์ท์ต๋๋ค.**
VNC(`vnc://127.0.0.1:5901`)๋ก ์ ์ํ์ฌ ํ๋ฉด์ ์๋ฌด ๊ณณ์ด๋ ์ฐํด๋ฆญ(Mac ํธ๋ํจ๋์์๋ ๋ ์๊ฐ๋ฝ ํด๋ฆญ)ํ์ธ์. ์ด๊ฒ์ด ํ ๋ฒํผ ๋๋ฅด๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
**Q: SSH ์ ๊ทผ์ ํ์ฑํํ๋ ค๋ฉด?**
Sileo์์ `openssh-server`๋ฅผ ์ค์นํ์ธ์ (ํ์ฅ ๋ณํ ์ฒซ ๋ถํ
ํ ์ฌ์ฉ ๊ฐ๋ฅ).
**Q: openssh-server๋ฅผ ์ค์นํ๋๋ฐ SSH๊ฐ ์๋ํ์ง ์์ต๋๋ค.**
VM์ ์ฌ๋ถํ
ํ์ธ์. ๋ค์ ๋ถํ
์ SSH ์๋ฒ๊ฐ ์๋์ผ๋ก ์์๋ฉ๋๋ค.
**Q: `.tipa` ํ์ผ์ ์ค์นํ ์ ์๋์?**
๋ค. ์ค์น ๋ฉ๋ด๋ `.ipa`์ `.tipa` ํจํค์ง๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค. ๋๋๊ทธ ์ค ๋๋กญ ๋๋ ํ์ผ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์.
**Q: ์ต์ iOS ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์๋์?**
๋ค. `fw_prepare`๋ฅผ ์ํ๋ ๋ฒ์ ์ IPSW URL๋ก ๋ฎ์ด์ฐ์ธ์:
```bash
export IPHONE_SOURCE=/path/to/some_os.ipsw
export CLOUDOS_SOURCE=/path/to/some_os.ipsw
make fw_prepare
make fw_patch
```
์ ํฌ์ ํจ์น๋ ์ ์ ์คํ์
์ด ์๋ ๋ฐ์ด๋๋ฆฌ ๋ถ์์ ํตํด ์ ์ฉ๋๋ฏ๋ก, ์ต์ ๋ฒ์ ์์๋ ์๋ํ ๊ฒ์
๋๋ค. ๋ง์ฝ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด AI์๊ฒ ๋์์ ์์ฒญํ์ธ์.
## ๊ฐ์ฌ ์ธ์ฌ
- [wh1te4ever/super-tart-vphone-writeup](https://github.com/wh1te4ever/super-tart-vphone-writeup)