本帖最后由 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中的应用程序。 |
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;
}
}
问题,程序运行时,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 {...}给忽略了。
不知道我的猜测可对?
这个问题该怎么解决呢?
原来我把上面的变量和函数都放在一个文件里,只给外部函数提供一个check_ID( )函数接口,因此出现上述问题。
解决办法是:
将该文件相关的变量用volatile进行定义,并在头问题中声明;
将check_ID( )里面的判断放到其他文件中进行。
这样编译器就不会把他们优化了。
程序里面直接出现了0x1FFF7A10,如果破解的人把0x1FFF7A10改成0x800f000,再在0x800f000这个地址上放上你的母片id,你的程序就破解了,所以不要直接出现id地址,这种程序破解只要几百