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號生成其他數據。不一定就是12字節的!并保存在內部EEPROM。在這個模塊準備2個函數.一個用于加密.一個用于解密
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字節生成12*N個字節
{
*pEE++=第1種算法,商業原因.我的算法就不公開了.大家可以準備一個數組查表
while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);
*pEE++=第2種算法,商業原因.我的算法就不公開了。大家可以準備一個數組查表
while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);
。。。。
第N種算法
}
}
//解密函數
unsigned char StmCheckUniqueID(unsigned char Addr)
3.主函數里面設置一個時間最好設置長一點。半個鐘或其他,讓人家難跟蹤
while(1)
{
其他任務...............
/////////////////////////////////////////////////////////////////////////
if((Flag&FLAG_CHECK_ID)==FLAG_CHECK_ID)
{
Flag&=~FLAG_CHECK_ID;
if(StmCheckUniqueID(UniqueIDAddress)==1){IsIDCorrect=0x01;}//正確寫入
else{IsIDCorrect=0x00;}//錯誤寫入
}
/////////////////////////////////////////////////////////////////////////
其他任務...............
}
/////////////////////////////////////////////////////////////////////////
總結:
這樣做還是能被破解的。但對方已經很難跟蹤了.
如果破解者對芯片熟悉.他會根據ID號的地址!----畢竟芯片ID號的地址是固定的.找到對應的調用程序.加密時用到芯片ID號的地址。解密時也有用到芯片ID號的地址
所以只有對方熟.是能很快跟蹤到加密/解密程序.而在解密程序入口就return出去!
這種方法已經很實用了.畢竟不是太專業的很難破.
|