USBFlux (usbfluxd) 是Corellium開發的一款自由軟體,用於轉發USBMux的網路界面。
Apple設計了USBMux (usbmuxd),規定了iPhone與macOS之間的USB通訊方式。原本USBMuxd是macOS才有的閉源軟體,在被人破解後成為libmobiledevice專案的一部分,移植到Linux、Windows系統。usbmuxd會監聽iPhone的socket,於是使用者便能透過此軟體與iPhone互動,比如備份檔案、存取照片等操作。
USBFlux這款軟體則是轉發usbmuxd的socket,讓遠端的裝置連線進來,讓它好像變成本機連線的一樣。
…好抽象喔,那這能幹嘛?
從mac遠距到另一台macOS,跑遠端Xcode,開發iOS APP。
或者
從Linux遠距到遠端macOS虛擬機,開發iOS APP。
哈!?
講明白一點,你可以把iPhone無線連接到macOS虛擬機,讓Xcode與其連線,這樣你在Xcode上寫的APP就可以無線傳到iPhone測試了。 idevicepair工具的指令也能遠端執行喔!
甚至有開發者嘗試遠端跑checkra1n越獄!
1. 準備macOS虛擬機#
在Linux透過 OSX-KVM或 Docker-OSX安裝macOS虛擬機,再於虛擬機內下載Xcode。
接著給Linux設定SSH或者VNC之類的遠端桌面方案。
macOS虛擬機的畫面可以在開機後,用VNC遠端存取。
2. 啟動usbfluxd#
以下操作皆是在本機執行,宿主機和虛擬機位於同一台機器上。測試當下宿主機系統是Ubuntu 22.04,虛擬機系統為macOS Ventura。
如果你要從本機連線到遠端的macOS,記得開放對應通訊埠的防火牆,或者用SSH Forwarding的方式轉發通訊埠(見文末參考資料)。
- 於Linux宿主機安裝usbmuxd套件
# Ubuntu 22.04
sudo apt install libusbmuxd-dev usbmuxd avahi-daemon socat
# Arch Linux
sudo pacman -S libusbmuxd usbmuxd avahi socat
- 接著安裝usbfluxd套件
# Ubuntu 22.04安裝usbfluxd作者釋出的二進位檔
wget https://github.com/corellium/usbfluxd/releases/download/v1.0/usbfluxd-aarch64-libc6-libdbus13.tar.gz
tar -xvf usbfluxd-aarch64-libc6-libdbus13.tar.gz
sudo mv usbfluxd-x86_64-libc6-libdbus13/* /usr/local/bin
# Arch Linux從AUR安裝usbfluxd
yay -s usbfluxd
- 啟動usbfluxd服務
sudo systemctl start usbmuxd
sudo avahi-daemon
- 執行socat監聽5000通訊埠:
sudo systemctl restart usbmuxd
sudo socat tcp-listen:5000,fork unix-connect:/var/run/usbmuxd
- 開第二個終端機,執行usbfluxd:
sudo usbfluxd -f -n
將iPhone插到Linux電腦,啟動macOS虛擬機
在macOS虛擬機開啟終端機,以 Homebrew安裝usbfluxd套件
brew install make automake autoconf libtool pkg-config gcc libimobiledevice usbmuxd
git clone https://github.com/corellium/usbfluxd.git
cd usbfluxd
./autogen.sh
make
sudo make install
- 在macOS啟動usbmuxd服務
sudo launchctl start usbmuxd
- 接著啟動usbflux,連線到Linux宿主機的IP(在Linux宿主機用
ip addr
指令查看),若有需要請開放Linux宿主機防火牆的5000通訊埠。
export PATH=/usr/local/sbin:${PATH}
sudo usbfluxd -f -r 192.168.0.101:5000
- macOS新增第二個終端機視窗,執行以下指令,列出iOS的裝置ID
idevice_id -l
- 嘗試配對,在iPhone上點選「信任此電腦」。
idevicepair pair "裝置ID"
macOS開啟XCode專案,點選上方的
Manage Run Destinations...
,應該會看到iPhone了。如此就能將APP的IPA傳送到iPhone安裝了,不過Xcode無法直接編譯傳過去執行。且Finder仍抓不到iPhone,無法進行備份,只能用 idevicebackup指令備份。
中止所有行程的方法:
sudo killall usbfluxd
sudo systemctl restart usbmuxd
sudo killall socat