amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 201

STM32/GD32 96位唯一ID自动加密(无须任何软件)

  [复制链接]
(177427550)
发表于 2014-11-19 15:06:25 | 显示全部楼层 |阅读模式
本帖最后由 Jacy 于 2014-11-19 15:09 编辑

规定三个月不发帖帐号被冻结,刚解冻,发个贴子。

大神跳过。

我们都知道,STM32/GD32在加密上都是可以使用96位唯一ID号进行加密,常规的做法都是回读UID号,再经过相应算法把结果写进芯片内部指定FLASH中,如我之前的帖子(        STM32/GD32 JLINK在线编程及唯一ID自动加密软件),做了一个上位机,使用JLINK读取ID号,再经过算法,把算法结果写到指定的FLASH地址,程序运行时,使用与上位机相同的算法,得出结果,与保存JLINK写进的FLASH地址的值进行对比,一致则运行,否则不继续运行。

在这个加密过程中,需要使用JLINK,需要电脑,需要上位机读取ID号再回写数据,当你只知道这种流程时,觉得没什么,但是下面这个方法,会让你知道,原来加密是如此的简单,具体步骤如下:

编译软件:KEIL

1、在指定FLASH地址中写入0xFFFFFFFF,以保证该地址内容在第一次烧写时为0xFFFFFFFF
const uint32_t Test_Addr __attribute__((at(0x08000800)))=0xFFFFFFFF;//在该地址写入0xFFFFFFFF
                                                                   //保证第一次上电能够直接写入数据

2、读取UID号,判断Test_Addr内容是否为0xFFFFFFFF,即判断程序是否第一次运行,如果是,那么,把ID号写入该地址,当然,要想达到更好的加密效果,自己可以做一些算法,把算法结果写到该地址。

3、当程序运行过一次后,即在指定地址已经写下了UID或者加密算法结果,那么,如果第二步中Test_Addr地址内容不为0xFFFFFFFF时,就判断Test_Addr地址内容是否为UID号(如果有使用算法,就判断算法结果是否与该地址内容一致),是则运行,否则不运行。

如果有人使用工具读出FLASH内容时,因为Test_Addr,已经在第一次上电已被写入自身UID号或者经过算法的结果,所以如果把读出的文件再烧到其他芯片,其他芯片会直接执行第3步,这样Test_Addr内容为上一个芯片的UID号或者算法结果,与烧进来的这个芯片不一致,所以就不运行。

到此为止,只需要三步,就可以实现程序自动加密,无须任何软件工具干预。

下面链接为测试工程,仅供参考。

STM32/GD32 UID自动加密
(177427246)
发表于 2014-11-19 15:11:29 | 显示全部楼层
很早就是这么做的了

我是在STM8上实现的。

那个初始化字符建议用更复杂一些的。另外,本身要做加密变换后存储,比如AES。这样无法明文比较。还有内部判断的流程,使用函数指针分散。基本上就很妥当啦
(177427043)
发表于 2014-11-19 15:14:52 | 显示全部楼层
还可以是用几中算法  flash中多存几个位置。 更理想了。
(177427023)
发表于 2014-11-19 15:15:12 | 显示全部楼层
好像有问题,如果别人知道这个Test_Addr,把内容强制改成0xFFFFFFFF就解密了
(177427002)
发表于 2014-11-19 15:15:33 | 显示全部楼层
对方对你的二进制镜像反汇编然后绕开校验呢?
(177426851)
 楼主| 发表于 2014-11-19 15:18:04 | 显示全部楼层
jingyite 发表于 2014-11-19 15:15
好像有问题,如果别人知道这个Test_Addr,把内容强制改成0xFFFFFFFF就解密了 ...

所以这个必须保密
(177426799)
 楼主| 发表于 2014-11-19 15:18:56 | 显示全部楼层
mail2li 发表于 2014-11-19 15:15
对方对你的二进制镜像反汇编然后绕开校验呢?

