当前位置: 首页 > news >正文

Hex2Bin转换软件、Bootloader 、OTA加密升级 、STM32程序加密、其他MCU同样适用

说明:这个工具可以将 Hex 文件 转换为 Bin 格式文件,软件是按自己开发 STM32 OAT 功能需求开发的一款辅助 上位机软件。

文中的介绍时 bootloader = boot 

文档在补充完善中...

有兴趣的朋友可留言探讨。

1. 软件功能:

1.生成 bin:将 Hex 格式文件转换为 Bin 格式。

2.boot 打包为 bin:可以生成指定大小的 bin 格式文件,文件多余的空余位置填充随机数。可在生成的Bin文件指定位置填充加密后的指定数据,用于程序加密使用。

3.app 打包为 bin :可生成整个程序加密后的 Bin 文件,可用于 OTA 中的 APP 文件加密,防止APP泄漏。

2. Bootload 加密思路

bootloader文件的构成: 

bootloader 编译文件 + flash加密数据区域 = 烧录用 bootloader;

例如:假设app的开始区域为 0x800A000 ,那boot的文件区域为 0x8000000 ~  0x800A000

1. Flash加密数据区域:

        假设取 0x8009800 ~ 0x800A000 共2kb区域作为加密数据的存储区域,简单说按app的前一个扇区作为加密数据存储区域,因为有的MCU一个扇区大小 2k ,有的 1k ,视具体型号而定,取app的上一个扇区即可。

2. boot 编译文件大小:

        调整Flash分区的大小,boot 的数据不要到 Flash加密数据区域,避免交叉导致 boot 被意外擦除。

3. Flash加密数据区域数据结构:

typedef struct
{uint32_t  app_state;            /* app 状态,无APP,有APP */uint32_t  mark[4];              /* 初始状态数据 */uint32_t  id_mark[4];           /* ID加密数据 */...                             /* 根据需求自定义 */
}APP_t;

4. boot文件打包:

4.1.设定指定大小:

        使用专用 上位机软件导入 boot 程序后,按设定的大小输出输出 bin 文件,多余的地方填充随机数。例如:boot编译文件为 32k, 设定输出大小为40 k,那空余的 8k 全部填充随机数,这样混淆后即便读出boot程序也不知道boot程序具体多大。

4.2.插入加密数据:

        在预留的加密扇区内指定的位置插入加密数据。

        如:数据 mark[4] 是boot第一次运行时会检测的数据,检测这个数据和预期的相符才执行 boot 的加密工作,加密完成后再 修改或删除 mark[4] 数据,确保 boot 的加密工作只做一次。

        id_mark[4] 是加密数据,通过读取 MCU 的 ID ,再通过AES加密算法,加密后存储到 id_mark[4] 。 

uint32_t  mark[4];              /* 初始状态数据 */
uint32_t  id_mark[4];           /* ID加密数据 */

3. APP 加密思路

        1. app 按16字节凑整,即app的大小是 16 的整数倍,这样方便 AES 加密,加密前在app文件末尾插入app文件的 CRC16 校验值,这样boot可以校验app的完整性。在凑整和添加CRC16值后再AES加密文件,最终得到的bin文件作为 boot 升级用。

        2.app校验ID的有效性,app通过读取 boot 加密区域的 ID 加密数据,解密后与读取的MCU ID 做对比,判断程序的有效性。

4. boot 启动流程

5. App 启动流程

        app通过读取 boot 加密区域的 ID 加密数据,解密后与读取的 MCU ID 做对比,判断程序的有效性。

6. AES 加密算法代码

7. CRC16 校验算法代码

http://www.lryc.cn/news/277462.html

相关文章:

  • Hadoop之mapreduce参数大全-6
  • Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
  • 功能强大的免费SSL证书
  • 在Vue中使用Web Worker详细教程
  • 四、C#高级特性(动态类型与Expando类)
  • 贪心算法的“左最优“与“右最优“及其对应的堆处理和预处理方法
  • 【Docker】容器的相关命令
  • Android BUG 之 Error: Activity class {} does not exist
  • 听劝,年度规划有它真的很必要!
  • leetcode滑动窗口问题总结 Python
  • 秒变办公达人,只因用了这5款在线协同文档app!
  • 镜头选型和计算
  • 2024--Django平台开发-Django知识点(四)
  • 可狱可囚的爬虫系列课程 09:通过 API 接口抓取数据
  • 2. Spring Boot 自动配置 Mybatis 流程
  • Nginx配置反向代理实例一
  • 训练自己的GPT2
  • etcd储存安装
  • 如何彻底卸载Microsoft Edge浏览器
  • Transformers 2023年度回顾 :从BERT到GPT4
  • 判断两个对象某些字段的值是否相同
  • TYPE-C接口取电芯片介绍和应用场景
  • 基于TI TPSXX系列 Buck电路应用计算-外围器件详细计算过程
  • NOIP2012提高组day1-T3:开车旅行
  • Golang Web框架性能对比
  • 【OCR】 - Tesseract OCR在mac系统中安装
  • 了解不同方式导入导出的速度之快
  • 2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!
  • 获取直播间的最新评论 - python 取两个list的差集
  • 2023年度总结:但行前路,不负韶华