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

STM32程序的加密与破解以及烧录方法

STM32程序的加密与破解,以及烧录方法。

盗取他人的PCB和烧录文件,可以节省大大开发成本,何乐而不为呢。因此,就滋生了一些协助他人盗版的公司。为了防止被盗版和复制,单片机工程师也是煞费苦心,对硬件和软件均采取了防盗版措施。

1、硬件防盗措施

1)、对重要芯片实施打磨,擦除芯片的型号,重新印制自定义型号。这样,即使盗版者获取了PCB板,也无法采购生产。

2)、对元件实施灌胶,增加拆卸的难度。

3)、增加高频电感和电容多用分立元件伪装成高频电路,利用盗版者恐惧高频的心理,使其望而却步。

4)、故意用焊锡将某些引脚短接,伪装成生产问题,误导盗版者。

5)、结构防拆功能。市面上的电器插座,电器厂家为了防止维修,故意使用特制的螺丝,也是一种保护措施。

6)、使用多层板设计,采用盲孔和埋孔,增加其复制难度和复制成本。

7)、使用磁耦合电路,比如互感器之类的,利用盗版者不熟悉磁元件,也可以使他们放弃盗窃之动机。

8)、采用多种电源供电,尤其是分立元件的开关电源,也会让盗版者犯难。

盗取硬件的目的,通常是为了盗取原理图,分析其原理,但也有的是为了直接生产。硬件防盗措施,具有局限性,应采用软硬件相结合的方式,让盗版者无从下手。

2、软件防盗措施

1)、借助第3方工具加密。比如:CPU带有读保护功能,可以使用烧录器为烧录的程序设置读保护,防止烧录代码被读取。

2)、利用CPU的唯一ID进行软件加密。这种加密需要注意,不要在FLASH中出现该CPU的ID值,其次不要在FLASH中出现ID寄存器的地址。那么如何可以做到呢?读ID时,通过计算方式,得到ID寄存器的地址,让盗窃者,找不到加密的位置。其次,将读到的ID,通过算法保存到CPU的FLASH中,或是外部其它地方。主要是让盗窃者找不到,或者即使看到了,也不认识是什么东西,就行了。这一切都是在RAM中计算完成的,盗窃者很难看到RAM中的内容,所以就很难盗取代码了。

3)、让程序带系统运行,增加其跟踪的难度。很多盗窃者获取到HEX文件后,采用反汇编工具得到其汇编代码,通过debug办法,跟踪到加密位置,然后修改判断,跳过加密位置,就可以盗取生产代码了。如果程序带有系统,就不好定位加密位置了。

4)、巧用STM32自带的读保护函数FLASH_ReadOutProtection()。大多数软件工程师都会使用这个函数,增加代码的可保护性。启用CPU的读保护功能后,盗窃者无法获取源代码,就无法进行反汇编了。

5)、编写升级软件,防止生产者泄密。升级软件是用来对客户的程序进行升级更新。它可以绕过自己的读保护程序,对设备程序进行升级或更新,特别是在远程更新中,有利于防止代码泄密。没有升级软件的代码,要想实现读保护,只能靠烧录器添加读保护,但不能保证烧录程序的人不泄密。升级软件则不同,烧写程序的人,必须使用升级软件才能更新程序。即使他有了客户程序,离开升级软件的引导,程序没法工作。即使他能写升级程序,但是不知道程序的定位位置,也是无法启动客户程序。如果此时再增加唯一ID加密,就会更难破解。

第1次接触STM32,发现它有很多种烧录方式,觉得很奇怪。比如:JTAG接口烧录,SWD接口烧录,串口烧录等,还有就是可以自己编写Boot loader升级程序。现在看来,真是太好了。其实,这些方法都是为生产服务的。

总结,堡垒很容易从内部攻破,再好的盾牌,也难以防盗。

如何使用自己的Boot loader升级程序 呢?

最常用的办法,就是通过串口通讯。一个是上位机,它负责读取CPU内部的客户程序,通过串口发送给下位机。这个下位机带有Boot loader升级程序 ,它是由烧录器烧录的。上电后会判断是否烧录了客户程序,若没有,就会通过串口接收上位机的烧录数据,写到CPU的FLASH中。若已经烧录过客户程序,就会自动跳转到客户程序执行。上位机的客户程序是由烧录器按照指定的位置,烧录到CPU的FALSH中。上位机上电后,就会根据定义好握手协议,将烧录的客户程序发送给下位机。这种烧写方法,是一个创新。网上大多数是采用专用的串口软件来读取bin文件,实现起来有点难。我们不是全才,写个单片机程序,我们很拿手,烧录我们也会,为何不写Boot loader升级程序 和串口通讯来实现烧录呢,而且,还可以实现加密,何乐而不为呢。

由于涉及到保密,不能一一举例讲解实现和破解,只能写写方法,与大家交流。


http://www.kler.cn/a/572086.html

相关文章:

  • FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
  • Kali CentOs 7代理
  • 【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
  • vmware虚拟机安装银河麒麟高级服务器操作系统V10
  • 物联网感应层数据采集器实现协议转换 数据格式化
  • .NET内存居高不下排查怎么解决
  • 4-3自定义加载器,并添加功能
  • 策略模式的C++实现示例
  • Python 图像处理之 Pillow 库:玩转图片
  • 【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?
  • maven推送jar包到nexus
  • 如何将JAR交由Systemctl管理?
  • BambuStudio学习笔记:FlushVolCalculator类
  • Spring项目中常用操作记录
  • 【数据结构】二叉树总结篇
  • React:Router路由
  • Kmeans算法来实现RFM指标计算步骤
  • 在 macOS 使用 .pem 私钥免密登录腾讯云服务器
  • LeetCode 718 - 最长重复子数组
  • 2.4GHZ无线跳频算法 C语言