历史上的今天
今天是:2025年01月23日(星期四)
2020年01月23日 | stm32芯片利用唯一ID对程序进行加密的一种方法
2020-01-23 来源:eefocus
#define STM32_ID_D 352525 //任意的一个数
//stm32芯片的ID地址,把地址减去一个数,避免汇编里面直接出现ID的地址,不然很容易暴露加密与ID号有关
volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};
/********************************************************************
函数功能:读出stm32的ID,12字节
入口参数:p
返 回:
备 注:把ID的地址做一下处理,加密性更好
********************************************************************/
volatile void STM32_Read_ID(volatile u32 *p)
{
volatile u32 Addr;
// 因为不想让程序在反汇编后直接找到这个地址,所以这个地址是运算出来的,
// 跟STM32_ID_addr反运算,当然了也可以用高级的算法,注意不能让编译器优化这个地址
Addr = STM32_ID_addr[0] + STM32_ID_D;
p[0] = *(vu32*)(Addr);
Addr = STM32_ID_addr[1] - STM32_ID_D;
p[1] = *(vu32*)(Addr);
Addr = STM32_ID_addr[2] + STM32_ID_D;
p[2] = *(vu32*)(Addr);
}
/********************************************************************
函数功能:加密ID并保存
入口参数:
返 回:
备 注:
********************************************************************/
void STM32_Encrypted_ID(void)
{
u32 stm32ID[4],dat;
STM32_Read_ID(stm32ID);
//这里可以用其它一些高级的算法,但解和加要一样
//把ID号处理成一个32位数,也可以用自己的算法,处理成其他数据,多少位都行
stm32ID[3] = STM32_ID_D;
dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]); //处理成一个32位数
FLASH_Unlock();
FLASH_ErasePage (STM32FLASH_EN_ID_START_ADDR); //
FLASH_ProgramWord(STM32FLASH_EN_ID_START_ADDR,dat); //保存这个数,写进32位
FLASH_Lock();
}
/********************************************************************
函数功能:比较加密ID,正确返回0
入口参数:
返 回:1:不正确,0:正确
备 注:
********************************************************************/
u32 STM32_CMP_Encrypted_ID(void)
{
u32 stm32ID[4],dat,dat2;
STM32_Read_ID(stm32ID);
// 这里可以用其它一些高级的算法,但解和加要一样
stm32ID[3] = STM32_ID_D;
dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);
dat2 = *(u32*)(STM32FLASH_EN_ID_START_ADDR); //读出加密时,保存在flash中的数
if(dat == dat2){return 0;} // 相同
else {return 1;} // 不同
}
//好了,有了上面那个程序,那下再继续
//===================ID加密控制=====================================================================
if(STM32_CMP_Encrypted_ID())
{
//量产时给一些条件,条件满足就对ID加密,然后把加密结果保存到flash中,把该程序与芯片的ID,唯一对应起来,加密完后,你也可以让它自宫。
if(XXXXXX)
{
STM32_Encrypted_ID(); //加密ID
自宫 //即把加密这段代码从flash里面擦除,直接跳出去继续执行
}
}
//===================正常运行时==================================
// 校验一下ID是否正确,
if(STM32_CMP_Encrypted_ID())
{
/*
来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
有时正常有时不正常,,呵呵,要查也不是那么容易的事了
*/
}
}
史海拾趣
|
汽车点烟器输出电压和电流是多少呢? 电脑的光驱有多少的电压和电流呢? 如果把光驱放到车上要接多大的电阻呢? 接什么东西 能把电流降到 1.5A 呢? 光驱的电流是1.5A 如果电流大了,光驱会坏吗? [ 本帖最后由 sunsonglin 于 2009-2-2 ...… 查看全部问答> |
|
各位大虾们,我刚上班不久,单片机知识只限于书本的知识,根本没实际经验,现在碰到一个设计一个单片机控制系统的难题,望各位哥哥姐姐们帮偶看下,能不能讲的详细些(最好帮我出个电路原理图),在此先谢过了~ 开关量:69个 38输入31输出 温度模拟量3路 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 然国际金融危机给家电业带来了不小的冲击,但是受益于家电下乡、以旧换新等一系列利好政策,2009年我国的高端冰箱市场出现了快速增长的态势。另外,随着低碳理念的深入人心,企业节能技术不断 ...… 查看全部问答> |
|
我在看书看到这样一段话: 对于arm指令集来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第一位总为0, 这句话全不懂,谁能解释下呢… 查看全部问答> |
|
应用API: BOOL ReadFile( HANDLE hFile, //端口句柄 LPVOID lpBuffer, //接收缓冲的指针 DWORD nNumberOfBytesToRead, //要读取的字节长度 LPDWORD lpNumberOfBytesRead, //P ...… 查看全部问答> |
|
WinCE6.0 设备挂载点命名方法是怎么用的?? 如: \\$device\\COM23 , 是怎么在CE6.0注册在使用的? 比如说注册表是怎么写的?, 或者是那里需要怎么操作?才能实现这样设备挂载点命名方法? 跪求高人指点!!… 查看全部问答> |
|
请问mw5一定要用TI的通讯模块吗?如果用wavecom的通讯模块,我该如何对ril进行处理 请问mw5一定要用TI的通讯模块吗?如果用wavecom的通讯模块,我该如何对ril进行处理?哪怕是给个思路也好,谢谢… 查看全部问答> |
|
先前使用的都是51单片机,用它编写小程序实在再方便不过了,但是那次将项目的总程序量增加到5个K我就对文件和软件的格式发傻了,各种不规范,各种无用功,从那时开始我就萌生了关注单片机的软件工程的想法,直到最近接触MSP430单片机,尤其是看到《 ...… 查看全部问答> |
|
* COB:COB是Chip On Board的英文简写,它是LCM驱动线路板的另一种加工方式。 该工艺是将裸芯片用粘片胶直接贴在PCB板指定位置上,通过焊接机用铝线将芯片电极与PCB板相应焊盘连接起来,再用黑胶将芯片与铝线封住固化, ...… 查看全部问答> |