没有破解不了的芯片呢,只是看技术难度, 最好的话,再把读保护置位,就更强了
(177426733)
 楼主| 发表于 2014-11-19 15:20:02 | 显示全部楼层
STM32_Study 发表于 2014-11-19 15:11
很早就是这么做的了

我是在STM8上实现的。

经验之道啊,不错,学习了。
(177425700)
发表于 2014-11-19 15:37:15 | 显示全部楼层
最好弄多个地址,每个地址初始值都设置不一样,然后用几套加密法则 写入改地址,这样就增加了难度
(177425422)
发表于 2014-11-19 15:41:53 | 显示全部楼层
这个我也做过。但没用使用函数指针分散。
(177425166)
发表于 2014-11-19 15:46:09 | 显示全部楼层
不错,可以再stm8上用一下
(177424770)
发表于 2014-11-19 15:52:45 | 显示全部楼层
在STM8S上面的选项字节不是有读保护功能吗,将该位置不是可以禁止读取了吗?  干嘛还需要做加密啊?  最芯片破解流程不太理解,还请大神解答一下
(177424754)
发表于 2014-11-19 15:53:01 | 显示全部楼层
Jacy 发表于 2014-11-19 15:18
没有破解不了的芯片呢,只是看技术难度, 最好的话,再把读保护置位,就更强了 ...

如果能读出flash的话,只要找到你的两套系统,比较不同的地方,将它们都改为0xff
(177424360)
发表于 2014-11-19 15:59:35 来自手机 | 显示全部楼层
如果程序要发给客户自己升级,这种情况要怎么加密比较方便?
(177424340)
发表于 2014-11-19 15:59:55 | 显示全部楼层
是啊,两片对比就能找出校验位置,这个怎么防?
(177424207)
发表于 2014-11-19 16:02:08 | 显示全部楼层
STM32F1全系列硬解密(读出flash)费用已经低至3000元。
(177423761)
发表于 2014-11-19 16:09:34 | 显示全部楼层
STM32F1系列只要3000了?
(177422437)
发表于 2014-11-19 16:31:38 | 显示全部楼层
LZ想法不错,不过要真的防复制,这好比是安保工作的外围
(177421046)
 楼主| 发表于 2014-11-19 16:54:49 | 显示全部楼层
EMOSYN 发表于 2014-11-19 15:59
是啊,两片对比就能找出校验位置,这个怎么防?

所以最好把读保护位置位,这样读出来就是乱码,除非硬解
(177420391)
发表于 2014-11-19 17:05:44 | 显示全部楼层
规定三个月不发帖帐号被冻结?
(177420386)
发表于 2014-11-19 17:05:49 | 显示全部楼层
楼主的加密方法,硬解两片后对比,很容易破解。

受楼主启发,应该有更好的方法:
1 把校验码计算程序和校验码写在同一块flash内;
2 计算出校验码后,擦空这块flash区;
3 写入校验码,flash其他位置入随机数。

如此,校验码的位置不好找,即使找到了位置也难以在新的芯片上重新生成校验码。

有时间验证一下。
(177419801)
发表于 2014-11-19 17:15:34 | 显示全部楼层
确实,两片读出对比就可以发现问题

反编译时,找到跳转,修改也可以会搞定

芯片就像堡垒,始终有一天被攻破,还是在其它方面考虑多点比较好点
(177419640)
发表于 2014-11-19 17:18:15 | 显示全部楼层
不错,谢谢分享。。。
(177417577)
发表于 2014-11-19 17:52:38 | 显示全部楼层
lordor 发表于 2014-11-19 17:15
确实,两片读出对比就可以发现问题

反编译时,找到跳转,修改也可以会搞定

跳转,不要用IF语句,要用多个CASE语句,并且多处使用跳转。反汇编的人会疯掉。
(177410287)
发表于 2014-11-19 19:54:08 来自手机 | 显示全部楼层
STM32_Study 发表于 2014-11-19 15:11 很早就是这么做的了 我是在STM8上实现的。

