搜索
bottom↓
回复: 31

stm32有没有必要加入flash的代码自我校验?

[复制链接]

出0入0汤圆

发表于 2019-5-9 10:40:46 | 显示全部楼层 |阅读模式
我之前遇到过stm32(不一定是正品,可能有问题)flash内存储的设置数据出错的现象。我想在代码中添加如下功能:一上电即读取与程序有关的所有扇区,然后计算CRC32,并进行核对。如果crc失败则拒绝继续执行。
这样做有无必要呢?
如果flash很稳定,这其实有点多此一举,我主要是想确保mcu运行的可靠性。
另外,只靠stm32的读保护进行加密,是否够用?是否容易破解?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2019-5-9 10:51:03 | 显示全部楼层
设置数据出错,是断电数据保护的问题。如果存在随时断电的可能,需要增加数据备份和数据校验,出错的时候使用老配置进行开机

出0入0汤圆

 楼主| 发表于 2019-5-9 10:58:24 来自手机 | 显示全部楼层
pt2go 发表于 2019-5-9 10:51
设置数据出错,是断电数据保护的问题。如果存在随时断电的可能,需要增加数据备份和数据校验,出错的时候使 ...

是的,这部分也考虑并修改过了。
我现在关心的是,代码存储器的可靠性,有没有必要加入自我校验呢?主要是怕随时间变化出错

出0入0汤圆

 楼主| 发表于 2019-5-9 10:58:47 来自手机 | 显示全部楼层
类似这个贴子的问题
https://bbs.csdn.net/wap/topics/330241928

出0入8汤圆

发表于 2019-5-9 11:01:33 | 显示全部楼层
相当于加了签名,程序签名与单片机签名不一致则不启动。

出0入0汤圆

发表于 2019-5-9 11:25:46 | 显示全部楼层
stm32加入flash的代码自我校验,相当于加密

出0入0汤圆

 楼主| 发表于 2019-5-9 11:26:40 来自手机 | 显示全部楼层
ddplys 发表于 2019-5-9 11:01
相当于加了签名,程序签名与单片机签名不一致则不启动。

是的,是这个意思。
我目前是从头到尾逐字节读出后crc32一遍,然后用这个crc做签名,可行不?

出0入0汤圆

 楼主| 发表于 2019-5-9 11:27:26 来自手机 | 显示全部楼层
mxper88 发表于 2019-5-9 11:25
stm32加入flash的代码自我校验,相当于加密

只能核对是不是正确,加密还不行吧?

出0入4汤圆

发表于 2019-5-9 11:31:25 | 显示全部楼层
bootload里校验APP,错误不跳转

出0入0汤圆

发表于 2019-5-9 11:54:22 | 显示全部楼层
本帖最后由 pt2go 于 2019-5-9 11:57 编辑

我的有程序段完整性校验,并且每次烧写都吧mcuid读取,产生校验数据附加到程序段,然后烧写。程序段只要修改一个字节就不能运行,能够起到一定的防盗效果,一般的修改id地址的破解是无法起作用的。设置数据需要另外处理

出0入0汤圆

发表于 2019-5-9 11:57:53 | 显示全部楼层
首先要想清楚几个问题。
如果破解者,已经在改代码了。说明,他已经找到了你判断盗版的地方了(采样芯片ID校验)。
加了这个程序完整性校验,多了一个判断盗版的地方, 他一样能破解。尤其是对于”程序不运行“ 这种表现明显的情况,更好找。
我的建议是,
1,程序中多放一些判断芯片ID的地方,不要用函数调用方式,因为函数调用方式,破解者只需要改一改地方就可以使用了。 这样破解者,即使要改你的代码,也需要多处修改。
2. 发现盗版后,不要很明显的表现出来(比如直接卡在某处不往下走),这种盗版者很容易找到。你可以采用比如: 发现盗版后,精度变差,本来误差1%,你直接给你误差10%左右,而且是变化的(比如100次中有1次是错误的)。让破解者不容发现。

出0入0汤圆

