SafeB9SInstaller 校验系统源码分析:SHA-256 与 SigHax 特征识别的完整实现
SafeB9SInstaller 校验系统源码分析SHA-256 与 SigHax 特征识别的完整实现【免费下载链接】SafeB9SInstallerSafe, simple, user-friendly installer for sighaxed FIRMs项目地址: https://gitcode.com/gh_mirrors/sa/SafeB9SInstallerSafeB9SInstaller 是一款用于 3DS 的安全 FIRM 安装器其核心卖点在于先校验、后写入在安装任何固件FIRM之前程序会用SHA-256哈希对整个固件文件、每个数据分区、NAND 加密扇区逐层验证并通过签名特征识别判断固件是否经过 SigHax签名校验绕过。本文将从源码角度完整拆解这套校验系统从硬件加速的 SHA-256 实现到 SigHax 签名哈希对照表再到主流程中每一步的调用位置帮助你理解安全安装背后的完整实现逻辑。一、校验系统代码在哪里整个校验系统高度内聚主要分布在两个目录source/safety/validator.c/ validator.h —— 所有校验逻辑的大脑负责 FIRM 结构校验、SigHax 签名识别、秘密扇区验证source/crypto/sha.c/ sha.h —— 基于 3DS 硬件 SHA 单元的 SHA-256 实现source/installer.c —— 主安装流程按顺序调用上述校验函数并在校验失败时拒绝安装 一句话概括installer.c 负责流程编排validator.c 负责判定规则sha.c 负责算得快。二、SHA-256 实现用 3DS 的硬件单元算哈希很多人以为校验工具都是纯软件实现哈希SafeB9SInstaller 不是。打开 sha.c 可以看到它直接操作 3DS 芯片上的SHA 硬件寄存器REG_SHACNT0x1000A000控制寄存器配置工作模式REG_SHAINFIFO0x1000A080数据输入 FIFO往里面灌数据REG_SHAHASH0x1000A040读取最终哈希结果sha.h 中定义了两个工作模式宏值用途SHA256_MODE0本项目全部校验均使用 SHA-256SHA1_MODE0x20备用未在校验中使用对外暴露的 API 设计得非常经典就是一个初始化 → 喂数据 → 取结果的三段式sha_init(mode)—— 配置硬件为 SHA-256 模式sha_update(src, size)—— 每 64 字节0x40为一个块写入 FIFO硬件自动完成一次压缩轮sha_get(res)—— 触发最终轮从哈希寄存器读出 32 字节结果sha_cmp(sha, src, size, mode)—— 最常用的便捷函数算完直接和已知哈希比较返回 0 表示一致正因为sha_cmp这么简洁validator.c 里十几处校验全部是一行搞定。三、第一道关FIRM 文件结构校验FIRM 是 3DS 固件容器的通用格式validator.c 开头就用两个结构体把它画了出来FirmSectionHeader12 字节头部 32 字节哈希描述每个数据分区的偏移、内存地址、大小并自带该分区的 SHA-256 摘要FirmHeader以 4 字节魔数FIRM开头包含 ARM11/ARM9 入口地址、最多 4 个分区头以及 256 字节的签名区后面 SigHax 识别的关键ValidateFirmHeader()的判定逻辑非常直接魔数不是FIRM直接拒绝累加 4 个分区计算总大小任何分区偏移小于头部长度拒绝总大小超过 4MBFIRM_MAX_SIZE受 NAND 分区容量限制拒绝这三条防线挡掉的是损坏、伪造或越界的固件文件——后续所有哈希计算都在一个可信的内存范围内进行。四、第二道关逐分区 SHA-256 完整性校验核心函数是ValidateFirm()它的校验链条值得逐步拆解① 结构校验先调用ValidateFirmHeader()不通过立即返回。② 分区哈希比对遍历每个非空分区用 FIRM 头中自带的分区摘要做比对——sha_cmp(section-hash, (u8*) firm section-offset, section-size, SHA256_MODE)任何一个分区的哈希对不上就报Section X hash mismatch并中止。这意味着FIRM 内部哪怕被改动 1 个字节都逃不过去。③ 入口地址定位顺便验证头部的entry_arm11/entry_arm9必须落在某个分区地址范围内否则报ARM11/ARM9 entrypoints not found。④ 整文件 SHA 比对最后与 SD 卡上随附的.firm.sha文件32 字节原始哈希做全文件比对防止自带哈希的自洽固件骗过分区校验。 这是双保险设计分区哈希证明内部结构没被拆改整文件 SHA 证明就是发行者发布的那个文件。五、SigHax 特征识别签名哈希对照表 这是整个校验系统最精彩的部分。SigHax 的原理是替换 FIRM 的签名为已知可被利用的签名那么只要识别签名就能确认固件是否经过 SigHax 处理。validator.c 中硬编码了 4 张 SHA-256 对照表常量含义sighaxHash零售机SigHax 签名摘要由 Myria SciresM 暴力破解得出sighaxHash_dev开发机SigHax 签名摘要sighaxHash_alt另一枚被广泛使用的 SigHax 签名见 sighax.com 系列sectorHash/sectorHash_devNAND 0x96 秘密扇区的合法内容摘要零售/开发两套识别函数只有短短几行u32 CheckFirmSigHax(void* firm) { FirmHeader* header (FirmHeader*) firm; return ((sha_cmp((IS_DEVKIT) ? sighaxHash_dev : sighaxHash, header-signature, 0x100, SHA256_MODE) 0) || (!IS_DEVKIT (sha_cmp(sighaxHash_alt, header-signature, 0x100, SHA256_MODE) 0))) ? 0 : 1; }它的思路是不解析签名内容只比签名指纹——把 FIRM 头部那 256 字节签名0x100算出 SHA-256命中任意一张已知对照表就判定已 SigHax。零售机比对sighaxHash和sighaxHash_alt开发机则比对sighaxHash_dev。设备类型如何判定IS_DEVKIT宏定义在 source/common/unittype.h读取OTP 寄存器0x01FFB819判断是否开发版机器。同一份代码因此能同时支持零售 3DS 和开发机DevKit各自使用正确的哈希表。六、载荷识别与秘密扇区验证载荷识别CheckFirmPayload()负责确认这到底是哪个固件CheckBoot9Strap()在文件偏移 0x40 处查找魔数B9S命中即识别为 boot9strap 固件开放安装器模式OPEN_INSTALLER宏下还会用CheckFastBoot3DS()在 ARM9 分区头部查找FASTBOOT 3DS魔数都匹配不上则标记为unknown firm主流程会给出黄色警告并提示可能变砖秘密扇区验证ValidateSector()对 0x200 字节的秘密扇区整体做 SHA-256与sectorHash零售或sectorHash_dev开发机比对。这张表对应 NAND 0x96 扇区的合法明文是早期 ARM9LoaderHax 安装所需的身份凭证文件防止用户拿错机器类型的文件。七、主流程如何串联全部校验回到 installer.c 的SafeB9SInstaller()校验被编排成清晰的步骤且每一步失败都会立即终止步骤动作调用的校验Step 0检查 A9LH 状态IS_A9LH/IS_SIGHAX寄存器宏Step 1检查 SD 卡需 16MB 空闲FatFS 接口Step 2读取.firm.firm.shaValidateFirm()→CheckFirmSigHax()→CheckFirmPayload()Step 3校验秘密扇区文件ValidateSector()Step 4校验 NAND 加密与 FIRM 分区CheckFirmCrypto()/CheckSector0x96Crypto()Step X不可回退点用户手动输入按键序列确认ShowUnlockSequence()Step 5–6备份 → 写入 → 失败自动还原SafeWriteNand()等注意 Step 2 的三重顺序先验证文件完整性再确认 SigHax 特征最后识别载荷——任何一个环节失败状态面板都会显示红色并拒绝继续这正是 Safe 在名字里的分量。而 Step 5–6 的备份 失败自动还原机制则把校验失败和写入失败都变成了可逆操作。八、小结这套校验设计好在哪里硬件加速用 SoC 内置 SHA 单元大文件哈希在嵌入式环境下依然秒级完成sha.c多层防御结构 → 分区 → 整文件 → 签名特征 → 载荷识别五层校验各自独立层层递进validator.c特征识别而非内容解析SigHax 判定只依赖签名指纹 已知对照表实现极简却难以绕过设备自适应通过 OTP 寄存器自动切换零售/开发两套哈希表unittype.h失败可回滚所有校验前置写入前有备份出错自动还原installer.c对于想学习嵌入式安全校验的开发者来说SafeB9SInstaller 的safety/与crypto/两个目录合计不到 300 行就是一个麻雀虽小、五脏俱全的完整范本哈希怎么算、结构怎么验、特征怎么认、流程怎么编排全都有迹可循。【免费下载链接】SafeB9SInstallerSafe, simple, user-friendly installer for sighaxed FIRMs项目地址: https://gitcode.com/gh_mirrors/sa/SafeB9SInstaller创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