读两个不同的片子,找出差异,就搞定了。
(177410197)
发表于 2014-11-19 19:55:38 | 显示全部楼层
办法其实也是有的.找出你的核心参数或代码,加密后保存到FLASH中,运行时需要使用UID作为密钥解密到RAM中运行.这样就算比较中不同.如果不看懂代码,也是不能简单修改的.
(177409532)
发表于 2014-11-19 20:06:43 | 显示全部楼层
wye11083 发表于 2014-11-19 19:54
读两个不同的片子,找出差异,就搞定了。

高效快捷。
(177369386)
发表于 2014-11-20 07:15:49 | 显示全部楼层
学习一下子
(177368908)
发表于 2014-11-20 07:23:47 | 显示全部楼层
简单的加密够用了,谢谢
(177367831)
发表于 2014-11-20 07:41:44 | 显示全部楼层
如果加密地址Test_Addr是随机的,并且不止一个,即将加密结果分散地写入flash中,那就ideal
(177367825)
发表于 2014-11-20 07:41:50 来自手机 | 显示全部楼层
Test_Addr 不要写FFFFFFFF,写其他值,第一次上电后是这个值就擦除这个区,再写入和UID经过算法计算后的新值。的
(177366564)
发表于 2014-11-20 08:02:51 | 显示全部楼层
EMOSYN 发表于 2014-11-19 16:02
STM32F1全系列硬解密(读出flash)费用已经低至3000元。

3000啊,哪里有我看看
(177365489)
发表于 2014-11-20 08:20:46 | 显示全部楼层
STM32,唯一ID加密;
21楼和26楼,扩展延伸后值得借鉴参考!
(177363932)
发表于 2014-11-20 08:46:43 | 显示全部楼层
好想法,学习了!
(177362780)
发表于 2014-11-20 09:05:55 | 显示全部楼层
1、在指定FLASH地址中写入0xFFFFFFFF,以保证该地址内容在第一次烧写时为0xFFFFFFFF

这个芯片在编程前的擦除就全擦成0xFFFFFFFF了。如果不是,FLASH除了擦除,是没办法由0变1的。
(177341703)
发表于 2014-11-20 14:57:12 | 显示全部楼层
顶贴,谢谢分享
(177341630)
发表于 2014-11-20 14:58:25 | 显示全部楼层
学习了                 
(177341279)
发表于 2014-11-20 15:04:16 | 显示全部楼层
wye11083 发表于 2014-11-19 19:54
读两个不同的片子,找出差异,就搞定了。

找出差异也没用。是加密存储的。解密者根本无法修改
(177338975)
发表于 2014-11-20 15:42:40 | 显示全部楼层
STM32_Study 发表于 2014-11-20 15:04
找出差异也没用。是加密存储的。解密者根本无法修改

不要把破解者想的太RZ了,呵呵。所有加密措施都只能防君子,是防不了小人的。比如最安全的AES加密的FPGA,如果真的非常有价值,使得某部门投入上亿去破解,那么可以通过物理手段烧入熔丝位,然后读出数据,或者直接用探针读取熔丝位的值,或者Flash里面的值。就看值不值得了。单片机写个ID是最简单的,大不了把别的片子ID改成一样的。
(177338534)
发表于 2014-11-20 15:50:01 | 显示全部楼层
楼主的加密方法确实有一个比较容易解密的入口,就是那个 0xFFFFFFFF,只要这里一该就OK了!
(177338160)
发表于 2014-11-20 15:56:15 | 显示全部楼层
现在最怕的是stm的uid是假的,据说可以通过某种手段改写
破解者只需要把这个id改成原片一样就可以了

或者通过反汇编,jmp到一块空白地方,把读id的值,返回和原片一样,也一劳永逸
(177338030)
发表于 2014-11-20 15:58:25 | 显示全部楼层
不到万不得已,破解者是不会去跟算法的
直接找到弱点解决
(177337737)
发表于 2014-11-20 16:03:18 | 显示全部楼层
没有解不开的密,只是时间和钱的问题。。。
(177337707)
发表于 2014-11-20 16:03:48 | 显示全部楼层
楼主这个方法简单易行,一般产品够用了。
(177337325)
发表于 2014-11-20 16:10:10 | 显示全部楼层
mark-----------
(177318593)
发表于 2014-11-20 21:22:22 | 显示全部楼层
wye11083 发表于 2014-11-20 15:42
不要把破解者想的太RZ了,呵呵。所有加密措施都只能防君子,是防不了小人的。比如最安全的AES加密的FPG ...

