ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Madeira 的 StikDebug 协议深度解析:BRK 0xf00d 命令分派完全解读

Madeira 的 StikDebug 协议深度解析:BRK 0xf00d 命令分派完全解读 Madeira 的 StikDebug 协议深度解析BRK #0xf00d 命令分派完全解读【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira本文带你完整解读Madeira的StikDebug 协议它让 Windows PC 游戏x86/x86-64通过 FEX-Emu Wine DXMT 在未越狱的 iPhone 上运行而协议的核心BRK #0xf00d指令正是 iOS 限制下借调试器之手执行 JIT 代码的命令分派桥梁——一条中断指令就是一次系统调用。一、为什么 iOS 上的 PC 模拟器要借调试器的手iOS 有严格的 W^X写异或执行内存策略应用不能自己创建可执行内存唯一例外是——当调试器附加、进程带上CS_DEBUGGED标志时JIT 才被允许。Madeira 恰好重度依赖 JITFEX 动态翻译器要在运行时把游戏的 x86-64 指令实时编译成 ARM64 机器码。于是 Madeira 设计了这套握手协议发送端app 自身JITAllocator.c里的内联汇编应答端StikDebug 调试器或内置的 StikJIT 辅助进程由一份捆绑的 JavaScript 脚本 madeira-jit.js 驱动信道ARM64 的BRK #0xf00d中断指令启用入口在 StikJITHelper.swift通过stikdebug://enable-jitURL 把 bundle ID、当前 PID 和 base64 编码的脚本传给调试器最多等待 90 秒轮询直到CS_DEBUGGED置位且调试器真正在线。二、协议总览一条 BRK 指令 一次系统调用 协议约定非常简单——寄存器就是接口寄存器用途x16命令号分派键x0参数 1通常是地址0 表示帮我分配x1参数 2通常是大小x0返回值调试器写回的结果发送端在 JITAllocator.c 中只需两行汇编。以申请 JIT 内存为例__asm__ volatile( mov x16, #1\n brk #0xf00d\n : r(x0) : r(x1) : x16, memory );执行到brk时进程触发陷阱控制权交给调试器。脚本读出寄存器、完成操作、把结果写回x0再把 PC 前移 4 字节后继续运行——对游戏来说这就是一次透明的系统调用。三、x16 命令分派表完整解读 madeira-jit.js 是协议的内核态。它只认两个 BRK 立即数0xf00d通用协议和0x69旧版协议其余 BRK 一律跳过并把x0清零。x16 0CMD_DETACH 断开调试器发送D命令让调试器脱附。注意CS_DEBUGGED是粘性标志——脱附后依然保持置位JIT 能力不会失效所以游戏加载 PE 依赖项完成后就可以断开释放调试会话。x16 1CMD_PREPARE_REGION 准备可执行内存这是最核心的命令流程见 madeira-jit.js若x0 0请求自动分配脚本向 StikDebug 发_Msize,rx让调试器分配一块 RX只读可执行内存调用prepare_memory_region(addr, size)把该区域标记为可执行把最终地址写回x0游戏端拿到的就是开箱即用的代码池基址x16 3CMD_MAP_PAGE_ZERO 在地址 0 放 TEBWindows 的线程环境块TEB按惯例映射在地址 0但 iOS 内核拒绝应用自己映射页 0。脚本借调试器的更高权限从 app 内存读出 TEB 数据直接写入地址 0约 16KBx0返回 0/1 表示成败。Wine 侧的发起点见 signal_arm64_ios.c。x16 0x69兼容旧协议对旧版 StikDebug 的兼容路径直接用x0作为地址与大小调用prepare_memory_region。四、内存摆放一次必须掷对骰子的分配 拿到调试器后StikJITHelper.swift 的allocatePool()才是重头戏它要申请一块默认 128MB 的 JIT 池RX再用vm_remap在其上叠一层 RW 别名视图——写代码走 RW跑代码走 RX这就是 W^X 下的双映射区域。难点在于 iOS 内核第一匹配分配、不接受地址提示池子落在哪里全凭运气。代码中用三个红线区间校验每次分配红线地址范围踩中后果下限 0x119000000FEX 的位置相关编码 bug 被触发分派器跳进零内存来宾 64G 窗口[0x7000000000, 0x8000000000)Wine 在此打包 PE 镜像池代码会被误判为来宾地址首帧黑屏可执行窗口[0x140000000, 128MB)吞掉无重定位表游戏如 RDR2.exe的固定基址TLS 指针全部失效分配不合格就释放或钉住重试最多 3 次实在摆不下就宁可缩小池子甚至失败退出也不让游戏带病运行——详细逻辑见 StikJITHelper.swift。池子就绪后还会调用jit_make_region_no_footprint()申请 jetsam 豁免避免大块内存写入被系统按物理占用直接杀掉。五、安全网没人应答 BRK 时会发生什么 ️协议最脆弱的一环是BRK 发出去却没人接。项目为每一种失败都准备了明确的退路app 侧JITAllocator.c 安装 SIGTRAP 兜底处理器。没有调试器在线时BRK 被处理器吞掉、x0置 0应用得到请求失败的返回值而不是崩溃Wine 侧信号处理器中的case 0xf00d专门识别游离的协议 BRK 并跳过见 signal_arm64_ios.c不会把协议中断当成崩溃上报脚本侧只服务 BRK。其他真实故障缺页、非法指令等被还原为对应的 Unix 信号交还给 Wine 的sigaction处理器同一故障 8 次无法投递时直接杀死进程——可见的死亡好过一个永远挂起的线程UI 侧ready状态要求CS_DEBUGGED置位且调试器在线 或 本次运行的池已建成防止标志还在、调试器已走的假就绪见 StikJITHelper.swift六、关键文件速查表文件角色app/Madeira/JITAllocator.cBRK 发送端jit26_prepare_region/jit26_detachapp/Madeira/JITAllocator.h协议 API 与 iOS 26 BRK 协议注释app/Madeira/madeira-jit.js调试器侧主循环与 x16 命令分派app/Madeira/StikJITHelper.swift启用入口URL Scheme与 JIT 池摆放策略app/MadeiraJITHelper/MadeiraJITHelper.swift内置 StikJIT 辅助进程XPC 转发 PID 与脚本build/ntdll-unix/signal_arm64_ios.cWine 侧 0xf00d 兜底与页 0 TEB 请求docs/JIT.md官方 JIT 配置指南StikDebug / 内置 StikJIT 延伸阅读JIT 环境的完整配置流程StikDebug 配对、LocalDevVPN、内置配对见 docs/JIT.md本文协议正是由其中的Enable JIT按钮触发。七、一句话总结BRK #0xf00d是 Madeira 在 iOS 铁幕上凿出的一个合规通道app 用寄存器当参数发起请求调试器脚本按x16分派三个命令——分配可执行内存、修补页 0、脱附——再写回结果。配合精心设计的地址红线、重试策略和多层兜底这套不足 400 行脚本的轻量协议撑起了整个 Windows PC 游戏在 iPhone 上的实时动态翻译。【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表