adlu 发表于 2016-3-3 10:43:24

在做STM32F407的程序加密时,遇到一个问题

本帖最后由 adlu 于 2016-3-3 10:44 编辑

我想通过ID加密程序,思路如下:
程序有一个通用密码,存放在数组const char common_code[]={0x30,0x39, 0x18, 0xbb, 0x5a, 0xdd}。
程序的本机密码存储在const unsigned char encrypt_code __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中的应用程序。

adlu 发表于 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;
   }
}

adlu 发表于 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 {...}给忽略了。

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



zipl1985 发表于 2016-3-3 15:31:32

学习了,谢谢了,啊

adlu 发表于 2016-3-4 08:42:13

问题已经解决,确实是MDK编译器优化造成的。
原来我把上面的变量和函数都放在一个文件里,只给外部函数提供一个check_ID( )函数接口,因此出现上述问题。
解决办法是:
将该文件相关的变量用volatile进行定义,并在头问题中声明;
将check_ID( )里面的判断放到其他文件中进行。
这样编译器就不会把他们优化了。

ele1 发表于 2016-8-4 19:51:25

你好,可以提供源代码,借鉴一下吗?非常感谢

meifan119 发表于 2020-8-19 15:47:53

mcu_ID = *(__IO uint32_t*)(0x1FFF7A10);// 读取芯片ID
程序里面直接出现了0x1FFF7A10,如果破解的人把0x1FFF7A10改成0x800f000,再在0x800f000这个地址上放上你的母片id,你的程序就破解了,所以不要直接出现id地址,这种程序破解只要几百
页: [1]
查看完整版本: 在做STM32F407的程序加密时,遇到一个问题