你纯粹是无聊瞎掰的那种人

先是不仔细看帖,说找出差异即可。我告诉你是AES变换加密存储的,你又来说有关部门多厉害

懒得跟你聊
(177318483)
发表于 2014-11-20 21:24:12 | 显示全部楼层
wye11083 发表于 2014-11-20 15:42
不要把破解者想的太RZ了,呵呵。所有加密措施都只能防君子,是防不了小人的。比如最安全的AES加密的FPG ...

另外再多说一句,就按照你说的这么厉害的手段,仍然破解不了。因为根本说说到点子上


就算让你读出了正确完整的FLASH,都没用,知道吗?!
(177316142)
发表于 2014-11-20 22:03:13 | 显示全部楼层
EMOSYN 发表于 2014-11-19 17:05
楼主的加密方法,硬解两片后对比,很容易破解。

受楼主启发,应该有更好的方法:

期待你的试验结果
(177279187)
发表于 2014-11-21 08:19:08 来自手机 | 显示全部楼层
谁敢上固件试一试?据说赛格电子城500块把固件读出来,然后又一个500块把正版验证功能废掉。上个103的固件,我找人试试看!
(177277978)
发表于 2014-11-21 08:39:17 | 显示全部楼层
将TestAddr地址的数据改为4个FF,就能绕过去了。
你的破解就这么简单。
我的Jlink8就是这么 被正版的。好爽呀!
当然,对于90%的客户是没问题的。
完全可信!
(177273456)
发表于 2014-11-21 09:54:39 | 显示全部楼层
学习了!正在做stm32加密
(177273130)
发表于 2014-11-21 10:00:05 | 显示全部楼层
思路不错,借鉴学习.
(177272882)
发表于 2014-11-21 10:04:13 | 显示全部楼层
不错,学习一下!
(177270576)
发表于 2014-11-21 10:42:39 | 显示全部楼层
lordor 发表于 2014-11-19 17:15
确实,两片读出对比就可以发现问题

反编译时,找到跳转,修改也可以会搞定

呵呵,这个是最简单的加密了,破解也是很简单!
(177270500)
发表于 2014-11-21 10:43:55 | 显示全部楼层
markdif 发表于 2014-11-20 16:03
没有解不开的密,只是时间和钱的问题。。。

设置加密一般是让破解的成本高出自己做好几倍的时候,别人就不会支想办法解了!
(177269952)
发表于 2014-11-21 10:53:03 | 显示全部楼层
来学习学习
(177253617)
发表于 2014-11-21 15:25:18 | 显示全部楼层
谢谢楼主
(177247808)
发表于 2014-11-21 17:02:07 | 显示全部楼层
顶一个,谢谢分享。
(177229443)
发表于 2014-11-21 22:08:12 | 显示全部楼层
我在想,解密攻击者肯定首先会想到都是用唯一ID这个最基本的方式,所以会不会最简单的方法就是前面有个楼层说的直接模拟一个ID出来呢,因为相对来说ID位置都是一样的,他只需要简单的跟踪读取ID的几条代码,然后用自己重新组织几条语句返回样片一样的ID就没有任何意义了吧?

当然我这是指针对反汇编的方式来说的,这样的话,他就相当于100%克隆了一个和样片一摸一样的新片子了,根本不用去跟踪什么算法跳转等等,只需要找读取ID的那条特殊代码

我的理解对不?
(177228252)
发表于 2014-11-21 22:28:03 | 显示全部楼层
1a2b3c 发表于 2014-11-21 22:08
我在想,解密攻击者肯定首先会想到都是用唯一ID这个最基本的方式,所以会不会最简单的方法就是前面有个楼层 ...