发表于 2019-5-9 12:05:12 | 显示全部楼层
本帖最后由 pt2go 于 2019-5-9 12:27 编辑
zhonghua_li 发表于 2019-5-9 11:57
首先要想清楚几个问题。
如果破解者,已经在改代码了。说明,他已经找到了你判断盗版的地方了(采样芯片ID ...


首先需要了解一般的id破解,是仿真器跟踪数据断点,数据断点设置在id的地址,只要读取id就会中断,(一般的程序员仿真的时候只用到程序断点,数据断点很多人没有用过),这个就很好找到读取id的程序的位置了。下一步就是在程序空间空白的地方吧id号写进去,然后改变读取id的地址指向修改后的程序空间,就完成了破解。也有人会继续跟踪到判断的地方,吧判断结果进行修改,不过这个方式难度高,很多人不会。

知识:程序断点与数据断点
blog.csdn.net/imgsq/article/details/52039554

所以增加完整性判断,那么在破解之前需要吧校验去掉,这个增加了很大破解难度。也在程序没有用到的空间增加随机数据,让破解的无法判断哪些位置的数据是没用的,无法放置id号码。
会破解的人里面,会id破解的要去掉很多一部分了,会id破解的能够进行程序破解的更少了。。。。。

出0入0汤圆

 楼主| 发表于 2019-5-9 13:04:05 来自手机 | 显示全部楼层
zhonghua_li 发表于 2019-5-9 11:57
首先要想清楚几个问题。
如果破解者,已经在改代码了。说明,他已经找到了你判断盗版的地方了(采样芯片ID ...

学习了。
我目前的侧重点其实并不是防山寨,而是防止存储器部分出故障导致运行出问题,是从运行可靠性角度考虑的。
另外,请问一下防山寨方面的技术,stm32仅靠读保护,算是什么等级的保护,容易攻破吗?

出0入0汤圆

发表于 2019-5-9 13:06:10 | 显示全部楼层
本帖最后由 zhonghua_li 于 2019-5-9 13:15 编辑
pt2go 发表于 2019-5-9 12:05
首先需要了解一般的id破解,是仿真器跟踪数据断点,数据断点设置在id的地址,只要读取id就会中断,(一般 ...


好,有道理。那需要再加一点:不要开机就去判断芯片ID,运行一段时间(比如24小时)再去判断。

不过完整性的问题, 只需要两个芯片代码比对 即可发现完整性代码存放在哪里。

出0入4汤圆

发表于 2019-5-9 13:15:01 | 显示全部楼层
No.5 发表于 2019-5-9 13:04
学习了。
我目前的侧重点其实并不是防山寨,而是防止存储器部分出故障导致运行出问题,是从运行可靠性角 ...

这在逻辑上有冲突啊
如果你认为code存储区不可靠,那么就是说从code读取的指令是不可靠的,那么你现在的程序在运行时怎么能保证是按照你的逻辑在运行呢
本来你算了CRC,在对比的时候,正好存对比指令的那个地方坏掉一位,crc不对反而跳转到正常运行的地方了

出0入0汤圆

发表于 2019-5-9 13:38:16 | 显示全部楼层
本帖最后由 styleno1 于 2019-5-9 13:40 编辑

主流的MCU还没有考虑Flash的不可靠性的,规格书Flash寿命基本上是10年

编辑说明:修改错别字

出0入0汤圆

发表于 2019-5-9 14:02:14 | 显示全部楼层
如果flash不可靠,那么bootloader部分是不是也不可靠,那做校验又有何用

出0入8汤圆

发表于 2019-5-9 20:40:08 | 显示全部楼层
觉得没什么必要,当FLASH中的数据出错,可能程序都跑飞了。

出0入0汤圆

发表于 2019-5-9 21:17:07 | 显示全部楼层
一般产品不用去考虑这个问题。

出0入0汤圆

发表于 2019-5-10 08:30:43 | 显示全部楼层
从安全角度上是完全有必要,因为如果出现CRC错误的话,有可能就是MCU内部的Flash损坏,也有可能是下载过程中的数据传输出错,这些错误会造成什么样的故障表现,我们并不清楚,这个时候不去执行正常功能,而是将MCU停止住,进入一个安全模式,并且报错,这样可以防止出现不可预知的故障,减少潜在的损失。

出0入0汤圆

发表于 2019-5-10 17:33:59 | 显示全部楼层
这种概率很低吧,即使是出现了错误:
1、不检验,运行出错
2、校验发现问题,不运行
出厂前测试都能检测出来,结果还是一样的

出0入0汤圆

发表于 2019-5-10 17:54:35 | 显示全部楼层
研究过戴森的吹风机,里面的程序就会开机 对所有FLASH程序区进行计算校验,校验出错 程序不运行

出0入0汤圆

 楼主| 发表于 2019-5-10 21:03:27 | 显示全部楼层
woshigeshuai 发表于 2019-5-10 17:54
研究过戴森的吹风机,里面的程序就会开机 对所有FLASH程序区进行计算校验,校验出错 程序不运行 ...

我想实现的就是这个功能

出0入0汤圆

发表于 2019-5-10 21:49:42 | 显示全部楼层
其实只能说降低概率,我是BOOT对APP校验,不通过则复制外部存储器的程序到内部APP区域,再跳转运行。

出0入0汤圆

发表于 2019-5-10 22:09:53 | 显示全部楼层
要求严格环境中 是需要的  比如电梯控制板  检验 ram  flash

出0入0汤圆

发表于 2019-5-11 05:52:00 来自手机 | 显示全部楼层
CRC可能不够,用MD5.

出0入0汤圆

 楼主| 发表于 2019-5-13 07:11:40 | 显示全部楼层
lingdianhao 发表于 2019-5-11 05:52
CRC可能不够,用MD5.

主要是stm32内部有硬件CRC,用起来又快又爽。
再说这本来也是个锦上添花的事,MD5太兴师动众了

出0入0汤圆

发表于 2019-5-13 08:06:46 | 显示全部楼层
上电时电源不稳定也可能造成数据错误。
与其发现存储的数据错误就拒绝执行,倒不如把重要的东西记三遍,发现有错误就用两个正确的数据覆写错误数据。

出0入0汤圆

 楼主| 发表于 2019-5-13 08:31:07 | 显示全部楼层
hdxet 发表于 2019-5-13 08:06
上电时电源不稳定也可能造成数据错误。
与其发现存储的数据错误就拒绝执行,倒不如把重要的东西记三遍,发 ...

顺这个思路继续,是不是应该用一些可恢复错误的ECC算法,效率比存3份要高得多。

出0入0汤圆

发表于 2019-5-13 08:53:16 | 显示全部楼层
NXP的M3自带了Flash CRC校验功能。

出0入0汤圆

发表于 2019-5-13 09:13:29 来自手机 | 显示全部楼层
如果有bootloader,随带就校验一下吧,举手之劳

出0入0汤圆

发表于 2019-5-13 11:05:20 | 显示全部楼层
No.5 发表于 2019-5-13 08:31
顺这个思路继续,是不是应该用一些可恢复错误的ECC算法,效率比存3份要高得多。 ...

增加1/3的空间,可纠正1位错误,前提是纠错代码正常
还得硬件支持简单靠谱。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 08:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表