FEX的dispatcher位置相关编码bug:JIT池低于0x119000000为何致命
发布时间:2026/10/4 4:55:40 作者:尧图编辑部 阅读量:1,286

FEX的dispatcher位置相关编码bugJIT池低于0x119000000为何致命【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira 是一个在越狱 iOS 设备上通过 FEX-Emu Wine DXMT 运行 x86-64 Windows PC 游戏的开源项目。这篇文章带你弄清它日志里反复出现的 0x119000000 到底意味着什么FEX 的 dispatcher调度入口存在一个位置相关编码 bug当 JIT 池的起始地址低于 0x119000000 时游戏会在第一个编译块运行之前就跳进零内存区域而崩溃——这是新手排查启动即闪退时最需要理解的一条底层约束。dispatcher是什么JIT池里的总调度台 先建立直觉再谈 bug。JIT 池FEX 把 x86-64 代码块翻译成 ARM64 机器码写到一块同时可读可执行RX的大内存区这就是 JIT 池通常 500MB 以上。dispatcher池内一个固定偏移0x7FFC130处的调度入口。guest 程序每切换一次函数、每完成一次系统调用都要先跳回它中转再分发到真正的编译块。可以把它理解成总调度台。关键点dispatcher 的地址 JIT 池基址 固定偏移它自身没有固定地址完全取决于池落在哪。而 bug 恰恰出在它落在哪上。为什么低于 0x119000000 是致命的FEX 在生成 dispatcher 时会把自身地址的顶部字节隐含地编进若干字面量literal pool修复中。实测发现JIT 池基址dispatcher 地址顶部字节结果0x114000000 ~ 0x117xxxxxx0x11字面量修复静默损坏mode A 失败≥ 0x119000000如 0x119000000 → dispatcher 0x120FC1300x12一切正常mode B也就是说 0x119000000 这个魔法数字的由来是池基址 0x7FFC130 之后dispatcher 地址的顶部字节恰好进入 0x12 区间。低于阈值时编码出来的跳转目标变成零内存执行流在 block 0 还没跑起来之前就静默分支到地址 0——没有任何报错只是整个会话直接死掉。这正是注释里写的 mode A低地址失败路径高于阈值时走 mode B由 Wine 侧运行时修补兜底逻辑见 build/ntdll-unix/signal_arm64_ios.c 中init_syscall_frame的 PC 重定向。 一句话记住池放低了dispatcher 的第一次分发就会跳进 0x0且不会告诉你为什么。Madeira如何把地址垫高三道防线bug 出在 FEX 内部修复思路只能在给池选地址这一层做文章。app/Madeira/StikJITHelper.swift 实现了三道防线预占低地址空间pin 循环在真正申请池之前先反复vm_allocate每次 16MBVM_FLAGS_ANYWHERE把系统的分配前沿一路推到 0x119000000 之上最多 32 块这样调试器随后申请的 RX 池只能落在高位。注意它不是固定垫 96MB而是动态垫到前沿越过阈值为止——固定数量在 ASLR 低滑移时会垫不够真实事故6 块只到 0x118790000差 8.4MB启动即快速失败。落地后逐条校验不合格就重抽池地址必须同时满足三条L404-L413≥ 0x119000000低于则记mode A low不在 guest 64GB 窗口 [0x7000000000, 0x8000000000) 内不覆盖 0x140000000 的可执行窗口。 不合格就释放并重试最多 3 次仍失败则报BAD POOL并延迟退出让你重启。空洞普查hole census申请前先扫描 [0x119000000, 0x7000000000) 的真实空闲空洞放不下就主动缩小池宁要能启动的小池也不要落进 guest 窗口的大池后者是另一种致命摆放。遇到闪退时用户应该看什么如果你玩着遇到启动即黑屏/只有壁纸/秒退按顺序检查日志里搜BAD POOL placement——出现(mode A low)说明池落低了退出重开一次ASLR 每次给的地址不同多数情况重开即好搜JIT-pool pin chunk——这些行记录了垫高过程是否顺利确认 JIT 是通过 Madeira 应用内的 Enable JIT 按钮开启的只有 StikDebug 带着 Madeira 的脚本挂上池申请才有应答否则会提示 StikDebug is not attached 而不是崩溃。相关资料导航核心实现与完整注释app/Madeira/StikJITHelper.swift池基址门槛在故障分派侧的体现build/ntdll-unix/signal_arm64_ios.cmode B 的运行时修补点build/ntdll-unix/signal_arm64_ios.c项目总览README.md【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考