Proxmark3 RDV4 外置 SPI Flash 完全指南:内存布局、RSA 签名验证与自签名备份

发布时间:2026/9/17 6:13:13
Proxmark3 RDV4 外置 SPI Flash 完全指南:内存布局、RSA 签名验证与自签名备份 Proxmark3 RDV4 外置 SPI Flash 完全指南内存布局、RSA 签名验证与自签名备份【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3外置 256KB SPI Flash 是 Proxmark3 RDV4 版本独有的一项硬件特性它为用户数据、密钥字典以及设备真伪验证提供了持久化存储。本文基于仓库 doc/ext_flash_notes.md 展开结合 client/src/cmdflashmem.c 与 include/pmflash.h 的源码实现完整讲解外置 Flash 的地址布局、mem系列命令的用法、RSA 签名防伪机制以及如何备份签名并利用随仓库发布的通用私钥为改装设备生成自签名。外置 Flash 是什么Proxmark3 RDV4 在外置芯片上挂载了一片 SPI NOR Flash其容量为 256KB。这片 Flash 与主控 MCU 内部 Flash 完全独立承担三类职责存放用户自定义数据例如备份的扇区 dump存放各类密钥字典MIFARE Classic 密钥、iCLASS 密钥、T55xx 密码、MIFARE Ultralight-C / Ultralight-AES 密钥等这些字典以 SPIFFS 文件系统的形式管理存放设备的 RSA 签名用于校验设备是否为官方正品 RDV4防伪造。从 include/pmflash.h 的注释可以看出这片内存被划分为 4KB 扇区其中最后一个 4KB 扇区存放签名、倒数第二个扇区保留给未来功能使用其余扇区归 SPIFFS 与用户数据使用。地址空间布局RDV4 外置 Flash 的几何结构如下总容量256KB0x40000 262144 字节划分为4 个 64KB 页每页 0x10000 65536 字节每页又划分为16 个 4KB 扇区每扇区 0x1000 4096 字节因此最后一个扇区位于 0x3F000。一个 Flash 地址可以按如下方式解读以 0x3FF7F 为例0xPSxxx e.g. 0x3FF7F ^ page ^ page 3 ^ sector ^ sector 0xF ^^^ offset ^^^ offset 0xF7F其中最高位十六进制数字表示页号次高位表示扇区号低三位表示扇区内偏移。需要特别注意的是上述解读方式仅适用于 256KB 容量。对于其他容量的 Flash所谓 Page 3 应理解为最后一页具体地址偏移取决于实际内存大小。这一点在源码中得到了印证——include/pmflash.h 中签名偏移的计算是相对于总容量动态得出的// -1 for historical compatibility with already released Proxmark3 RDV4.0 devices #ifndef FLASH_MEM_SIGNATURE_OFFSET_P # define FLASH_MEM_SIGNATURE_OFFSET_P(p64k) (FLASH_MEM_MAX_SIZE_P(p64k) - FLASH_MEM_SIGNATURE_LEN - 1) #endif其中FLASH_MEM_MAX_SIZE_P(p64k)为1024 * 64 * p64k页数 × 64KBFLASH_MEM_SIGNATURE_LEN为 128。代入 4 页262144 − 128 − 1 2620150x3FF7F与文档给出的地址完全一致也解释了为什么最后一个字节0x3FFFF未被使用——这是为了与已发售 RDV4.0 设备保持历史兼容而刻意留出的一个字节偏差。内存整体布局与常用操作整个 256KB 的用途划分如下区域用途推荐操作Page 00x00000–0x0FFFF用户数据mem dump/mem wipe -p 0Page 10x10000–0x1FFFF用户数据mem dump/mem wipe -p 1Page 20x20000–0x2FFFF用户数据mem dump/mem wipe -p 2Page 30x30000–0x3FFFF固件专用RSA 签名、保留扇区、SPIFFS 字典仅可mem dump不可直接 wipePage 0 / 1 / 2用户数据区这三个页完全开放给用户存放任意二进制数据导出与擦除命令如下# 导出 Page 0偏移 0长度 65536 mem dump -f page0_dump -o 0 -l 65536 # 导出 Page 1偏移 65536长度 65536 mem dump -f page1_dump -o 65536 -l 65536 # 导出 Page 2偏移 131072长度 65536 mem dump -f page2_dump -o 131072 -l 65536 # 擦除某一页例如 Page 0 mem wipe -p 0Page 3固件专用区Page 3 由固件自身管理包含三类内容详见下文Page 3 布局。它同样可以导出备份mem dump -f page3_dump -o 196608 -l 65536但强烈不建议擦除 Page 3擦除会同时抹掉 RSA 签名而签名一旦丢失普通用户无法自行重新生成除非你拥有对应的私钥mem wipe命令在实现层面就对最后一个页做了保护——见 client/src/cmdflashmem.cif (page 0 || page (spi_flash_pages - 2)) { PrintAndLogEx(WARNING, page must be between 0 and %d, spi_flash_pages - 2); return PM3_EINVARG; }即mem wipe -p只允许 0 到页数-2的范围256KB 设备上最多只能擦到 Page 2Page 3 天然被排除在可擦除范围之外。若确有特殊需要必须擦除 Page 3文档指出需要修改源码、将 Page 3 开放为mem wipe的合法输入后再重新编译客户端。另外注意更新密钥字典不需要擦除 Page 3因为字典存放在 SPIFFS 文件系统内见下文通过mem load即可覆盖更新。Page 3 内部布局Page 3或非 256KB 内存的最后一页由 RDV4 固件按扇区划分为三段RSA 签名RSA SIGNATURE位置Page 3 的第 15 扇区0xF、扇区内偏移 0xF7F即3*0x10000 15*0x1000 0xF7F 0x3FF7F十进制 262015长度128 字节理论上签名应从 0x3FF80 开始正好 128 字节占满最后一个扇区但历史上偏差了一个字节因此Flash 的最后一个字节实际未被使用。保留区域Reserved for future use位置Page 3 的第 14 扇区0xE即 0x3E000–0x3EFFF留给未来固件功能扩展。SPIFFS 扇区SPIFFS sectors位置Page 3 的第 130 扇区0xD..0x0即从 0x30000 到 0x3DFFF用于承载 SPIFFS 文件系统各类密钥字典文件均以文件形式存放于此。从 include/pmflash.h 可以看到这些字典文件的名字与键长定义#define T55XX_CONFIG_FILE cfg_t55xx.bin #define T55XX_KEYS_FILE dict_t55xx.bin #define T55XX_KEY_LENGTH 4 #define ICLASS_KEYS_FILE dict_iclass.bin #define ICLASS_KEY_LENGTH 8 #define MF_KEYS_FILE dict_mf.bin #define MF_KEY_LENGTH 6 #define MFULC_KEYS_FILE dict_mfulc.bin #define MFULC_KEY_LENGTH (16) #define MFULAES_KEYS_FILE dict_mfulaes.bin #define MFULAES_KEY_LENGTH (16)在客户端实现中mem load对字典文件走的是 SPIFFS 写入通道flashmem_spiffs_load写入完成后还会重新卸载并挂载 SPIFFS 以保证一致性而普通二进制数据则走快速推送模式按每块 256 字节FLASH_MEM_BLOCK_SIZE分包写入见 client/src/cmdflashmem.c。RSA 签名与防伪验证签名原理RDV4 的防伪机制基于一段RSA-1024 签名出厂时厂商用私钥对Flash 的唯一 ID8 字节的 SHA-1 摘要进行 RSA 签名并把 128 字节签名写在外置 Flash 的 0x3FF7F 处。验证方客户端使用内置的公钥解密签名并与实际计算出的 SHA-1 摘要比对一致即认为设备为正品。这一流程在 client/src/cmdflashmem.c 的pm3_validate()中实现// Flash ID hash (sha1) uint8_t sha_hash[PM3_RSA_SHA1_LEN] {0}; mbedtls_sha1(mem-flashid, sizeof(mem-flashid), sha_hash); // Verify (public key) is_valid mbedtls_rsa_pkcs1_verify(rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, PM3_RSA_SHA1_LEN, sha_hash, mem-signature);客户端内置了两组公钥client/src/cmdflashmem.cRDV4 公钥RRG 官方发布用于验证官方正品 RDV4GENERIC 公钥面向改装设备带 SPI eeprom 的改造 Proxmark3允许它们使用随仓库发布的通用私钥自签名。签名与 Flash ID 一起存放在rdv40_validation_t结构体中include/pmflash.htypedef struct { uint8_t magic[4]; uint8_t flashid[FLASH_MEM_ID_LEN]; // 8 字节 Flash ID uint8_t signature[FLASH_MEM_SIGNATURE_LEN]; // 128 字节 RSA 签名 } PACKED rdv40_validation_t;用mem info验证设备真伪在客户端执行mem info即可读取 Flash 信息、签名并自动验证。以下为官方文档提供的 RDV4 真机示例输出[usb] pm3 -- mem info [] --- Flash memory Information --------- [] ID................... 25AD99A782A867D5 [] SHA1................. 67C3B9BA2FA90AD4B283926B70017066C082C156 [] Signature............ ( ok ) [] --- RDV4 RSA signature --------------- [] C7C7DF7FA3A2391A2B36E97D227C746ED8BB475E8766F54A13BAA9AAB29299BE [] 37546AACCC29157ABF8AFBF3A1CFB24275442D565F7E996C6B08090528ADE25E [] ED1498E3089C72C68348D83CBD13F1247327BDBC9D75B09ECE3E051E19FE19BB [] 98CB038757F2EDFD2DC5060D05C3296BC19A6F768290D555DFD50407E0E13A70 [] --- RDV4 RSA Public key -------------- [] Len.................. 128 [] Exponent............. 010001 [] Public key modulus N [] E28D809BF323171D11D1ACA4C32A5B7E0A8974FD171E75AD120D60E9B76968FF [] 4B0A6364AE50583F9555B8EE1A725F279E949246DF0EFCE4C02B9F3ACDCC623F [] 9337F21C0C066FFB703D8BFCB5067F309E056772096642C2B1A8F50305D5EC33 [] DB7FB5A3C8AC42EB635AE3C148C910750ABAA280CE82DC2F180F49F30A1393B5 [] RSA public key validation.... ( ok ) [] RSA private key validation... ( ok ) [] RSA verification..... ( ok ) [] Genuine Proxmark3 RDV4 signature detected输出解读ID为 8 字节 Flash 唯一 IDSHA1是它的 SHA-1 摘要RDV4 RSA signature是存放在 0x3FF7F 处的 128 字节签名原文RDV4 RSA Public key是客户端内置的公钥指数 0x010001、模数 N 与上文源码中的 RDV4 公钥一致结尾若显示Genuine Proxmark3 RDV4 signature detected说明签名验证通过若显示No genuine Proxmark3 signature detected则签名缺失或与公钥不匹配。mem info还支持更多参数client/src/cmdflashmem.cmem info -v追加打印客户端内置的所有公钥RDV4 与 GENERIC及其校验结果mem info -s -p pem文件用指定 PEM 私钥为 Flash ID 生成签名不写入mem info -s -p pem文件 -w生成签名并写入设备mem info -s -d 8字节hex手工指定 Flash ID 而非读取设备 ID。此外mem info还会同时展示 SPI 芯片信息制造商 ID、设备 ID、JEDEC ID、以 64KB 页为单位的内存大小对应设备端的spi_flash_t结构include/pmflash.h。先备份签名无论出于何种目的接触 Page 3第一步永远是备份签名。签名只有 128 字节备份命令如下mem dump -f flash_signature_dump -o 262015 -l 128即从偏移 2620150x3FF7F导出 128 字节到本地文件flash_signature_dump。之所以强调备份是因为官方 RDV4 的私钥并不公开签名一旦被擦除或覆盖普通用户将无法复原设备将永远无法通过mem info的正品验证。为改装设备生成自签名背景随着仓库新增client/resources/pm3_generic_private_key.pem任何带 SPI eeprom 的改装 Proxmark3 设备都可以生成一份自签名签名从而通过mem info的验证流程识别为 GENERIC 类型而非 RDV4 官方类型。mem load与mem info均已内置 GENERIC 公钥因此验证可以闭环完成。第一步校验私钥文件的完整性私钥文件以 PEM 格式随仓库发布同时附带了 SHA-512 校验文件建议先做校验以防文件损坏或被篡改cd client/resources/ sha512sum -c pm3_generic_private_key.sha512.txt校验文件内容为client/resources/pm3_generic_private_key.sha512.txtd99cb37ec1ea04790746a97b439fd3a3dbe5b0eb3de439cdfbf6e7e82ff871d278f11923049fd19e945d90135de112250103850305ed1eca0c82a51a6c5f1682 pm3_generic_private_key.pem校验成功应输出pm3_generic_private_key.pem: OK第二步查看当前 SPI eeprom 信息连接设备后执行mem info mem info -v确认设备能够正常读取 Flash ID 与当前签名状态并记录 Flash ID即签名对象。第三步仅生成签名不写入使用通用私钥为当前 Flash ID 生成签名mem info -s -p client/resources/pm3_generic_private_key.pem此命令只计算并展示新的签名内容不会改动设备上的任何数据可安全执行。从源码看签名过程为取 Flash ID或-d指定的 8 字节 ID→ 计算 SHA-1 → 用 PEM 私钥执行mbedtls_rsa_pkcs1_signPKCS#1 v1.5 填充见 client/src/cmdflashmem.c。第四步生成并写入签名危险操作mem info -s -p client/resources/pm3_generic_private_key.pem -w⚠️ 危险操作-w会把新签名写入 0x3FF7F直接覆盖当前已有签名。写入前务必确认已经按上文先备份签名一节备份了现有签名否则原签名将永久丢失。写入逻辑在 client/src/cmdflashmem.c 的pm3_sign_write()中实现它会动态计算签名偏移FLASH_MEM_SIGNATURE_OFFSET_P并发送CMD_FLASHMEM_WRITE命令写入成功后终端会回显实际写入的偏移量。签名后的验证写入完成后再次运行mem info此时验证流程会依次尝试 RDV4 公钥与 GENERIC 公钥若新签名由通用私钥生成则第二个公钥验证通过输出中将显示Genuine Proxmark3 GENERIC signature detected。附mem命令族速查所有外置 Flash 操作均通过mem子命令完成完整命令表见 client/src/cmdflashmem.c命令作用关键参数mem info读取并验证 Flash 签名信息-s生成签名、-pPEM 私钥文件、-d指定 ID、-v详细输出、-w写入mem dump从 Flash 导出数据到文件或屏幕-o偏移、-l长度、-f文件名、-v/--view屏幕查看、-c列宽mem load向 Flash 写入文件或字典-o偏移、-f文件名、-m/-i/-t/--ulc/--aes按字典类型加载mem wipe擦除指定页填 0xFF最后一页被保护-p页号0 ~ 页数-2mem baudrate设置 SPI 通信波特率--mhz 24\|48默认建议 24MHz几点实操提示mem dump支持直接查看签名区内容mem dump --view -o 262015 --len 128可快速核对签名是否完好mem dump未指定-l时默认导出整个 Flash受实际页数约束指定-f时以二进制文件保存mem load加载字典文件-m/-i/-t/--ulc/--aes时写入 SPIFFS无需先擦除加载普通二进制文件时目标区域必须已mem wipe过SPI 通信频率过高48MHz时读取 Flash ID 几乎必然失败非专业人士建议保持 24MHz。总结Proxmark3 RDV4 的外置 256KB Flash 是一块高度结构化的存储介质前三个页完全开放给用户最后一页由固件托管RSA 签名 保留扇区 SPIFFS 字典。mem命令族围绕这套布局提供了完善的导出、写入、擦除与验证能力而 RSA 签名机制则为设备防伪提供了可编程的验证闭环——官方设备使用 RRG 私钥签名改装设备则可以利用仓库随附的 GENERIC 私钥自行签名并通过mem info验证。任何涉及 Page 3 的操作前请务必先执行mem dump -f flash_signature_dump -o 262015 -l 128完成签名备份。【免费下载链接】proxmark3Iceman Fork - Proxmark3项目地址: https://gitcode.com/GitHub_Trending/pr/proxmark3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询