ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深度拆解大疆固件逆向工具链:5 个工具走通完整的固件分析链路

深度拆解大疆固件逆向工具链:5 个工具走通完整的固件分析链路 深度拆解大疆固件逆向工具链5 个工具走通完整的固件分析链路【免费下载链接】dji_revDJI Reverse engineering项目地址: https://gitcode.com/gh_mirrors/dj/dji_rev拿到一个从大疆飞机 eMMC 里导出的 .bin 文件用 16 进制编辑器打开却全是乱码加密块到底从哪一刀切下去——这是大疆逆向工程里最常见的卡点。dji_rev 这套开源工具就是为无人机固件分析准备的image.py 负责把镜像块拆出来fw_dec.py 负责做飞行控制器解密中间的密钥推导和 U-Boot 签名验证也有对应脚本整条链路在一个仓库里就能跑通。 它到底解决了什么问题大疆的固件不是裸奔的镜像头部带 RSA 签名数据块用 AES 加密U-Boot 分区还有一层独立的签名封装。想读懂里面的飞行控制逻辑光靠十六进制肉眼看是走不通的。这个仓库把逆向过程中反复用到的几类脏活收拢成了五个独立脚本每个脚本只做一件事串起来就是一条从原始 .bin 到可读固件的流水线。免手动算偏移块的位置、大小、加密属性都从头部字段里读不用自己拿计算器对字节密钥表内置RREK、RIEK、RUEK、DRAK、SAAK、PUEK 等已公开的密钥直接硬编码在脚本里拿来即用工具可组合拆出的块可以单独丢进反汇编器也可以再进下一步的解密脚本 架构全景工具目录与模块协作链路dji_rev/ ├── tools/ │ ├── image.py # 固件镜像提取与解析 │ ├── derive_key.py # 密钥生成与加密机制 │ ├── sign_uboot.py # U-Boot安全分区签名 │ ├── check_uboot.py # U-Boot签名验证 │ └── fw_dec.py # 飞行控制器固件分析 └── symbols/ └── headers.h # 头文件与符号定义数据流其实是一条单向流水线先由 image.py 解析 IM*H 头部按块表把未加密块原样导出、加密块用 AES 解出来产物是一组镜像名_块名.bin。如果某个块仍是二次封装的 FC 固件飞行控制器固件就轮到 fw_dec.py 上场它拿着内置密钥表逐个尝试不同的密钥调度。derive_key.py 则是旁路工具模拟官方 dji_derivekey 二进制的行为用来推导和核对派生密钥。U-Boot 相关的 sign_uboot.py 与 check_uboot.py 构成一对互逆操作前者把 PKCS#1.5 签名和公钥打包进 1536 字节的签名区后者负责还原公钥、验签并把裸 U-Boot 内容提出来。symbols/headers.h 存放结构体定义和符号供写分析脚本时参考偏移量。 固件镜像提取实操拿到固件后跟着做一遍下面按真实操作的先后顺序走一遍每条命令都附上预期结果方便你对照排查。第一步克隆仓库并解析固件镜像头部git clone https://gitcode.com/gh_mirrors/dj/dji_rev cd dji_rev python3 tools/image.py firmware.bin运行后先打印 Unpacking image... 和头部字段明细随后逐块生成firmware_块名.bin。如果输出里出现Cant unpack encrypted chunk! Missing key说明该固件用了密钥表里没有的新标识符见下文踩坑一节。第二步模拟官方密钥推导过程python3 tools/derive_key.py 37d6d913e5d08017e51215450c1e16e7 test_payload脚本把 16 字节密钥和输入文本按官方规则补齐后做一次 AES-CBC 加密标准输出是一串 32 字符的 16 进制串——这就是派生密钥在官方流程里的形态拿它和实机抓到的值比对可以确认密钥调度是否被厂商改动过。第三步对拆出的 FC 固件跑密钥调度穷举python3 tools/fw_dec.py fc_firmware.bin它会用 6 把密钥 × 4 种 IV/密钥组合方式解出 24 个候选文件命名形如fc_firmware_PUEK_3.bin。逐个看文件头找到能解析出 ARM 指令或 ELF 结构的那个对应的密钥名和方案号就是当前固件实际使用的调度。第四步给 U-Boot 分区生成安全签名python2 tools/sign_uboot.py signkey.pub signkey.priv uboot.bin产物是uboot.bin.signed结构为文件长度 | 填充 | 256字节签名 | 公钥 | 填充 | 原始文件。注意这里必须是 python2——脚本用的是 Python 2 语法。第五步验证 U-Boot 签名并提取内容python2 tools/check_uboot.py uboot.bin.signed脚本会从签名区还原 RSA 公钥对 1536 字节之后的文件体做 SHA256 PKCS#1 v1.5 验签最后输出test verity: True/False顺带打印 efuse 区域的哈希可用来核对熔丝状态。 飞行控制器解密与 U-Boot 签名验证的底层原理把 README 里记录的镜像格式摊开看是这样一份字节账单固件镜像结构 - 头部信息Header - 4字节魔数IM*H - 4字节版本号 - 8字节未知字段 - 4字节头部大小 - 4字节RSA签名大小 - 4字节有效载荷大小 - 12字节未知字段 - 4字节认证密钥标识符 - 4字节加密密钥标识符 - 16字节加扰密钥 - 32字节镜像名称 - 60字节未知字段 - 4字节块数量 - 32字节SHA256有效载荷哈希 - 每块信息Per Block info - 4字节名称 - 4字节起始偏移 - 4字节输出大小 - 4字节属性最后一位0表示加密 - 16字节未知字段 - RSA签名对头部签名密钥由头部标识 - 实际块数据起始偏移0这套设计的意图是职责分离RSA 只管头部没被篡改AES 只管数据内容不可读两者各用一把钥匙。头部的认证密钥标识符对应脚本里的 PRAK、RRAK、GFAK 公钥指向验签用的 RSA 公钥加密密钥标识符RREK、RIEK、RUEK、DRAK、SAAK、PUEK指向 16 字节对称密钥。更巧的是头里还带一个 16 字节的加扰密钥image.py 在 version 1 固件里会先用加密密钥解出它、再拿它去解数据——等于把 AES 密钥又包了一层单点泄露的破坏面就被压小了。fw_dec.py 之所以要穷举 4 种方案正是因为厂商在不同代产品上换过这套谁包谁的规则密钥直接当 AES 密钥用、当 IV 用、或者先去解 scram_key组合起来就是 4 条路径。U-Boot 那边则是把整个公钥连同签名一起塞进 1536 字节的签名区让验签方不需要预置任何密钥——check_uboot.py 还原公钥再验签正是这个自包含设计的直接后果。 三个真实场景能拿它做什么如果你是安全研究员可以把 check_uboot.py 当 U-Boot 签名验证的基线对官方分区和魔改分区分别跑一遍验签结果的变化能直接暴露哪些环节被绕过。接着用 fw_dec.py 的穷举输出对比新旧版本固件看密钥调度是否换了方案这往往是判断固件代际关系最快的线索。如果你是硬件或飞控开发者想研究电机控制或姿态算法典型做法是先跑 partition_dump.sh 类脚本把 eMMC 分区完整拉下来再用 image.py 拆块最后把解密出的 FC 固件丢进反汇编器定位飞行控制逻辑。整条链上每个环节的输入输出都是标准 .bin 文件方便你只替换其中一环做实验。如果你是带嵌入式安全课的老师derive_key.py 和 xor.py 是两个现成的教学素材前者只有十几行能把 AES-CBC、补零、截断这些细节一次讲透后者让学生亲手对两个二进制文件做逐字节异或理解两份差量固件相减能还原共同部分的原理。密钥表里公开的 RREK 等常量也可以直接当课堂案例说明硬编码密钥为什么经不起静态分析。⚠️ 踩坑提醒与合规红线环境与依赖image.py、derive_key.py、fw_dec.py 需要 Python 3 并安装 pycryptodome脚本里from Crypto.Cipher import AES即来自它sign_uboot.py 和 check_uboot.py 是 Python 2 语法print 语句、xrange、long必须用 python2 运行Python 3 下会直接 SyntaxError常见报错image.py 打印Cant find enc_key或Cant unpack encrypted chunk时不是脚本坏了而是新固件引入了密钥表未收录的密钥标识符需要自行定位密钥后补进 keys 字典分区操作有风险partition_dump.sh / partition_send.sh 直接读写飞机真实 eMMC动手前先把原始分区完整备份避免刷不回去合规底线工具仅用于教育研究与自有设备实验尊重厂商知识产权遵守当地网络安全法规若研究中发现漏洞建议走负责任披露渠道报告给厂商 周边生态与相关资源dji_rev 并不是孤立的围绕大疆逆向工程有一圈长期活跃的项目按下表可以按需取用项目名用途平台或语言DeejayeyeHackingClub大疆逆向圈子的资料站与 Wiki 入口Web 社区dji_rev固件镜像拆包与解密的脚本集合本仓库Pythondeejayeye-modder修改官方 App 的 APK解锁设置项Android APKpyduml绕过 Assistant 推送固件并打 DUM 补丁PythonRedHerring借助 FTPD 目录遍历漏洞获取 root 的利用工具Pythondji_system.bin按 MD5 归档的固件更新包集合支持升降级二进制档案firm_cache解包后的 dji_system.bin 内容用于拼装自定义固件二进制档案DUMLrubPyDUML 的 Ruby 移植版可做固件挑拣重组RubyDUMLdoreWindows 下归档与刷写 dji_system.bin 的配套工具WindowsDJI_ftpd_aes_unscramble反转 FTPD 对下载文件做的 AES 加扰Pythonjdjitools把多个 DJI 小工具收拢进一个类 shell 的 Java 工具箱Java这些项目和本仓库的脚本可以互补dji_system.bin 与 firm_cache 提供原始素材本仓库负责拆解DUML 系工具负责重新封装回刷。✍️ 写在最后项目的形态很轻——五个脚本加一个头文件但正因为轻每个环节都能单独拿来做二次开发密钥表也会随着新固件的出现持续补充欢迎通过提 PR 或 issue 的方式参与迭代后续方向包括覆盖更多机型和补齐解析功能。把这条从 .bin 到可读代码的链路跑通一次你对嵌入式固件保护机制的理解会比看十篇综述都深。核心关键词大疆逆向工程、无人机固件分析、飞行控制器解密长尾关键词大疆无人机安全研究、固件镜像提取工具、U-Boot签名验证、飞行控制器固件解密、嵌入式系统逆向工程【免费下载链接】dji_revDJI Reverse engineering项目地址: https://gitcode.com/gh_mirrors/dj/dji_rev创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表