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升级程序 和串口通讯来实现烧录呢,而且,还可以实现加密,何乐而不为呢。
由于涉及到保密,不能一一举例讲解实现和破解,只能写写方法,与大家交流。