How vphone-cli Bypasses Entitlements and Developer Mode on the TXM Coprocessor
vphone-cli uses a Swift-based firmware patcher called TXMDevPatcher to modify the raw TXM image before boot, replacing entitlement checks and developer-mode guards with unconditional success instructions.
The Lakr233/vphone-cli project enables virtualized iPhone environments on macOS by patching the Apple TXM (Trusted Execution Monitor) coprocessor firmware at load time. When bypassing entitlements and developer mode on the TXM coprocessor, the tool rewrites critical security checks in the binary image before the virtual machine initializes. This eliminates the need for host-level provisioning profiles or manual developer mode activation, allowing the virtual iPhone to boot with full debugging capabilities.
How TXMDevPatcher Modifies the TXM Firmware
Located in sources/FirmwarePatcher/TXM/TXMDevPatcher.swift, the TXMDevPatcher class implements a four-stage binary rewriting engine. The patcher operates on the raw TXM firmware image before it is loaded into the virtual iPhone, ensuring that entitlement checks always return true and developer-mode restrictions are neutralized.
The findAll() method sequentially invokes four independent patch routines, each targeting a specific security gate within the TXM binary. According to the source code, these patches are applied by searching for unique string literals, verifying surrounding instruction patterns, and emitting ARM64 opcode replacements via the emit() helper function.
The Four Core Entitlement and Developer Mode Patches
1. Get-Task-Allow Entitlement Bypass
The first patch forces the get-task-allow entitlement check to always succeed, which is required for code-signing bypass tricks.
The patcher locates the literal string "get-task-allow" in the binary, then scans forward for the pattern bl … tbnz w0, #0,… that constitutes the entitlement gate. Once identified, the unique BL (branch with link) instruction is replaced with mov x0, #1 using ARM64.movX0_1. This forces the function to return true regardless of the actual entitlement status.
2. Debugger Entitlement Injection
To allow debugger attachment without host provisioning, the patcher targets the com.apple.private.cs.debugger entitlement.
It searches for the string "com.apple.private.cs.debugger", then verifies the surrounding four-instruction pattern: mov x0,#0, mov x2,#0, bl <entitlement>, tbnz w0,#0,…. The BL instruction at this site is patched to mov w0, #1 (ARM64.movW0_1), unconditionally granting debugger access.
3. Developer-Mode Policy Guard NOP
This patch prevents the VM from aborting boot when the host's developer mode flag is disabled.
The patcher searches for the literal string "developer mode enabled due to system policy configuration" and walks backward up to 0x20 bytes looking for any conditional branch (tbz, tbnz, cbz, cbnz) that references register w9. Once found, the guard instruction is replaced with a NOP (ARM64.nop), effectively silencing the policy check.
4. Selector 24 Validation Bypass
An optional patch replaces the selector-24 handler to skip validation routines related to entitlement verification.
The patcher detects the mov w0,#0xa1 opcode (indicating PASS status), verifies the selector-24 pattern, then locates the function prologue and epilogue. It emits mov w0, #0xa1 followed by an unconditional branch to the epilogue, bypassing the original validation logic entirely.
Implementation Details in TXMDevPatcher.swift
The patching logic relies on string referencing and disassembly scanning. Below are simplified examples illustrating the core algorithms used in sources/FirmwarePatcher/TXM/TXMDevPatcher.swift.
Forcing the get-task-allow entitlement:
let refs = findStringRefs(Data("get-task-allow".utf8))
for (_, _, addOff) in refs {
// locate the BL → tbnz gate
if disasm.at(addOff).mnemonic == "bl" && disasm.at(addOff+4).mnemonic == "tbnz" {
emit(addOff, ARM64.movX0_1, patchID: "txm_dev.get_task_allow",
description: "get-task-allow: bl → mov x0,#1")
}
}
Bypassing the developer-mode guard:
let needle = "developer mode enabled due to system policy configuration"
let refs = findStringRefs(Data(needle.utf8))
for (_, _, addOff) in refs {
var back = addOff - 4
while back > addOff - 0x20 {
if let ins = disasm.disassembleOne(at: back),
["tbz","tbnz","cbz","cbnz"].contains(ins.mnemonic),
ins.operandString.hasPrefix("w9, #0,") {
emit(back, ARM64.nop,
patchID: "txm_dev.developer_mode_bypass",
description: "developer mode bypass")
}
back -= 4
}
}
All patches are applied atomically by the findAll() method during the firmware loading phase.
Integration with the Firmware Pipeline
The TXMDevPatcher is selected by sources/FirmwarePatcher/Pipeline/FirmwarePipeline.swift specifically for the .dev, .jb, and .exp firmware variants. When building these variants, the pipeline invokes TXMDevPatcher.findAll() to pre-process the TXM image before it is bundled into the virtual machine environment.
This integration ensures that the entitlement and developer mode bypasses are active only in development or jailbreak-oriented builds, while production builds may use unmodified TXM firmware.
Summary
- TXMDevPatcher in
sources/FirmwarePatcher/TXM/TXMDevPatcher.swiftrewrites the TXM coprocessor firmware before boot. - Four specific patches neutralize
get-task-allow,com.apple.private.cs.debugger, and developer-mode policy checks. - Each patch locates target instructions by searching for unique string literals and verifying ARM64 instruction patterns.
- The
emit()function applies ARM64 opcode replacements likemov x0, #1,mov w0, #1, andnop. - The
FirmwarePipeline.swiftactivates these patches only for development (.dev), jailbreak (.jb), and experimental (.exp) variants.
Frequently Asked Questions
What is the TXM coprocessor in Apple Silicon?
The TXM (Trusted Execution Monitor) coprocessor is a security subsystem in Apple Silicon that handles code signing validation, entitlement checks, and secure boot policies. In virtualized environments, it prevents unauthorized code execution and restricts debugging capabilities unless properly entitled.
Is modifying TXM firmware legal for development purposes?
Modifying firmware images for security research and virtualized development on hardware you own typically falls under fair use for research purposes. However, distributing modified proprietary firmware or using these bypasses to circumvent App Store protections may violate Apple's Software License Agreement and local laws. Use only on devices you own and control.
Which vphone-cli firmware variants use the entitlement bypasses?
According to FirmwarePipeline.swift, the TXMDevPatcher is automatically applied to firmware variants tagged as .dev (development), .jb (jailbreak), and .exp (experimental). Standard production builds do not include these patches to maintain security integrity.
Does bypassing TXM entitlements require disabling System Integrity Protection?
No, the patching occurs within the vphone-cli process before the TXM firmware is loaded into the virtual machine. The modifications happen in user space during the firmware preparation phase, so the host macOS can retain System Integrity Protection (SIP) and Secure Boot while still allowing the virtual iPhone to run with relaxed entitlements.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →