• 【单片机】唯一设备ID UID固件加密


    简单就是说相当于芯片的身份证,可以区分每一个芯片

    唯一设备标识符最适合:
    ● 用作序列号(例如 USB 字符串序列号或其它终端应用程序)
    ● 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安全密钥以
    提高 Flash 中代码的安全性
    ● 激活安全自举过程等
    96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码。用户永远
    不能改变这些位。
    96 位的唯一设备标识符也可以以单字节/ 半字 / 字等不同方式读取,然后使用自定义算法连接
    起来。

    芯片固件加密破解:

    基本上任何固件加密都是可以被破解的,当然使用uid只是会增大破解的难度,如果当我们使破解的难度几乎等同于重新写代码的难度的时候,这个时候就算是加密的成功了。

    代码思路:

    第一次进入芯片,将芯片身份证固件uid读到静态区flash中

    第二次进入芯片,就会将读取芯片uid,如果当前固件被读出到其他芯片中,会判断之前的uid

    之前不一样,就会报错

    1. #define uid1 (0x1FFF7A10)
    2. #define uid2 (0x1FFF7A14)
    3. #define uid3 (0x1FFF7A18)
    4. static const int id1 = 0xffffffff;
    5. static const int id2 = 0xffffffff;
    6. static const int id3 = 0xffffffff;
    7. static const int id4 = 0xffffffff;
    8. static const int id5 = 0xffffffff;
    9. static const int id6 = 0xffffffff;
    10. /* 第一次进入,初始化uid */
    11. if ((0xffffffff == id1) && (0xffffffff == id2) && (0xffffffff == id3) &&
    12. (0xffffffff == id4) && (0xffffffff == id5) && (0xffffffff == id6))
    13. {
    14. id1 = *(uint32_t*)(0x1FFFF7E8);
    15. id2 = *(uint32_t*)(0x1FFFF7E8 + 4);
    16. id3 = *(uint32_t*)(0x1FFFF7E8 + 8);
    17. id4 = 0x11111111;
    18. id5 = 0x22222222;
    19. id6 = 0x33333333;
    20. return success;
    21. }
    22. /* 判断是否是该芯片 */
    23. else if((*(uint32_t*)(0x1FFFF7E8) == id1) && (*(uint32_t*)(0x1FFFF7E8 + 4) == id2) && (*(uint32_t*)(0x1FFFF7E8 + 8) == id3) &&
    24. (0x11111111 == id4) && (id5 == 0x22222222) && (0x33333333 == id6))
    25. {
    26. return success;
    27. }
    28. else
    29. {
    30. return error;
    31. }

  • 相关阅读:
    你真正了解什么是接口测试么?接口实战一“篇”入魂
    web前端期末大作业:网站设计与实现——咖啡网站HTML+CSS+JavaScript
    Pytorch-lightning简介
    java.sql.SQLFeatureNotSupportedException解决方法
    vscode
    Flink分区之Flink分区策略整理
    大二Web课程设计:HTML+CSS学校静态网页设计——南京师范大学泰州学院(11页)
    米尔AM62x核心板助力新一代工业4.0升级
    第4章 请求与响应
    ASIL:汽车功能安全等级总结
  • 原文地址:https://blog.csdn.net/qq_20017379/article/details/127580196