首页 >> 大全

STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭

2023-06-22 大全 46 作者:考证青年

大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术、一直到今年毕业。对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线。我对学习总结出一句话“压力不是有人努力,而是比你牛X N倍的人依然在努力”

STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭。STM32芯片通过可以把程序读出来。只要在相同的芯片上面,就可以跑起来,那么如何才能让一个程序只能够在一个芯片上正常运行呢?

经过一个下午的时间,总结出这个方法。通过读取ID号,然后在修改HEX文件来保护自己的程序不被抄袭,相对于开发成本中等的产品,还是有用的。但是,有一点麻烦。我用的是芯片。下面将介绍详细的步骤和方法。

一.获取ID码

工欲善其事,必先利其器,准备好工具,需要一个及下载软件,一个可以正常运行的硬件。 temp[12]; //存放芯片ID的临时变量 aa[12] = {0xee,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0x09, 0x10,0x11};//预置ID号,在HEX文中修改。aa这个数组用于存放预置ID号

复制代码

/******************************************************************************函数名称:读取芯片唯一ID码创建时间:2015-08-11修改时间:2015-08-11备 注:******************************************************************************/void (void){ u32 temp0,temp1,temp2;temp0 = *(__IO u32*)(); //产品唯一身份标识寄存器(96位) temp1 = *(__IO u32*)();temp2 = *(__IO u32*)(); //ID码地址: ,只需要读取这个地址中的数据就可以了。 temp[0] = (u8)(temp0 & ); temp[1] = (u8)((temp0 & )>>8); temp[2] = (u8)((temp0 & )>>16); temp[3] = (u8)((temp0 & )>>24); temp[4] = (u8)(temp1 & ); temp[5] = (u8)((temp1 & )>>8); temp[6] = (u8)((temp1 & )>>16); temp[7] = (u8)((temp1 & )>>24); temp[8] = (u8)(temp2 & ); temp[9] = (u8)((temp2 & )>>8); temp[10] = (u8)((temp2 & )>>16); temp[11] = (u8)((temp2 & )>>24); }

复制代码

通过void (void)就可以得到ID码了,这个ID码可以用串口输出,也可以用STM32 ST-LINK 读出来。这里,两种方法我都会讲到。方法一:通过串口输出得到ID码。/****************************************************************************************************************************函数名称:串口2初始化配置创建时间:2015-08-11修改时间:2015-08-11备 注:*****************************************************************************************************************************/void (void){ ;//定义GPIO类型结构体; //定义串口类型结构体md(, ); //配置GPIOA时钟,并使能时钟。

md(2,);//配置的时钟,并使能时钟. = ; //配置PA.02作为e. = ; //配置成推挽输出. = ;//配置GPIO时钟为(GPIOA, &); //初始化re. = ;//配置PA.03作为e. = G;//配置GPIO输入浮空(GPIOA, &);//初始化ure. = ;//配置串口波特率为cture. = ; //8位数据位. = ; //1位停止位. = ; //.ntrol = ; //硬件流程控制. = | ; //启动发送和接收(, &); //初始化串口(, , ); //使能串口2接收中断(, ); //使能外部中断}

复制代码

/****************************************************************************************************************************函数名称:发送数据函数创建时间:2015-08-11修改时间:2015-08-11备 注:*****************************************************************************************************************************/void ( , * ){ = 0; //发送数据临时变量for( = ; > 0;--) //数据的个数{(, *++); //调用发送函数// ++; //发送数据的地址加1,切换到下一个要发送数据的地址。while((, ) == RESET);//发送缓冲区空状态标志位。只有当缓冲区为空时,才发送下一个数据。}}

复制代码

串口配置好后,就可以调用(12,temp);函数,就能在串口助手看到ID码了。

芯片唯一ID码:32 FF DA 05 43 41 38 36 30 71 02 43 96位

复制代码

方法二:通过得到ID码。

1、打开STM32 ST-LINK ,确保与硬件连接正常。

2、在中输入“”芯片ID码的首地址。输入完成后,自动读取ID码。

3、确定后,自动读取ID码

但是,用读出来的只有64位,少了32位,这个“”地址中读取失败,我也不知道是什么原因,可能是厂家不允许下载器访问。

地址

ID数据

05 DA FF 32

36 38 41 43

空(不允许读)

我们把上面ID码整理一下:32 FF DA 05 43 41 38 36,由于在内存中是小端存储方式。所以是这样的。

通过两种方法,把我们想要的ID码得到后。就可以进行最关键的一步,修改HEX文件。

二.修改HEX文件加密

1、打开STM32 ST-LINK ,打开HEX文件。

[12] = {0xee,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0x09, 0x10,0x11};//预置ID号,在HEX文中修改。

复制代码

现在就打HEX文件打开后。找到上面定义的数组,这个是关键所在,我花了一个下午时间,才搞清楚。

[size=9.]2、找到自定义ID在地址的位置后,开始修改。

3、把数组“aa[12]” 里面的内容改成与芯片的实际ID码一致。如果程序被读出来,在另外一片相同的芯片上面也运行不起来。因为设置的ID与芯片实际ID不一致。

4、现在如果下载,会提示你文件被修改,需要保存。我们保存成HEX文件到桌面。

5、重新打开刚才保存的HEX文件。现在可以看到,修改的ID已经在HEX文件里面了。

6、下载程序到单片机。

7、完成下载。到这儿就基本完成了。

8、看到这儿,有的人会问,为什么不在编译时直接放在数组里,还要在HEX文件中修改,这样做的目的是方便批量生产。

在程序中,我做了一个简单的判断。如下();//先读出芯片实际ID for(i=0;i { if(temp == aa) //判断设置的ID与实际ID是不是一致。如果一致。LED灯不亮 { ; } else { (GPIOF, ); }}

复制代码

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了