|
//STM32F10X軟加密方法及實(shí)例代碼
#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,則程序編譯結(jié)果里會有0X1FFFF7E8,這樣破解人員會很輕松
//的找到這個(gè)內(nèi)容,然后非常容易進(jìn)行修改,去掉軟加密
u32IdAddress = (uint32*)0x1ffff7e8;
#else
//千萬別顯式的讀取ID,即要把0X1FFFF7E8運(yùn)算成隱式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
//這樣,別人就算破解出了你的程序,也查找不到0X1FFFF7E8,這樣就不能輕易的軟解密,這樣處理后如果要軟解密,
//一定要反匯編出來進(jìn)行復(fù)雜逆向分析,難度極大,代價(jià)極高,很難搞定軟加密了,達(dá)到保護(hù)產(chǎn)品的目的。
gU32IdAdressVar = 0x455873a;
gU32IdAdressVar <<= 2;//0x11561CE8
u32IdAddress = (uint32*)(gU32IdAdressVar + 0xEA9DB00);//0x1ffff7e8
#endif
//讀取單片機(jī)的ID,并進(jìn)行運(yùn)算,具體算法可以自己定,這里只用到簡單的異或及和運(yùn)算
u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
//進(jìn)行對比,如果運(yùn)算結(jié)果與FLASH保存的結(jié)果不一樣,說明非法,運(yùn)行錯(cuò)誤代碼
if(u32EorRslt != *((uint32*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
{
while(1);//異或算法結(jié)果不正確,進(jìn)行錯(cuò)誤分支
}
if(u32AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
{
while(1);//和算法結(jié)果不正確,進(jìn)行錯(cuò)誤分支
}
} |
|