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

KEIL 下如何实现代码的加密

[复制链接]
yvonn 提问时间:2015-7-10 20:34 /
阅读主题, 点击返回1楼
收藏 1 评论27 发布时间:2015-7-10 20:34
27个回答
废鱼 回答时间:2015-7-13 09:00:32
14楼说的对,所有的FLASH保护都是防止读取和写入。但是可以先擦除,再进行写入。同时,不影响程序自己控制FLASH擦写,除了IAP,还有很多是将FLASH作为简单的数据存储。
Mandelbrot_Set 回答时间:2015-7-13 10:07:31
安 发表于 2015-7-13 09:00
14楼说的对,所有的FLASH保护都是防止读取和写入。但是可以先擦除,再进行写入。同时,不影响程序自己控制F ...

即使FLASH保护,应该也还是可以读到的.
比如...
(图片比较旧了...)

捕获.JPG
废鱼 回答时间:2015-7-13 10:32:20
这样读取就没办法了。我们说的不能读取是说通过仿真器、ISP等工具。
Tension 回答时间:2015-7-13 10:42:31
可以对产品进行联网认证
笑鸟007 回答时间:2015-7-13 11:02:50
芯片应该会有加密设置吧?
废鱼 回答时间:2015-7-13 11:19:43
关键是楼主要用拆开芯片的读取方式,这就没法解决了吧。
yvonn 回答时间:2015-7-13 21:59:51
Mandelbrot_Set 发表于 2015-7-13 10:07
即使FLASH保护,应该也还是可以读到的.
比如...
(图片比较旧了...)

嗯,这种方式破解也是蛮狠的,不过,我更倾向于直接代码加密。
yvonn 回答时间:2015-7-13 22:03:37
安 发表于 2015-7-13 10:32
这样读取就没办法了。我们说的不能读取是说通过仿真器、ISP等工具。

嗯,总体来看,还是代码加密的方式更可靠,而且别人也不知道你的加密方式。FLASH保护,可以作为锦上添花之用。
废鱼 回答时间:2015-7-14 09:02:10
除非特殊的代码,一般没人会破坏芯片来破解程序的。
stary666 回答时间:2015-7-14 09:17:33
看看,,,,,,,,
meifan119 回答时间:2019-11-6 16:42:16
开发人员一般设计软件加密方法:读id---复杂算法计算---对比之前存储的对应数据(与id相关)---判断芯片是否合法。
由于读id时很多人直接用id起始地址,例如0x1FFFF7E8,破解的人只要把这个数据改成0x8000020,并且0x8000020程序区域填上
母片的id,不管你的算法有多复杂,这时你的程序就被破解了,改这种软件加密一分钟就改好了。所以千万注意程序里面不要
出现id起始地址。
用以下方法相对比较难了
//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);//和算法结果不正确,进行错误分支
        }
}
//QQ9272078
aiherong 回答时间:2019-11-7 02:59:38
原则上写进芯片的二进制码不存在加不加密,都是一样的可执行机器码,只能在技术上采取自熔(有的可恢复)一个关联"读操作"的门电路使芯片读不出来
立码赚 回答时间:2023-3-1 15:56:41

meifan119 发表于 2019-11-6 16:42
开发人员一般设计软件加密方法:读id---复杂算法计算---对比之前存储的对应数据(与id相关)---判断芯片是 ...

呵呵,做贡献了

12

所属标签

相似问题

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