|
1.讀出ID號
#if defined(STM8S103)
#define ID_BaseAddress (0x4865)
#else// defined(STM8S105)
#define ID_BaseAddress (0x48CD)
#endif
void GetUniqueID(unsigned char *p)
{
unsigned char i;
unsigned char *pIDStart=(unsigned char *)(ID_BaseAddress);
for(i=0;i!=12;i++){*p++=*pIDStart++;}
}
2.把讀出的ID號生成其他數(shù)據(jù)。不一定就是12字節(jié)的!并保存在內(nèi)部EEPROM。在這個模塊準(zhǔn)備2個函數(shù).一個用于加密.一個用于解密
void StmWriteUniqueID(unsigned char Addr)
{
unsigned char i;
FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)FLASH_Unlock(FLASH_MEMTYPE_DATA);
unsigned char *pEE=(unsigned char *)(FLASH_DATA_START_PHYSICAL_ADDRESS+(u32)Addr);
unsigned char *pIDStart=(unsigned char *)(ID_BaseAddress);
for(i=0;i!=6;i++)//由12字節(jié)生成12*N個字節(jié)
{
*pEE++=第1種算法,商業(yè)原因.我的算法就不公開了.大家可以準(zhǔn)備一個數(shù)組查表
while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);
*pEE++=第2種算法,商業(yè)原因.我的算法就不公開了。大家可以準(zhǔn)備一個數(shù)組查表
while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);
。。。。
第N種算法
}
}
//解密函數(shù)
unsigned char StmCheckUniqueID(unsigned char Addr)
3.主函數(shù)里面設(shè)置一個時間最好設(shè)置長一點。半個鐘或其他,讓人家難跟蹤
while(1)
{
其他任務(wù)...............
/////////////////////////////////////////////////////////////////////////
if((Flag&FLAG_CHECK_ID)==FLAG_CHECK_ID)
{
Flag&=~FLAG_CHECK_ID;
if(StmCheckUniqueID(UniqueIDAddress)==1){IsIDCorrect=0x01;}//正確寫入
else{IsIDCorrect=0x00;}//錯誤寫入
}
/////////////////////////////////////////////////////////////////////////
其他任務(wù)...............
}
/////////////////////////////////////////////////////////////////////////
總結(jié):
這樣做還是能被破解的。但對方已經(jīng)很難跟蹤了.
如果破解者對芯片熟悉.他會根據(jù)ID號的地址!----畢竟芯片ID號的地址是固定的.找到對應(yīng)的調(diào)用程序.加密時用到芯片ID號的地址。解密時也有用到芯片ID號的地址
所以只有對方熟.是能很快跟蹤到加密/解密程序.而在解密程序入口就return出去!
這種方法已經(jīng)很實用了.畢竟不是太專業(yè)的很難破.
|
|