完全正确

还有就是直接改id

如果id不是固化的,是可以通过某种手段修改,这个方法最简单
(177227637)
发表于 2014-11-21 22:38:18 | 显示全部楼层
loveavr999 发表于 2014-11-21 22:28
完全正确

还有就是直接改id

恩,改ID的话这个是属于芯片厂作假或者欺骗消费者,没有直接以工艺方"'雕刻"出来ID,

但是我说的那个方法,是采用ID加密的任何方法都没办法避免的啊
应该比反汇编跟踪if等等调价跳转还容易无数倍,但是前提是必须知道加密者使用ID作为种子,不过没有第三方的输入的话,这个也是99%的自我加密的唯一方法了
(177172297)
发表于 2014-11-22 14:00:38 | 显示全部楼层
学习了

   
(176906761)
发表于 2014-11-25 15:46:14 | 显示全部楼层
我有个疑问,难道解密者的程序不执行const uint32_t Test_Addr __attribute__((at(FLASH_ADR)))=0xFFFFFFFF;这行代码吗?如果执行了,第二次上电不就更新成新ID了吗?
(176906034)
发表于 2014-11-25 15:58:21 | 显示全部楼层
我明白了,FLASH只能1到0,不能0到1,写入只要有一位是0就不能变成全F.
(176879034)
发表于 2014-11-25 23:28:21 | 显示全部楼层
楼主这个方法简单易行
(176844874)
发表于 2014-11-26 08:57:41 | 显示全部楼层
gxnnhy 发表于 2014-11-21 08:19
谁敢上固件试一试?据说赛格电子城500块把固件读出来,然后又一个500块把正版验证功能废掉。上个103的固件 ...

有没有这么便宜啊?
(176843762)
发表于 2014-11-26 09:16:13 | 显示全部楼层
一般般加密吧
(176826842)
发表于 2014-11-26 13:58:13 | 显示全部楼层
mark一下,后面会用得着
(176756162)
发表于 2014-11-27 09:36:13 | 显示全部楼层
呵呵,貌似不错,不过最好还是ID在加密一下
(176750039)
发表于 2014-11-27 11:18:16 来自手机 | 显示全部楼层
借鉴一下,现在的破解者太丧病了
(176747090)
发表于 2014-11-27 12:07:25 | 显示全部楼层
这个好,多谢分享
(176746834)
发表于 2014-11-27 12:11:41 | 显示全部楼层
很有启发性.................
(176745873)
发表于 2014-11-27 12:27:42 来自手机 | 显示全部楼层
不过如果把id也给你复制了,咋办,或者程序起来就吧id改了
(176745561)
发表于 2014-11-27 12:32:54 | 显示全部楼层
这个简单可行
(176745412)
发表于 2014-11-27 12:35:23 | 显示全部楼层
楼主这个还是蛮实用的
(176744867)
发表于 2014-11-27 12:44:28 | 显示全部楼层
完全避免是不可能的,只能提高门槛,让解密者觉得付出与收获不成比例即可。
(176029120)
发表于 2014-12-5 19:33:35 | 显示全部楼层
看大家分析得很有道理。没有绝对的安全! 只能尽量搞复杂点
(175699067)
发表于 2014-12-9 15:14:28 | 显示全部楼层
学习,正在研究中
(175698607)
发表于 2014-12-9 15:22:08 | 显示全部楼层
jingyite 发表于 2014-11-19 15:53
如果能读出flash的话,只要找到你的两套系统,比较不同的地方,将它们都改为0xff ...

我也想的是这种方法。

加密不能只用一种方法。应该几种方法混合起来用。并且不能马上出错,而是随机出错,这样迷惑性强。
(175698486)
发表于 2014-12-9 15:24:09 | 显示全部楼层
fb_bf 发表于 2014-11-27 12:27
不过如果把id也给你复制了,咋办,或者程序起来就吧id改了

唯一的ID是改不了的。
(175696712)
发表于 2014-12-9 15:53:43 | 显示全部楼层

