- #define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
- #define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
- volatile uint32 gU32IdAdressVar;//這里一定要定義此變量,否則會被優化器優化掉
- 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);//和算法結果不正確,進行錯誤分支
- }
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|