单片机程序的破解无非就是非法途径获得源代码或者可执行文件(hex文件)。本文主要介绍两个方法防止别人从单片机fash中获取可执行文件(hex文件)。一方面保证别人不能获取你的hex文件,另一面就算别人非法获取你的hex文件,也无法在新的单片机中运行。
一、截断可执行文件获取源
通过软件对单片机fash的程序存储区进行读保护,如果想读fash的程序存储区的话,只能先进行擦除,从而起到对单片机内程序的保护。下面通过STM32F103C8T6单片机为例,演示未开启读保护和开启读保护的区别。
1.1 未开启读保护
先在keil中用stlink对单片机进行下载程序。在keil中下载程序是没有读保护的,可以通过STM32 ST-Link Uility软件读出单片机fash中的程序。
在keil中对stlink进行设置。
然后下载,显示下载成功。
接下尝试使用STM32 ST-Link Uility软件读出单片机程序。
打开软件,点击连接
连接成功后,可以在fash中看到二进制数,也就是程序可执行文件,将其保存下来,就可以下载到相同型号单片机上使用。
1.2开启读保护
点击软件上的Target->Option bytes就可以得到下面界面。在Read Out Protection框中选择Enabled就会开启读保护。在点击Apply应用
然后再点连接,就无法连接芯片,同时在keil上无法下载新的程序。(这种也就是所谓的单片机被锁了。那些某宝买到拆板芯片使用不了,也有可能是芯片被锁了,可以参考下面的解锁fash读保护就行了。)
此时只有对芯片解除读保护才能连接芯片和下载新的程序,解除读保护的时候会擦除fash,起到保护程序不会被非法获取。下面图片是解除读保护后连接fash的值,解除读保护后fash的值被擦除了。
通过对开启读保护和未开启对比,可以看出开启读保护能够从保护我们程序被非法获取。
二、对程序源码进行加密
每一片单片机都会有一个全球唯一ID号,我们可以通过在单片机程序中加入验证单片机ID号的程序,当读到的ID号与源程序设定的ID号不一致时,启动某段程序(例如跳转到其它死循环,不执行正常程序,或者可以设置一个自毁程序,擦除fash中的代码。)当别人非法获取到我们的hex文件,也没法使用。