executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
re-console现代主机与复古平台逆向:Switch NSO/NPDM 容器与加密分区、PS4/PS5 ORBIS 结构、SDK 库指纹;复古 ROM 头/卡带格式/存档与 Cheat 码。 触发词:主机逆向、Switch、NSO、NPDM、PS4、PS5、ORBIS、Xbox、复古、ROM、NES、GBA、模拟器、Cheat。
Independent GitHub snapshot · Automated classification · Original documentation governs
所有工具先验证再使用。静态分析可免沙箱;涉及动态执行(模拟器运行 ROM、运行解密样本)默认沙箱 + 网络隔离([[re-analyze/platform-tips]] 最高原则)。
apt install ghidra / pacman -S ghidra):
brew install --cask ghidra;Windows: 官方 zipanalyzeHeadless -help(headless 模式)或 GUI 导入目标文件SciresM/hactool releases——1.4.0(2018 年发布的末版,支持 NSO0/NPDM 解析与解压,NPDM 可导出 JSON)提供 Windows 包(hactool-1.4.0-win.zip);Linux/macOS 从源码构建(config.mk.template 拷为 config.mk 后 make,依赖 zlib/openssl)hactool --help 显示完整选项Thealexbarney/LibHac 已不存在),引用到 hactoolnet 的资料先验证链接可用性,功能缺口用 hactool + 自写解析脚本(pyelftools)补齐-k keys.txt 指定 keyset(每行 key_name = HEX);默认读 $HOME/.switch/prod.keys(-d 时读 dev.keys)。解密 NCA/NAX0 需要对应 keyset,无密钥只能做结构层分析apt install binutils 等);macOS: brew install binutils 或 LLVM 系 readelf;Windows: WSL 内pip install pyelftools(脚本遍历程序头/节表)readelf --version、python3 -c "import elftools; print('ok')"-l 看 PT_SCE_* 段、-S 看节表);不绑定专用 ORBIS 查看工具(场景社区工具维护不一,先验证再使用)apt install mgba-qt(Qt 前端,universe)或 mgba-sdl;Fedora: 官方仓库只有 libretro 核心 dnf install libretro-mgba(无调试器),带调试器的 mGBA 用 Flatpak 或第三方 COPR(如 dnf copr enable archjun/mgba 后 dnf install mgba,第三方源自行评估);Arch: pacman -S mgba;macOS: brew install mgba;Windows: 官方站 mgba.io 安装包mgba --version-g/--gdb),默认监听 localhost:2345;GDB 侧 target remote localhost:2345,配合带符号 .elf 设断点(mGBA 的符号来自 .elf 而非 .gba);命令行 -d 调试器是 SDL/GTK 版功能,Qt 版用 GDB stubapt install fceux;Fedora/Arch: dnf install fceux / pacman -S fceux;Windows: 官方站 fceux.comfceux --versionbinwalk --version按顺序执行,每步结果存档(hash、偏移表、解析产物 sha256,[[re-triage]] 存证);动态执行默认沙箱。
容器识别(先定格式,再定工具链):
file target.bin
xxd -l 64 target.bin
binwalk target.bin # 内嵌/拼接文件扫描
NSO0(NSO 程序)、META(NPDM 文件头)、NCA3(NCA 容器)、NAX0(SD 加密分区)、PFS0(NSP 明文包容器);ExeFS 里 main(NSO)与 main.npdm 并存\x7fELF 开头(ORBIS ELF 带 PT_SCE_* 程序头);零售 dump 的 eboot.bin 是加密容器(无 ELF 魔数、熵高),加密边界在此——本技能只分析已合法获得的解密/未加密样本XBEH(初代 Xbox XBE)、XEX2(Xbox 360,24 字节大端头,0x8 指向内嵌 PE 数据、可选头表);Xbox One/Series 为微软系变体容器(XVD/ERA 体系),解析前先按样本实测探测4E 45 53 1A("NES\x1A");GBA 无魔数(0x0 是 ARM 分支指令,0x4 起 156 字节 Nintendo logo);GB 无魔数(0x104 起 48 字节 logo 判据 + 0x147 卡带类型);PSX 光盘是 ISO9660(CD001 卷描述符),主程序 SYSTEM.CNF 指向的 EXE 以 PS-X EXE 开头;原始 .bin 镜像扇区 2352 字节(非 2048),定位卷描述符时按 2352 换算扇区偏移.sav 无统一魔数(按容量/内容结构识别);PSX 记忆卡 dump 的 MC 签名在 0x0 与 0x1F80容器解析(分区/加密边界区分):
hactool -i main.nso # 段信息/压缩标志/ModuleId
hactool --uncompressed=main_u.nso main.nso # 压缩段解压(flags 压缩位置位时)
NSO0 头要点:0x0 魔数 NSO0;0x10/0x20/0x30 三段头(各 0xC 字节:FileOffset/MemoryOffset/Size,依次对应 .text/.rodata/.data);0x3C BSS 大小;0x40 起 0x20 字节 ModuleId(= ELF 的 build-id 摘要);0x60/0x64/0x68 三段压缩后大小;0x100 起为段数据(压缩段用 LZ4;22.0.0+ 固件 flags bit7 置位时为 ZBIC/zstd 变体,nxdumptool NsoFlags_UseZbicCompression=BIT(7))hactool -t npdm --json=main.json main.npdm # 导出权限 JSON
NPDM 要点:0x0 META 头(0x80 字节);0xE 主线程优先级、0xF 主线程核号、0x1C 主线程栈大小(0x1000 对齐);0x70/0x74 ACI0 偏移/大小、0x78/0x7C ACID 偏移/大小;ACID 区 0x200 处 ACID 魔数(前为 RSA-2048 签名与公钥)、ACI0 区 0x0 处 ACI0 魔数;ACI0 内含 ProgramId、文件系统/服务访问控制、内核能力(kernel capability)——权限面分析看这里hactool -t nca -k keys.txt --exefsdir=exefs/ --romfsdir=romfs/ file.nca 提取 ExeFS(内含 NSO/NPDM)与 RomFS;NAX0 另需 --sdseed 与 --sdpath 参数。无 keyset 只做结构层解析,不做解密绕过readelf -l eboot 看程序头——PT_SCE_DYNLIBDATA(0x61000000)、PT_SCE_PROCESS_PARAM(0x61000001)、PT_SCE_MODULE_PARAM(0x61000002)、PT_SCE_RELRO(0x61000010);readelf -S 看节表(.comment/.sceNote 等);导出表在 PT_SCE_DYNLIBDATA 内代码段提取进通用反编译:
nm/readelf -s 找未剥离符号,入口点常在模块参数段/入口节附近strings 找产品码/校验和特征(PSX 槽头 0x0A 处 BXXXX-12345 类产品码串)SDK 库指纹(版本识别 → 函数匹配加速):
NintendoSDK 版本串以样本实测为准.comment/.sceNote 节常含 SDK 版本串——sdk_version 是编译 SDK 版本,不等于运行固件版本补丁差异(联动 [[re-variant]]):
diff 或按 [[re-variant]] 的函数匹配流程;版本差异集中在 SDK 升级区与新增功能时,先按 SDK 指纹分层再逐层 diff复古:存档与 Cheat 码分析(内存地址 + 值模式):
MC 签名在 0x0 与 0x1F80;每块 64 帧 × 128 字节;槽头 128 字节——0x00 槽类型(0xA0 空/0x51 首块/0x52 中间/0x53 末块)、0x04 存档大小、0x08 下一块指针(多块存档是链表)、0x0A 产品码名、0x7F XOR 校验和;图标 16×16 4bpp 最多 3 帧(数据第 2 字节 0x11/0x12/0x13 表示帧数).sav 大小由卡带类型决定——GB 看 0x149 字段(0x02=8KB、0x03=32KB 常见);GBA 常见 SRAM 32KB、Flash 64/128KB、EEPROM 512B 级;无统一魔数,用容量 + 内容特征(校验和、ASCII 文本)识别AAAAAAAA 0000(8 位地址 + 4 位值)——GB/GBC 用 GameShark 8 位格式,勿混称;NES 系 6 字符编码(地址/值 + 密钥变换);先按编码规则解码出地址与值