顶一个,谢谢分享。
(175685789)
发表于 2014-12-9 18:55:46 | 显示全部楼层
定义一个特定地址还需地址不与Flash代码重合,否则有可能探除,需要去计算,麻烦!
可以定义成一个常量数组的形式
const  u32 CPUidEncrypt[1] = {0xFFFFFFFF};

然后直接用CPUidEncrypt作为地址,这样让编译器自动处理地址,更为方便

已测试很好用
(175684878)
发表于 2014-12-9 19:10:57 | 显示全部楼层
UID加一些算法,固化到flash,确实较为容易破解,读取芯片的UID,总会推断出所运用的算法。
(175684735)
发表于 2014-12-9 19:13:20 | 显示全部楼层
网上听说STM32唯一ID可以被改写,不知道是否是真的
如果是,那真是有些可怕,后面所有的努力都无用

(175683479)
发表于 2014-12-9 19:34:16 | 显示全部楼层
简单破解就可以用了,埋2个几个月之后逐步爆炸的定时炸弹就搞死他了。
(175682292)
发表于 2014-12-9 19:54:03 | 显示全部楼层
可以在flash里面写入任意的特征码①,并不一定是0xFFFFFFFF。然后在进入系统的时候,程序计算①的MD5值,并比较是否是特定值(即你通过①算出来的MD5),是的话就是第一次进入系统,再计算唯一ID②的值存储起来。这个是利用了MD5的不可逆性,这样的话,就无法通过①的特征值反推出出厂写入的特征码了。
(175681055)
发表于 2014-12-9 20:14:40 | 显示全部楼层
恩,可以参考一下,还有可以考虑外挂芯片搞一些特定的编辑算法
(175179069)
发表于 2014-12-15 15:41:06 | 显示全部楼层
jia_xuan 发表于 2014-11-25 15:46
我有个疑问,难道解密者的程序不执行const uint32_t Test_Addr __attribute__((at(FLASH_ADR)))=0xFFFFFFFF ...

这行不是语句
(175175415)
发表于 2014-12-15 16:42:00 | 显示全部楼层
这个方法感觉很好,值得借鉴啊
(175172075)
发表于 2014-12-15 17:37:40 | 显示全部楼层
地址也改成动态的,那就是最OK的。
(175171733)
发表于 2014-12-15 17:43:22 | 显示全部楼层
这个加密方法可以用,强度两星。
(175171389)
发表于 2014-12-15 17:49:06 | 显示全部楼层
这个是基础,如果需要更好的加密效果就需要下些功夫了
(175166250)
发表于 2014-12-15 19:14:45 来自手机 | 显示全部楼层
学习      非常好贴子的
(174983981)
发表于 2014-12-17 21:52:34 | 显示全部楼层
刚开始学stm8,真是好东西啊
(174940684)
发表于 2014-12-18 09:54:11 | 显示全部楼层
确实需要做点东西来保护自己的劳动成果
(174937604)
发表于 2014-12-18 10:45:31 | 显示全部楼层
准备在下个项目中试试这种方法
(174937585)
发表于 2014-12-18 10:45:50 | 显示全部楼层
“ 规定三个月不发帖帐号被冻结,刚解冻,发个贴子。 ”  这个规定是不包含回复吗?
(174937237)
发表于 2014-12-18 10:51:38 | 显示全部楼层
setagllib 发表于 2014-11-20 07:41
如果加密地址Test_Addr是随机的,并且不止一个,即将加密结果分散地写入flash中,那就ideal ...

我觉得 setagllib的方法很好,要多个Test_Addr组合才能完成,组合方式再加个算法,那就更难解密了。也就是双重算法+加密,再加上Test_Addr是随机。
(174936783)
发表于 2014-12-18 10:59:12 | 显示全部楼层
不错学习了
(174935717)
发表于 2014-12-18 11:16:58 | 显示全部楼层

“ 规定三个月不发帖帐号被冻结,刚解冻,发个贴子。 ”  这个规定是不包含回复吗?
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-4 04:32

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

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