mirror of
https://github.com/Lakr233/vphone-cli.git
synced 2026-04-05 13:09:06 +08:00
157 lines
7.1 KiB
Markdown
157 lines
7.1 KiB
Markdown
# TXM Variant Analysis: release vs research
|
|
|
|
Analysis of TXM (Trusted Execution Monitor) variants from iPhone17,3 26.3 (23D127)
|
|
and PCC-CloudOS 26.3 (23D128) IPSWs.
|
|
|
|
## Source Files
|
|
|
|
| Source | Variant | IM4P Size | SHA256 |
|
|
| ------- | -------- | --------- | --------------------- |
|
|
| cloudos | release | 161025 | `3453eb476cfb53d8...` |
|
|
| cloudos | research | 161028 | `93ad9e382d8c6353...` |
|
|
| iphone | release | 161025 | `3453eb476cfb53d8...` |
|
|
| iphone | research | 161028 | `93ad9e382d8c6353...` |
|
|
|
|
**Key finding:** Both IPSWs contain identical TXM files (same SHA256).
|
|
The TXM binary is shared across iPhone and cloudOS IPSWs.
|
|
|
|
## Decompressed Binary Overview
|
|
|
|
| Property | RELEASE | RESEARCH |
|
|
| ----------------- | --------------------- | --------------------- |
|
|
| Compressed size | 160726 bytes | 160729 bytes |
|
|
| Decompressed size | 458784 bytes | 458784 bytes |
|
|
| Compression | BVX2 (LZFSE) | BVX2 (LZFSE) |
|
|
| Format | Mach-O 64-bit ARM64 | Mach-O 64-bit ARM64 |
|
|
| SHA256 | `bfc493e3c7b7dc00...` | `62f40b9cd32a2a03...` |
|
|
| File type | 2 (MH_EXECUTE) | 2 (MH_EXECUTE) |
|
|
| Load commands | 11 | 11 |
|
|
| Flags | `0x00200001` | `0x00200001` |
|
|
|
|
## Mach-O Segments
|
|
|
|
Both variants have identical segment layout:
|
|
|
|
| Segment | VM Address | VM Size | File Offset | File Size |
|
|
| ------------------ | -------------------- | --------- | ----------- | --------- |
|
|
| `__TEXT` | `0xfffffff017004000` | `0x10000` | `0x0` | `0x10000` |
|
|
| `__DATA_CONST` | `0xfffffff017014000` | `0xc000` | `0x10000` | `0xc000` |
|
|
| `__TEXT_EXEC` | `0xfffffff017020000` | `0x44000` | `0x1c000` | `0x44000` |
|
|
| `__TEXT_BOOT_EXEC` | `0xfffffff017064000` | `0xc000` | `0x60000` | `0xc000` |
|
|
| `__DATA` | `0xfffffff017070000` | `0x4000` | `0x6c000` | `0x4000` |
|
|
| `__LINKEDIT` | `0xfffffff017074000` | `0x4000` | `0x70000` | `0x20` |
|
|
|
|
Segment layout identical: **True**
|
|
|
|
## Diff Summary
|
|
|
|
- Total differing bytes: **3358** / 458784 (0.73%)
|
|
- Diff regions (16-byte merge gap): **87**
|
|
|
|
### Diffs by Segment
|
|
|
|
| Segment | Regions | Bytes Changed | % of Segment |
|
|
| ------------- | ------- | ------------- | ------------ |
|
|
| `__TEXT` | 3 | 3304 | 5.04% |
|
|
| `__TEXT_EXEC` | 84 | 409 | 0.15% |
|
|
|
|
## Diff Classification
|
|
|
|
### 1. Build Identifier String (Primary Difference)
|
|
|
|
The largest diff region (`0x17c5` - `0x2496`, 3282 bytes) is in the `__TEXT` segment
|
|
string/const data area. The key difference is the build variant identifier:
|
|
|
|
| Offset | RELEASE | RESEARCH |
|
|
| -------- | ------------------------------------------------ | ------------------------------------------------- |
|
|
| `0x17c5` | `lease.TrustedExecutionMonitor_Guarded-182.40.3` | `search.TrustedExecutionMonitor_Guarded-182.40.3` |
|
|
| `0xcb7f` | `lease` | `search` |
|
|
|
|
Full build string:
|
|
|
|
- **RELEASE:** `release.TrustedExecutionMonitor_Guarded-182.40.3`
|
|
- **RESEARCH:** `research.TrustedExecutionMonitor_Guarded-182.40.3`
|
|
|
|
Because `"research"` (8 chars) is 1 byte longer than `"release"` (7 chars),
|
|
all subsequent strings in `__TEXT` are shifted by +1 byte,
|
|
causing a cascade of instruction-level diffs in code that references these strings.
|
|
|
|
### 2. String Reference Adjustments (Code Diffs)
|
|
|
|
The remaining diffs are in `__TEXT_EXEC` — all `ADD` instruction immediate adjustments
|
|
compensating for the 1-byte string shift:
|
|
|
|
```
|
|
RELEASE: add x8, x8, #0x822 ; points to string at original offset
|
|
RESEARCH: add x8, x8, #0x823 ; points to same string, shifted +1
|
|
```
|
|
|
|
- ADD immediate adjustments: **84** regions (all in `__TEXT_EXEC`)
|
|
- Other code diffs: **0** regions
|
|
- String data regions: **3** regions in `__TEXT` (3304 bytes total)
|
|
|
|
Sample code diffs (first 10):
|
|
|
|
| Offset | RELEASE instruction | RESEARCH instruction |
|
|
| --------- | -------------------- | -------------------- |
|
|
| `0x2572c` | `add x8, x8, #0x822` | `add x8, x8, #0x823` |
|
|
| `0x25794` | `add x8, x8, #0x861` | `add x8, x8, #0x862` |
|
|
| `0x257d8` | `add x0, x0, #0x877` | `add x0, x0, #0x878` |
|
|
| `0x25980` | `add x0, x0, #0x8d7` | `add x0, x0, #0x8d8` |
|
|
| `0x25ac8` | `add x0, x0, #0x8a1` | `add x0, x0, #0x8a2` |
|
|
| `0x25af0` | `add x4, x4, #0x8eb` | `add x4, x4, #0x8ec` |
|
|
| `0x25b78` | `add x0, x0, #0x8f9` | `add x0, x0, #0x8fa` |
|
|
| `0x25c34` | `add x2, x2, #0x911` | `add x2, x2, #0x912` |
|
|
| `0x25c58` | `add x2, x2, #0x919` | `add x2, x2, #0x91a` |
|
|
| `0x25c98` | `add x0, x0, #0x927` | `add x0, x0, #0x928` |
|
|
|
|
### 3. Functional Differences
|
|
|
|
**None.** All code diffs are string pointer adjustments caused by the 1-byte
|
|
shift from `"release"` to `"research"`. The two variants are **functionally
|
|
identical** — same logic, same security policies, same code paths.
|
|
|
|
## Security-Relevant Strings
|
|
|
|
Both variants contain identical security-relevant strings:
|
|
|
|
| Offset | String |
|
|
| -------- | --------------------------------- |
|
|
| `0xd31` | `restricted execution mode` |
|
|
| `0x1919` | `debug-enabled` |
|
|
| `0x1a4e` | `darwinos-security-environment` |
|
|
| `0x1ad0` | `security-mode-change-enable` |
|
|
| `0x1b4b` | `amfi-only-platform-code` |
|
|
| `0x1bd6` | `research-enabled` |
|
|
| `0x1c4c` | `sec-research-device-erm-enabled` |
|
|
| `0x1cca` | `vmm-present` |
|
|
| `0x1d33` | `sepfw-load-at-boot` |
|
|
| `0x1de8` | `sepfw-never-boot` |
|
|
| `0x1e85` | `osenvironment` |
|
|
| `0x1ec4` | `device-recovery` |
|
|
| `0x1f81` | `TrustCache` |
|
|
| `0x202a` | `iboot-build-variant` |
|
|
| `0x20a9` | `development` |
|
|
| `0x23da` | `image4 dispatch` |
|
|
|
|
## Implications for Patching
|
|
|
|
1. **Either variant works** — the code is functionally identical.
|
|
2. **`fw_patch.py` uses the research variant** (`txm.iphoneos.research.im4p`)
|
|
because the `iboot-build-variant` device tree property in PCC VMs is set to
|
|
`"research"`, and TXM validates this matches its own embedded variant string.
|
|
3. **String-based patch anchors** that reference the build variant string
|
|
(`"release"` / `"research"`) will match at different offsets — patchers should
|
|
use variant-agnostic anchors (e.g., `mov w19, #0x2446` as in `txm.py`).
|
|
4. **The 3-byte IM4P size difference** (161025 vs 161028 bytes) comes from the
|
|
extra byte in `"research"` plus LZFSE compression variance.
|
|
5. **Both IPSWs ship the same TXM** — no need to prefer one source over the other.
|
|
|
|
## Conclusion
|
|
|
|
The TXM `release` and `research` variants are **cosmetically different but
|
|
functionally identical**. The only real difference is the embedded build variant
|
|
string (`"release"` vs `"research"`), which causes a 1-byte cascade in string
|
|
offsets and corresponding `ADD` immediate adjustments in code.
|
|
Both IPSWs (iPhone and cloudOS) ship the same pair of TXM binaries.
|