
【免费下载链接】SavageWindRecompWork-in-progress static recompilation of The Legend of Zelda: Breath of the Wild (Switch, v1.9.0) for Windows and Linux. Bring your own dump: no game files, keys or dumping tools included.项目地址https://gitcode.com/gh_mirrors/sa/SavageWindRecomp点击查看免费下载SavageWindRecomp 是把《塞尔达传说旷野之息》Switch 1.8.2静态重编译为 Windows / Linux 原生程序的项目。它自带一套非常完整的逆向与调试工具箱命令行驱动的 Ghidra 查询、页面级写内存陷阱watch trap以及 200 多个SAVAGEWIND_*环境变量诊断开关。本文带你快速看懂这套工具遇到崩溃、花屏或性能掉帧时知道该查什么、怎么查。SavageWindRecomp 是什么先搞懂调试对象整个项目由三部分构成重编译器把游戏 AArch64 指令静态翻译成 C 代码再用本机编译器编译成swgame.dll/swgame.so工具在 tools/gen.py运行时模拟 Horizon 内核、NVN 图形 APIVulkan 后端、音频等服务代码在 runtime/诊断工具Python 探针、Ghidra 查询、一组 shell 脚本集中在 tools/。调试这个项目的难点在于游戏代码有 12 万 函数崩溃时只给你一串0x700xxxxxxx地址。下面三套工具就是为解决地址 → 含义而存在的。Ghidra 逆向查询把百万级函数库变成命令行数据库项目的逆向工作不靠鼠标点 Ghidra 界面而是把一个只读 Ghidra 项目当数据库用。完整说明见 tools/ghidra/README.md。一次性设置导入并分析 main 模块需要 Ghidra 12.1.2 Switch Loader 扩展 JDK 21用analyzeHeadless把extracted/exefs/main导入项目旷野之息有约 13.1 万函数需数小时、建议 12G 内存。分析只做一次之后所有查询都以只读方式打开项目不会改动任何内容。路径配置通过环境变量或 git 忽略的 tools/ghidra/gq.local.json 提供。日常使用的 7 类查询命令入口是 tools/ghidra/gq.py它把请求写入临时文件调起analyzeHeadless -readOnly执行 SWQuery.java 脚本结果直接打印到终端python tools/ghidra/gq.py summary # 程序概览内存块、函数统计 python tools/ghidra/gq.py decompile 0x70001234a0 # 反编译伪代码 python tools/ghidra/gq.py xrefs nvnBootstrapLoader # 找调用者 python tools/ghidra/gq.py strings Actor/.*bactorpack 20 # 正则搜字符串其余命令还有callees被调用函数、disasm反汇编、symbols符号表正则、functions全量函数 TSV 导出。两点值得注意地址自动换算Ghidra 中main加载在0x7100000000而运行时用0x7000000000gq.py会自动平移运行时地址并在 stderr 说明见 gq.py#L45-L51批量查询每次调用要启动一次 headless约半分钟所以尽量把多个地址塞进同一条decompile/xrefs。项目的证据规则README 里有一条工作准则值得所有逆向新人学习每个关于函数行为的论断都必须给出证据——地址、关键伪代码、支持该结论的调用者给函数改名时必须注明来源字符串引用、zeldaret 对照、调用模式。这避免了逆向中最常见的凭感觉命名污染。SAVAGEWIND_WATCH 写陷阱揪出谁踩了我的内存这是项目里最硬核的诊断手段实现横跨 runtime/kernel.c#L1149-L1219 和 runtime/dispatch.c#L255-L337变量作用SAVAGEWIND_WATCHaddr:len对一段 guest 内存做页面级写陷阱变更时报告写者模块offset与 PCSAVAGEWIND_WATCH_DEREFoff:len同时监视指针指向的那块内存追踪链表节点SAVAGEWIND_WATCH_TRAP升级为页错误陷阱而非轮询可顺藤摸瓜定位触碰链表节点的函数SAVAGEWIND_WATCH_STEP1每次访问后立即重设页面Windows 单步SAVAGEWIND_WATCH_FOLLOW写者存入新指针时陷阱自动跟随到下一个节点SAVAGEWIND_WATCH_WRITESn记录最近 n 条写入而不是只显示最新一条真实案例早期特效堆链表损坏、游戏死循环的 bug就是靠它锁定的——HLE 把NVNtextureView多存了 0x18 字节覆盖了sead::ExpHeap下一块的头watch 陷阱直接报出了越界写入者的函数位置详见 docs/SAVAGE-WIND.md 的启动排错记录。内存越界类崩溃第一反应就应该是它。40 SAVAGEWIND_* 环境变量按场景速查运行时代码中共有200 个SAVAGEWIND_*开关开发者文档docs/SAVAGE-WIND.md列出了最常用的一批。按调试场景分类速查复现与脚本化输入变量用途SAVAGEWIND_INPUT400:A:6,1400:ZL:8,...按帧数注入按键脚本让每次都在同一地方崩成为可能SAVAGEWIND_SHOT_ATframe在指定帧截图到build/frames/逐帧对比SAVAGEWIND_DEBUG_FRAMEframe把某帧的每个渲染 pass 存成build/pass_NNN.pngSAVAGEWIND_HIDDEN1无窗口运行适合批量 A/B 测试SAVAGEWIND_REBOOT_ATframe在指定帧原地重启用于复现重启后花屏性能剖析与掉帧定位变量用途SAVAGEWIND_VK_PROF1每帧打印后端 / 呈现 / 游戏侧耗时拆解SAVAGEWIND_HITCH_MS1记录慢帧及其成因翻译、GPU 等待、编译、暂停SAVAGEWIND_TIMELINEframe:n输出[tl]毫秒级时间线交付、fence、锁等待、提交线程工作SAVAGEWIND_FPSn/SAVAGEWIND_MAX_INTERVAL2固定帧率与帧间隔保证 A/B 测试走同一条路SAVAGEWIND_SAMPLE采样式 profiler 抓各线程热点图形、纹理与着色器变量用途SAVAGEWIND_TRACE_TEXanxal\|all追踪指定尺寸纹理的完整写入历史并落盘SAVAGEWIND_DEBUG_PICKx,y F9像素级取色列出哪些 draw 改写了该像素SAVAGEWIND_DEBUG_TEXDUMPfs hash把某 fragment shader 首次 draw 用到的纹理逐通道 dumpSAVAGEWIND_SHADER_DUMP1保存翻译失败的 Maxwell 着色器到build/shaders/SAVAGEWIND_VK_ADDR_REPORTlo-hi跟踪 GPU 地址的分配/释放定位 device fault 的元凶SAVAGEWIND_NO_DEPTH_CLAMP1等NO_*系列逐个关闭特性做 A/B确认是哪个状态导致画面异常系统级与音频SAVAGEWIND_THREAD_DUMP_ATs定时 dump 所有线程栈和 mutex 持有者、SAVAGEWIND_NVN_LOG1游戏查找的 NVN 函数与设备查询、SAVAGEWIND_AUDIO_LOG1/SAVAGEWIND_AUDIO_WAVf音频渲染耗时、录输出、SAVAGEWIND_CORES0关闭多核模拟隔离调度类 bug、SAVAGEWIND_ONE_CORE1、SAVAGEWIND_ROMFS_OVERLAY目录覆盖游戏文件做 mod 实验、SAVAGEWIND_DUMP_DATA_ATframedump.data/.bss对比状态。配套脚本把诊断变成一键操作tools/ 下还有一组把上述变量串起来的脚本tools/run.sh构建 运行 N 秒 自动把日志里的f_地址回灌给 tools/sym.py 符号化直接输出可读的 guest 调用栈tools/frames.sh / tools/dbgfs.sh帧序列截图、单帧可视化某个寄存器SAVAGEWIND_DBG_FS把寄存器画成 fragment shader 输出——调 shader bug 的神器tools/explore_input.sh / tools/explore_far.sh按种子生成随机行走的SAVAGEWIND_INPUT脚本可复现地压测更远的世界区域tools/sw_probe.py不写一行 C 就探测 exefs——模块布局、函数发现数、lifter 未支持的指令、NVN 函数缺口一目了然是编译前最省事的体检工具。给新手的排障清单崩溃先跑tools/run.sh拿到符号化 backtrace用gq.py decompile看崩溃函数伪代码内存损坏类上SAVAGEWIND_WATCH花屏SAVAGEWIND_DEBUG_FRAME存 pass 图找第一个出错的 pass再用SAVAGEWIND_DEBUG_PICK定位像素掉帧SAVAGEWIND_VK_PROF1 SAVAGEWIND_HITCH_MS1看拆解用SAVAGEWIND_INPUT固定路线做 A/B提交 bug 报告附上复现SAVAGEWIND_INPUT脚本、崩溃帧号、日志——这三样能让开发者直接复现你的现场。这套工具箱的核心理念值得借鉴逆向结论要可验证、bug 复现要可脚本化、一切诊断输出到本地而不入库。如果你也在做游戏重编译或模拟器项目这套Ghidra 数据库 内存陷阱 环境变量开关的组合拳完全可以照搬。赞分享【免费下载链接】SavageWindRecompWork-in-progress static recompilation of The Legend of Zelda: Breath of the Wild (Switch, v1.9.0) for Windows and Linux. Bring your own dump: no game files, keys or dumping tools included.项目地址https://gitcode.com/gh_mirrors/sa/SavageWindRecomp点击查看免费下载相关推荐MCP Toolbox 的 MySQL 预置配置Prebuilt Config完全指南环境变量、数据访问与查询诊断工具MCP Toolbox 的 MySQL 预置配置Prebuilt Config完全指南环境变量、数据访问与查询诊断工具 MySQL 预置配置prebuiGhidra逆向工程工具的终极安装与完整指南 想要开始二进制分析和逆向工程之旅吗Ghidra安装是您的最佳起点作为知名机构开发的开源逆向工程工具Ghidra提供了强大的功能集让您能够深入分析各种二进三个数字定页面Taste-Skill 审美规则指南三个数字定页面Taste Skill 审美规则指南 先填 8、6、4再谈生成页面 把需求丢给 AI 写落地页十次有八次拿回同一副面孔紫渐变、居中大标题、AI 技能前端人工智能AI 评测上一篇Apache Pulsar PIP-90 深度解读将 Broker Entry Metadata 暴露给客户端下一篇SAM 3 图像提示概念分割评测指南SA-Co/Gold 基准的 cgF1 评测复现与数据格式详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考