如何用skitter-creek-bath-salts的dram_dump批量读取受保护内存:含别名映射与往返校准的完整教程

发布时间:2026/10/8 15:42:14
如何用skitter-creek-bath-salts的dram_dump批量读取受保护内存:含别名映射与往返校准的完整教程 如何用skitter-creek-bath-salts的dram_dump批量读取受保护内存含别名映射与往返校准的完整教程【免费下载链接】skitter-creek-bath-saltsUnlocking _everything_ on the CPU with DRAM scrambling项目地址: https://gitcode.com/gh_mirrors/sk/skitter-creek-bath-saltsskitter-creek-bath-salts是一个基于DRAM 地址扰序DRAM scrambling的研究型开源工具集它改写 AMD 内存控制器MCT/DCT里的一两个配置位把物理地址搅成意大利面让受保护内存区域PSP、SMRAM、C6 上下文等通过别名地址alias变得可读。本文聚焦其中的批量读取工具 userspace/dram_dump.c从别名映射的原理、.map文件的生成到内置的固件指纹校验 往返校准双重安全机制一步步带你完成对受保护 DRAM 区间的批量转储。一、动手前的三个前提⚠️ 先说清楚这是一个研究向工具会临时改写活体内存控制器状态可能造成系统不稳定。请务必在自有的备用机器上实验并准备好断电重启手段。前提说明目标平台AMD Family 16h数据手册公开了内存控制器转换寄存器且不可锁定。可用 userspace/platform_check.c 提前自检不支持的平台会直接退出root 权限所有用户态工具均需 root 运行内核模块 kernel/spaghettify.c 提供/dev/spaghettify设备节点匹配内存的别名映射仓库 data/maps/ 内置了多种 DIMM 配置的现成.map文件如2x4gb_fw-s1b1_at-s0b0.map文件名中的fw-sWbS / at-sWbS表示固件默认状态与扰序访问状态也可用自己硬件生成见第四节用sudo dmidecode -t memory查看你的内存条型号对照 data/maps/ 前缀即可选到正确的映射。二、别名映射为什么别的地址能读到受保护内存 理解dram_dump的关键是理解别名alias正常视图下物理地址A经内存控制器换算成 DRAM 坐标落在受保护单元里——普通读访问会被围栏fence挡下返回全0xff控制器被临时翻转某个 swizzle 位后另一个普通地址B经换算落在同一个 DRAM 单元于是在扰序视图中读B就等于在正常视图中读A而B是一条完全不受围栏保护的普通通路。读完后立刻还原控制器位平台恢复原状不留痕迹。这个地址搅动过程的直观演示x ! x的瞬间数学上地址转换是 GF(2) 线性映射所以只要采集一批(target, alias)数据对就能用 Z3 求解出完整的扰序矩阵——这就是.map文件。三、dram_dump 的内置双保险固件指纹 往返校准批量读受保护内存最怕的不是读不到而是读错位置。userspace/dram_dump.c 在每次真正读取之前强制执行两道检查1️⃣ 固件指纹fw-fingerprint校验工具先查询控制器实时寄存器swizzle / bankswap / bank-addr-map与.map文件头部的fw_*字段比对。BIOS 更新、换内存条、重训导致任何一位不一致运行立即中止--ignore-fw-mismatch可强制跳过仅建议研究使用。2️⃣ 往返校准round-trip calibration内核模块在加载时保留一块 16 KB 的安全区DRAM_SCRATCH_INFO其中没有别的内核代码会碰工具从安全区自动挑一个满足约束的普通地址短暂写入一个随机魔数随后恢复再按映射预测的别名在扰序视图下读回读回值不等于魔数 → 映射对当前硬件失效 → 中止。巧妙的地方校准用的翻转访问是读而不是写——映射算错只会让你看到垃圾值并安全中止绝不会向未知 DRAM 单元误写。同一开机会话内确认无误后可用--dangerously-skip-calibration跳过以加快速度。四、完整工作流五步转储受保护内存# 1. 编译生成 kernel/spaghettify.ko 与全部用户态工具 make # 2. 平台自检不在支持范围直接退出 ./userspace/platform_check || exit 1 # 3. 查看当前固件默认状态fw_* 指纹来源 sudo ./userspace/dram_state # 4. 定位受保护区域自动导出 PSP_BASE / PSP_SIZE eval $(sudo ./userspace/dram_carveouts --region psp) # 5. 批量读取原始字节输出到 stdout重定向保存 sudo ./userspace/dram_dump --protected-pa $PSP_BASE --length $PSP_SIZE \ $(printf -- --map %s data/maps/2x4gb_*.map) psp.bin 注意第 5 步一次性传入了三张映射at-s0b0/at-s0b1/at-s1b0。每张映射由不同的扰序状态求解而来各有一些秩亏导致的死区某些字无别名可达dram_dump按顺序对每个 4 字节字采用第一张能到达它的映射三者取并集即可覆盖单张映射读不到的地址。所有映射必须描述同一块硬件位宽、MMIO 空洞、fw_*一致否则拒绝启动。没有现成映射三步自己生成仓库提供了现成的分析流水线analysis/# 采集别名数据对JSONL 存入 data/aliases/可用 --at-swizzle/--at-bankswap 选扰序态 sudo python3 analysis/gather_aliases.py --at-swizzle 0 --at-bankswap 0 \ --log data/aliases/2x4gb_fw-s1b1_at-s0b0.jsonl # 求解并保存映射--progress 可实时观察矩阵收敛 python3 analysis/unspaghettify.py \ --save-map data/maps/2x4gb_fw-s1b1_at-s0b0.map \ data/aliases/2x4gb_fw-s1b1_at-s0b0.jsonlanalysis/gather_aliases.py自动探测 DIMM 容量与搜索掩码随机采样收集别名不稳定的机器可改用 analysis/gather_aliases_remote.py 经 SSH 远程驱动analysis/unspaghettify.pyZ3 逐位求解扰序矩阵加--target-pa 0x...还能只查不读打印任意受保护地址的别名——dram_dump读取路径上不需要 Z3昂贵的求解只发生在离线这一步。采集到的数据与求解出的映射在仓库中各有一份样例格式可对照样例数据data/aliases/2x4gb_fw-s1b1_at-s0b0.jsonl样例映射data/maps/2x4gb_fw-s1b1_at-s0b0.map五、dram_dump 常用选项速查选项作用-s, --protected-pa hex受保护区间起始物理地址正常视图-l, --length n读取字节数须为 4 的倍数--map file别名映射可重复传入以并集覆盖--dry-run只执行双保险检查后退出不读任何 DRAM——验证映射是否可用的首选--calibrate-pa hex指定校准用地址缺省时自动从模块安全区挑选--dangerously-skip-calibration跳过往返校准名字故意起得刺眼慎点--ignore-fw-mismatch指纹不一致时仍强制加载映射--fenced-range lo,hi把更大的受保护预留区标为围栏窗口防止别名落回窗口内的假读--allow-fenced-alias对落回围栏的别名也照样读通常只会拿到围栏填充值--plain不加载映射、不改控制器直接按地址读——用于对比未扰序的基线视图一个实用技巧先用--plain读同一区间看到整片0xff围栏填充值再切换到--map模式读同一区间——前后对比能直观感受扰序前后的差别。六、读不到怎么办处理 0xff 空洞dram_dump对每个读不到的 4 字节字会填充0xff、计数并在 stderr 告警保证输出字节流与请求区间严格对齐。出现空洞时的排查顺序多传几张--map不同(at_swizzle, at_bankswap)组合的死区互不相同并集能救回大量地址换扰序态重新采集--at-swizzle/--at-bankswap与固件态至少差一位才能产生有效扰序换一组重新跑 analysis/gather_aliases.py 再求解注意围栏别名某些映射的数学别名会落回受保护窗口内部翻转读取只会撞回围栏拿到填充值。dram_dump默认把这类目标按空洞处理而不是静默报告假数据可用--fenced-range显式标出整个预留区来捕捉这种情况接受现实若求解出的矩阵在前向方向秩亏、目标地址的位模式恰好在常量位上冲突则任何开关与 DIMM 组合都不可达——这是控制器状态与内存布局的数学属性不是工具能再努力一下的。七、安全提示 ⚠️工具会临时改写活体内存控制器README 原话Expect system instability; have a power-cycle path ready预期系统不稳定请准备好断电重启路径只读方向dram_dump误操作的代价是读出垃圾而它的写侧兄弟 userspace/dram_poke.c 误写会损坏未知 DRAM 单元所以后者强制校准、逐字回读验证、跳过无法到达的字——批量实验请始终从读开始本教程仅面向合法的安全研究场景请在自己的设备上、为自己的安全评估目的使用。八、相关源码索引 文件说明userspace/dram_dump.c本文主角批量读取受保护 DRAM 区间userspace/alias_map.h映射解析、GF(2) 伪逆、校准与多映射调度的共享核心userspace/dram_state.c只读快照当前 fw_* 指纹userspace/dram_carveouts.c定位 PSP / SMRAM / C6 等受保护预留区analysis/unspaghettify.pyZ3 求解别名映射并保存.mapkernel/spaghettify.h内核 ioctl 接口定义DRAM_RW/DRAM_STATE等USAGE.md完整工具参考与端到端示例按这套流程走完你已经掌握了dram_dump的全部精髓离线求解一次映射在线读取零 Z3指纹 校准双保险兜底多映射并集补齐死区。接下来试着把psp.bin丢进反汇编器看看 PSP 里的 ARM 代码吧——那是另一个故事了 ️【免费下载链接】skitter-creek-bath-saltsUnlocking _everything_ on the CPU with DRAM scrambling项目地址: https://gitcode.com/gh_mirrors/sk/skitter-creek-bath-salts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询