找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5421|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

你辛苦做出來(lái)的id軟件加密就這么輕松被改了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
開發(fā)人員一般設(shè)計(jì)軟件加密方法:讀id---復(fù)雜算法計(jì)算---對(duì)比之前存儲(chǔ)的對(duì)應(yīng)數(shù)據(jù)(與id相關(guān))---判斷芯片是否合法。
由于讀id時(shí)很多人直接用id起始地址,例如0x1FFFF7E8,破解的人只要把這個(gè)數(shù)據(jù)改成0x8000020,并且0x8000020程序區(qū)域填上
母片的id,不管你的算法有多復(fù)雜,這時(shí)你的程序就被破解了,改這種軟件加密一分鐘就改好了。所以千萬(wàn)注意程序里面不要
出現(xiàn)id起始地址。
用以下方法相對(duì)比較難了
//STM32F10X軟加密方法及實(shí)例代碼

#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
volatile uint32 gU32IdAdressVar;//這里一定要定義此變量,否則會(huì)被優(yōu)化器優(yōu)化掉
void Stm32F10xEncryptDemo(void)
{
        uint32 *u32IdAddress;
  uint32 u32EorRslt, u32AddRslt;
        #IF 0
        //如果直接賦值0X1FFFF7E8,則程序編譯結(jié)果里會(huì)有0X1FFFF7E8,這樣破解人員會(huì)很輕松
        //的找到這個(gè)內(nèi)容,然后非常容易進(jìn)行修改,去掉軟加密
        u32IdAddress = (uint32*)0x1ffff7e8;
        #else
        //千萬(wàn)別顯式的讀取ID,即要把0X1FFFF7E8運(yùn)算成隱式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
        //這樣,別人就算破解出了你的程序,也查找不到0X1FFFF7E8,這樣就不能輕易的軟解密,這樣處理后如果要軟解密,
        //一定要反匯編出來(lái)進(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)算,具體算法可以自己定,這里只用到簡(jiǎn)單的異或及和運(yùn)算
        u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
        u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
        //進(jìn)行對(duì)比,如果運(yùn)算結(jié)果與FLASH保存的結(jié)果不一樣,說(shuō)明非法,運(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ò)誤分支
        }
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:608322 發(fā)表于 2019-11-8 12:47 | 只看該作者
同樣象stm8s103讀id時(shí),就不要出現(xiàn)0x4865~0x4871
回復(fù)

使用道具 舉報(bào)

板凳
ID:608322 發(fā)表于 2020-5-19 19:54 | 只看該作者
三、利用id做軟件加密
1,如果板子上有外部存儲(chǔ)器,可以先編寫一個(gè)程序,利用算法把id計(jì)算得到一些值存入外部存儲(chǔ)器,然后再燒寫真正的程序,真正的程序去校驗(yàn)外部存儲(chǔ)器的數(shù)據(jù)是否合法即可

2,利用板子上按鍵組合,或是上電按住某些鍵,程序在這個(gè)時(shí)候利用算法把id計(jì)算得到一些值存入程序區(qū)(stm8為EE區(qū)),程序運(yùn)行時(shí)去驗(yàn)證程序區(qū)數(shù)據(jù)是否正確

3,軒微編程器有軟件加密的功能,編程器會(huì)讀芯片id,根據(jù)算法直接改寫緩沖區(qū),達(dá)到軟件加密的作用

4,讀出的id通過(guò)一定算法,例如異或加上一個(gè)數(shù),得到的數(shù)據(jù)存入flash(只運(yùn)行一次,運(yùn)行后標(biāo)志位也存入flash),下次讀到這個(gè)標(biāo)志位,就不運(yùn)行這個(gè)程序。

四、做軟件加密時(shí)注意
1,不要在程序中直接出現(xiàn)id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0   STM8: 0x4865~0x4870
2, 利用校驗(yàn)和或是crc對(duì)程序區(qū)進(jìn)行校驗(yàn),防止改程序
回復(fù)

使用道具 舉報(bào)

地板
ID:608322 發(fā)表于 2021-10-20 15:40 | 只看該作者

回復(fù)

使用道具 舉報(bào)

5#
ID:756400 發(fā)表于 2021-10-23 22:19 | 只看該作者
實(shí)用,樓主辛苦了。
回復(fù)

使用道具 舉報(bào)

6#
ID:228494 發(fā)表于 2021-10-25 11:08 | 只看該作者
雖然不懂,還是來(lái)學(xué)習(xí)1下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表