// 把地址直接减去一个数是不要在程序中直接出现这个地址

#define STM32_ID_D  352525   // 任意的一个数

volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};

/********************************************************************

函数功能:读出ID

入口参数:p

返    回:

备    注:

********************************************************************/

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);

// 这里可以用其它一些高级的算法,但解和加要一样

stm32ID[3] = STM32_ID_D;

dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);

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);

if(dat == dat2){return 0;} // 相同

else           {return 1;} // 不同

}

好了,有了上面那个程序,那下再继续

//===================ID加密控制=====================================================================

//

if(STM32_CMP_Encrypted_ID())

{

// 量产时给一些条件,条件满足就对ID加密,加密完后,你也可以让它自宫。

if(XXXXXX)

{

STM32_Encrypted_ID();   // 加密ID

自宫

}

//===================正常运行时==================================

// 校验一下ID是否正确,

if(STM32_CMP_Encrypted_ID())

{

来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,

那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统

有时正常有时不正常,,呵呵,要查也不是那么容易的事了

}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