開發(fā)人員一般設計軟件加密方法:讀id---復雜算法計算---對比之前存儲的對應數據(與id相關)---判斷芯片是否合法。
由于讀id時很多人直接用id起始地址,例如0x1FFFF7E8,破解的人只要把這個數據改成0x8000020,并且0x8000020程序區(qū)域填上
母片的id,不管你的算法有多復雜,這時你的程序就被破解了,改這種軟件加密一分鐘就改好了。所以千萬注意程序里面不要
出現(xiàn)id起始地址。
用以下方法相對比較難了
//STM32F10X軟加密方法及實例代碼
#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
volatile uint32 gU32IdAdressVar;//這里一定要定義此變量,否則會被優(yōu)化器優(yōu)化掉
void Stm32F10xEncryptDemo(void)
{
uint32 *u32IdAddress;
uint32 u32EorRslt, u32AddRslt;
#IF 0
//如果直接賦值0X1FFFF7E8,則程序編譯結果里會有0X1FFFF7E8,這樣破解人員會很輕松
//的找到這個內容,然后非常容易進行修改,去掉軟加密
u32IdAddress = (uint32*)0x1ffff7e8;
#else
//千萬別顯式的讀取ID,即要把0X1FFFF7E8運算成隱式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
//這樣,別人就算破解出了你的程序,也查找不到0X1FFFF7E8,這樣就不能輕易的軟解密,這樣處理后如果要軟解密,
//一定要反匯編出來進行復雜逆向分析,難度極大,代價極高,很難搞定軟加密了,達到保護產品的目的。
gU32IdAdressVar = 0x455873a;
gU32IdAdressVar <<= 2;//0x11561CE8
u32IdAddress = (uint32*)(gU32IdAdressVar + 0xEA9DB00);//0x1ffff7e8
#endif
//讀取單片機的ID,并進行運算,具體算法可以自己定,這里只用到簡單的異或及和運算
u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
//進行對比,如果運算結果與FLASH保存的結果不一樣,說明非法,運行錯誤代碼
if(u32EorRslt != *((uint32*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
{
while(1);//異或算法結果不正確,進行錯誤分支
}
if(u32AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
{
while(1);//和算法結果不正確,進行錯誤分支
}
}
|