搜索
查看: 6205|回复: 6

[已解决] 在做STM32F407的程序加密时,遇到一个问题

[复制链接]

该用户从未签到

27

主题

382

帖子

8

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2016-3-3 10:43:24 | 显示全部楼层 |阅读模式
本帖最后由 adlu 于 2016-3-3 10:44 编辑

我想通过ID加密程序,思路如下:
程序有一个通用密码,存放在数组const char common_code[]={0x30,0x39, 0x18, 0xbb, 0x5a, 0xdd}。
程序的本机密码存储在const unsigned char encrypt_code[FLASH_SECTOR3_SIZE] __attribute__((at(ADDR_FLASH_SECTOR_3))) ={...}。
【注:程序下载进去时,common_code和encrypt_code内容相同。】

1.上电后,读取芯片ID,用ID计算出本机对应的密码my_code[]。
2.如果本机密码encrypt_code和通用密码common_code相同,则将my_code[]存储到encrypt_code[]数组。
3.如果不相同,则对比encrypt_code和my_code。如果相同则校验正确,正常运行程序;否则校验失败,擦除FLASH中的应用程序。

回复

使用道具 举报

该用户从未签到

27

主题

382

帖子

8

蝴蝶豆

论坛元老

最后登录
2021-4-1
 楼主| 发表于 2016-3-3 10:43:39 | 显示全部楼层
伪代码如下:

uint8_t check_ID (void)
{
    mcu_ID = *(__IO uint32_t*)(0x1FFF7A10);  // 读取芯片ID
    my_code = calculate_code(mcu_ID);            // 计算本机对应的密码
   
    if(encrypt_code == common_code) {  // 如果本机当前存储的密码为通用密码
        write_myCODE_2_encryptCODE( my_code );  // 将本机对应的密码写入密码存储区
        return 0;
   } else if (encrypt_code == my_code ) { // 如果本机当前存储的密码就是本机对应的密码
      // do nothing
       return 1;
   } else {
//      erase_user_code(); // 擦除用户程序代码
      return 2;
   }
}
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

382

帖子

8

蝴蝶豆

论坛元老

最后登录
2021-4-1
 楼主| 发表于 2016-3-3 10:44:04 | 显示全部楼层
本帖最后由 adlu 于 2016-3-3 10:48 编辑

问题,程序运行时,check_ID( ) 返回的永远是0。
仿真的时候,程序第一次运行check_ID( ) 函数时,encrypt_code 和 common_code 确实相等,仿真复位后,运行第二次时,encrypt_code 和 common_code 是不相等的,但是仍然返回0。

我猜测的可能原因是,因为encrypt_code和common_code都是从const型数据,且定义时他们的内容相同,
因此编译器认为(encrypt_code == common_code) 是永远成立的,将后面的else if () {...} 和else {...}给忽略了。

不知道我的猜测可对?
这个问题该怎么解决呢?



回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

81

帖子

0

蝴蝶豆

中级会员

最后登录
2021-4-7
发表于 2016-3-3 15:31:32 | 显示全部楼层
学习了,谢谢了,啊
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

382

帖子

8

蝴蝶豆

论坛元老

最后登录
2021-4-1
 楼主| 发表于 2016-3-4 08:42:13 | 显示全部楼层
问题已经解决,确实是MDK编译器优化造成的。
原来我把上面的变量和函数都放在一个文件里,只给外部函数提供一个check_ID( )函数接口,因此出现上述问题。
解决办法是:
将该文件相关的变量用volatile进行定义,并在头问题中声明;
将check_ID( )里面的判断放到其他文件中进行。
这样编译器就不会把他们优化了。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2016-8-5
发表于 2016-8-4 19:51:25 | 显示全部楼层
你好,可以提供源代码,借鉴一下吗?非常感谢
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

35

帖子

0

蝴蝶豆

中级会员

最后登录
2024-2-23
发表于 2020-8-19 15:47:53 | 显示全部楼层
mcu_ID = *(__IO uint32_t*)(0x1FFF7A10);  // 读取芯片ID
程序里面直接出现了0x1FFF7A10,如果破解的人把0x1FFF7A10改成0x800f000,再在0x800f000这个地址上放上你的母片id,你的程序就破解了,所以不要直接出现id地址,这种程序破解只要几百
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-8 12:51 , Processed in 1.190483 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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