mirror of
https://github.com/Lakr233/vphone-cli.git
synced 2026-04-05 13:09:06 +08:00
- Add `unlock` tool: C program dispatching IOHIDEvent to wake/unlock screen - Rework serial port to pipes for programmatic command injection - Auto-unlock on non-DFU boot via serial console after 8s delay - Add "Unlock" menu item, `make unlock`/`make unlock_deploy` targets - Defer to native VZVirtualMachineView touch on macOS 16+ - Add sshpass resolver with bundled/host fallback and arch checks - Add gtar resolver with bundled/host/tar fallback and arch checks - Prevent host-arch mismatches from breaking cfw_install and ramdisk_build Closes #45, closes #46 Fixes #38, fixes #41 Co-authored-by: webcpu <liang@unchartedworks.com> Co-authored-by: tastyheadphones <tastyheadphones@icloud.com>
205 lines
9.2 KiB
Makefile
205 lines
9.2 KiB
Makefile
# ═══════════════════════════════════════════════════════════════════
|
|
# vphone-cli — Virtual iPhone boot tool
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
# ─── Configuration (override with make VAR=value) ─────────────────
|
|
VM_DIR ?= vm
|
|
CPU ?= 8
|
|
MEMORY ?= 8192
|
|
DISK_SIZE ?= 64
|
|
|
|
# ─── Paths ────────────────────────────────────────────────────────
|
|
SCRIPTS := scripts
|
|
BINARY := .build/release/vphone-cli
|
|
ENTITLEMENTS := sources/vphone.entitlements
|
|
VENV := .venv
|
|
LIMD_PREFIX := .limd
|
|
IRECOVERY := $(LIMD_PREFIX)/bin/irecovery
|
|
IDEVICERESTORE := $(LIMD_PREFIX)/bin/idevicerestore
|
|
PYTHON := $(CURDIR)/$(VENV)/bin/python3
|
|
|
|
SWIFT_SOURCES := $(shell find sources -name '*.swift')
|
|
|
|
# ─── Environment — prefer project-local binaries ────────────────
|
|
export PATH := $(CURDIR)/$(LIMD_PREFIX)/bin:$(CURDIR)/$(VENV)/bin:$(CURDIR)/.build/release:$(PATH)
|
|
|
|
# ─── Default ──────────────────────────────────────────────────────
|
|
.PHONY: help
|
|
help:
|
|
@echo "vphone-cli — Virtual iPhone boot tool"
|
|
@echo ""
|
|
@echo "Setup (one-time):"
|
|
@echo " make setup_machine Full setup through README First Boot"
|
|
@echo " make setup_venv Create Python .venv"
|
|
@echo " make setup_libimobiledevice Build libimobiledevice toolchain"
|
|
@echo ""
|
|
@echo "Build:"
|
|
@echo " make build Build + sign vphone-cli"
|
|
@echo " make install Build + copy to ./bin/"
|
|
@echo " make clean Remove .build/"
|
|
@echo " make unlock Cross-compile unlock for arm64-ios"
|
|
@echo " make unlock_deploy Build + deploy unlock to VM via SSH"
|
|
@echo ""
|
|
@echo "VM management:"
|
|
@echo " make vm_new Create VM directory"
|
|
@echo " make boot Boot VM (GUI)"
|
|
@echo " make boot_dfu Boot VM in DFU mode"
|
|
@echo ""
|
|
@echo "Firmware pipeline:"
|
|
@echo " make fw_prepare Download IPSWs, extract, merge"
|
|
@echo " make fw_patch Patch boot chain (6 components)"
|
|
@echo " make fw_patch_jb Run fw_patch + JB extension patches (WIP)"
|
|
@echo ""
|
|
@echo "Restore:"
|
|
@echo " make restore_get_shsh Fetch SHSH blob from device"
|
|
@echo " make restore idevicerestore to device"
|
|
@echo ""
|
|
@echo "Ramdisk:"
|
|
@echo " make ramdisk_build Build signed SSH ramdisk"
|
|
@echo " make ramdisk_send Send ramdisk to device"
|
|
@echo ""
|
|
@echo "CFW:"
|
|
@echo " make cfw_install Install CFW mods via SSH"
|
|
@echo " make cfw_install_jb Install CFW + JB extensions (jetsam/procursus/basebin)"
|
|
@echo ""
|
|
@echo "Variables: VM_DIR=$(VM_DIR) CPU=$(CPU) MEMORY=$(MEMORY) DISK_SIZE=$(DISK_SIZE)"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Setup
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: setup_machine setup_venv setup_libimobiledevice
|
|
|
|
setup_machine:
|
|
zsh $(SCRIPTS)/setup_machine.sh
|
|
|
|
setup_venv:
|
|
zsh $(SCRIPTS)/setup_venv.sh
|
|
|
|
setup_libimobiledevice:
|
|
bash $(SCRIPTS)/setup_libimobiledevice.sh
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Build
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: build install clean unlock unlock_deploy
|
|
|
|
build: $(BINARY)
|
|
|
|
$(BINARY): $(SWIFT_SOURCES) Package.swift $(ENTITLEMENTS)
|
|
@echo "=== Building vphone-cli ==="
|
|
swift build -c release 2>&1 | tail -5
|
|
@echo ""
|
|
@echo "=== Signing with entitlements ==="
|
|
codesign --force --sign - --entitlements $(ENTITLEMENTS) $@
|
|
@echo " signed OK"
|
|
|
|
install: build
|
|
mkdir -p ./bin
|
|
cp -f $(BINARY) ./bin/vphone-cli
|
|
@echo "Installed to ./bin/vphone-cli"
|
|
|
|
clean:
|
|
swift package clean
|
|
rm -rf .build
|
|
|
|
unlock:
|
|
clang -arch arm64 -target arm64-apple-ios15.0 \
|
|
-o $(VM_DIR)/unlock $(SCRIPTS)/unlock.c
|
|
$(VM_DIR)/cfw_input/tools/ldid_macosx_arm64 -S$(SCRIPTS)/unlock.entitlements -M -K$(VM_DIR)/cfw_input/signcert.p12 $(VM_DIR)/unlock
|
|
@echo "Built $(VM_DIR)/unlock (arm64-ios)"
|
|
|
|
SSHPASS := $(VM_DIR)/cfw_input/tools/sshpass
|
|
SSH_PASS := alpine
|
|
VM_SSH_PORT := 22222
|
|
VM_SSH_HOST := root@localhost
|
|
VM_SSH_OPTS := -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 -q
|
|
|
|
unlock_deploy: unlock
|
|
@echo "[*] Deploying unlock to localhost:/var/root/unlock..."
|
|
$(SSHPASS) -p $(SSH_PASS) ssh $(VM_SSH_OPTS) -p $(VM_SSH_PORT) $(VM_SSH_HOST) \
|
|
'/iosbinpack64/bin/cat > /var/root/unlock && /iosbinpack64/bin/chmod +x /var/root/unlock' < $(VM_DIR)/unlock
|
|
@echo "[+] Deployed"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# VM management
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: vm_new boot boot_dfu
|
|
|
|
vm_new:
|
|
zsh $(SCRIPTS)/vm_create.sh --dir $(VM_DIR) --disk-size $(DISK_SIZE)
|
|
|
|
boot: build
|
|
cd $(VM_DIR) && "$(CURDIR)/$(BINARY)" \
|
|
--rom ./AVPBooter.vresearch1.bin \
|
|
--disk ./Disk.img \
|
|
--nvram ./nvram.bin \
|
|
--machine-id ./machineIdentifier.bin \
|
|
--cpu $(CPU) --memory $(MEMORY) \
|
|
--sep-rom ./AVPSEPBooter.vresearch1.bin \
|
|
--sep-storage ./SEPStorage
|
|
|
|
boot_dfu: build
|
|
cd $(VM_DIR) && "$(CURDIR)/$(BINARY)" \
|
|
--rom ./AVPBooter.vresearch1.bin \
|
|
--disk ./Disk.img \
|
|
--nvram ./nvram.bin \
|
|
--machine-id ./machineIdentifier.bin \
|
|
--cpu $(CPU) --memory $(MEMORY) \
|
|
--sep-rom ./AVPSEPBooter.vresearch1.bin \
|
|
--sep-storage ./SEPStorage \
|
|
--no-graphics --dfu
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Firmware pipeline
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: fw_prepare fw_patch fw_patch_jb
|
|
|
|
fw_prepare:
|
|
cd $(VM_DIR) && bash "$(CURDIR)/$(SCRIPTS)/fw_prepare.sh"
|
|
|
|
fw_patch:
|
|
cd $(VM_DIR) && $(PYTHON) "$(CURDIR)/$(SCRIPTS)/fw_patch.py" .
|
|
|
|
fw_patch_jb:
|
|
cd $(VM_DIR) && $(PYTHON) "$(CURDIR)/$(SCRIPTS)/fw_patch_jb.py" .
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Restore
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: restore_get_shsh restore
|
|
|
|
restore_get_shsh:
|
|
cd $(VM_DIR) && "$(CURDIR)/$(IDEVICERESTORE)" -e -y ./iPhone*_Restore -t
|
|
|
|
restore:
|
|
cd $(VM_DIR) && "$(CURDIR)/$(IDEVICERESTORE)" -e -y ./iPhone*_Restore
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# Ramdisk
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: ramdisk_build ramdisk_send
|
|
|
|
ramdisk_build:
|
|
cd $(VM_DIR) && $(PYTHON) "$(CURDIR)/$(SCRIPTS)/ramdisk_build.py" .
|
|
|
|
ramdisk_send:
|
|
cd $(VM_DIR) && IRECOVERY="$(CURDIR)/$(IRECOVERY)" zsh "$(CURDIR)/$(SCRIPTS)/ramdisk_send.sh"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
# CFW
|
|
# ═══════════════════════════════════════════════════════════════════
|
|
|
|
.PHONY: cfw_install cfw_install_jb
|
|
|
|
cfw_install: unlock
|
|
cd $(VM_DIR) && zsh "$(CURDIR)/$(SCRIPTS)/cfw_install.sh" .
|
|
|
|
cfw_install_jb: unlock
|
|
cd $(VM_DIR) && zsh "$(CURDIR)/$(SCRIPTS)/cfw_install_jb.sh" .
|