你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

谁能讲解一下软件加密的技巧  

[复制链接]
peter001 提问时间:2016-11-7 22:21 /
阅读主题, 点击返回1楼
收藏 4 评论22 发布时间:2016-11-7 22:21
22个回答
tanr 回答时间:2016-12-16 10:31:23
adlu 发表于 2016-11-8 08:42
可以参考此贴
https://www.stmcu.org.cn/module/forum/thread-603421-1-1.html

多谢分享
a707083746 回答时间:2017-11-13 17:25:28
大家看看这样做有没有用:STM32 FLASH可以擦除1万次,首先下载一个程序把某一页刷爆。然后再下载正式程序,对那一页写失败就正常运行。别人破解后应该用新的芯片,那一页可以写,就不正常运行。
zwmasdf 回答时间:2017-11-14 13:34:15
a707083746 发表于 2017-11-13 17:25
大家看看这样做有没有用:STM32 FLASH可以擦除1万次,首先下载一个程序把某一页刷爆。然后再下载正式程序, ...

1万次是至少,实际不会刚好1万次的。而且这样也有风险,万一程序烧错了,或者要更改,就只能浪费这枚芯片了
a707083746 回答时间:2017-11-14 18:07:25
zwmasdf 发表于 2017-11-14 13:34
1万次是至少,实际不会刚好1万次的。而且这样也有风险,万一程序烧错了,或者要更改,就只能浪费这枚芯片 ...

一直擦除到擦坏为止,选择擦除的这一页不要靠近程序就行了吧,不会有这样的风险。
meifan119 回答时间:2019-4-26 11:30:36
在程序中不要直接出现1ffff7e8,另外最好程序进行校验,可以加q聊聊,5225016
faith157 回答时间:2019-4-26 11:49:36
分享不错
edmundlee 回答时间:2019-4-26 11:57:19
不是说Level-2的读写保护是破不了的吗?
meifan119 回答时间:2019-4-29 13:09:42
做软件加密时,程序里面千万不要出现id的地址1FFFF7E8,不然很容易被破解,q5225016
meifan119 回答时间:2019-8-30 10:14:12
一、两层保护
a) 读保护。设置读保护功能,使芯片中的程序无法被读出。当关闭读保      
护功能时,芯片会自动擦除flash中的所有程序;
b) 唯一的ID识别。每片STM32芯片都带有唯一的ID,在程序中加入         
ID验证,使程序只能在一个ID下运行。万一程序被拷贝出来,烧入其它的STM32芯片中也不能运行。
特点:有两重保护,芯片可重复使用。
二、熔丝方案
1. 功能简介:通过烧断芯片程序烧写口的熔丝,防止芯片中的程序被读出或修改;
2. 特点:熔丝一旦烧断,程序就无法读写,程序升级只能换芯片。

三、利用id做软件加密
1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可

2,利用板子上按键组合,或是上电按住某些键,程序在这个时候利用算法把id计算得到一些值存入程序区,程序运行时去验证程序区数据是否正确

3,轩微编程器有软件加密的功能,编程器会读芯片id,根据算法直接改写缓冲区,达到软件加密的作用


四、做软件加密时注意
1,不要在程序中直接出现id地址,例如1FFFF7E8 1FFFF7EC 1FFFF7F0
2, 利用校验和或是crc对程序区进行校验,防止改程序
meifan119 回答时间:2019-9-1 09:28:09
//STM32F10X软加密方法及实例代码

#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
volatile uint32 gU32IdAdressVar;//这里一定要定义此变量,否则会被优化器优化掉
void Stm32F10xEncryptDemo(void)
{
        uint32 *u32IdAddress;
  uint32 u32EorRslt, u32AddRslt;
        #IF 0
        //如果直接赋值0X1FFFF7E8,则程序编译结果里会有0X1FFFF7E8,这样破解人员会很轻松
        //的找到这个内容,然后非常容易进行修改,去掉软加密
        u32IdAddress = (uint32*)0x1ffff7e8;
        #else
        //千万别显式的读取ID,即要把0X1FFFF7E8运算成隐式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
        //这样,别人就算破解出了你的程序,也查找不到0X1FFFF7E8,这样就不能轻易的软解密,这样处理后如果要软解密,
        //一定要反汇编出来进行复杂逆向分析,难度极大,代价极高,很难搞定软加密了,达到保护产品的目的。
        gU32IdAdressVar = 0x455873a;
        gU32IdAdressVar <<= 2;//0x11561CE8
        u32IdAddress = (uint32*)(gU32IdAdressVar + 0xEA9DB00);//0x1ffff7e8
        #endif
        //读取单片机的ID,并进行运算,具体算法可以自己定,这里只用到简单的异或及和运算
        u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
        u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
        //进行对比,如果运算结果与FLASH保存的结果不一样,说明非法,运行错误代码
        if(u32EorRslt != *((uint32*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
        {
                while(1);//异或算法结果不正确,进行错误分支
        }
        if(u32AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
        {
                while(1);//和算法结果不正确,进行错误分支
        }
}

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版