找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm8 唯一ID號加密方法.思路

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77367 發(fā)表于 2015-4-19 02:16 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
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號生成其他數(shù)據(jù)。不一定就是12字節(jié)的!并保存在內(nèi)部EEPROM。在這個(gè)模塊準(zhǔn)備2個(gè)函數(shù).一個(gè)用于加密.一個(gè)用于解密

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字節(jié)生成12*N個(gè)字節(jié)
    {
         *pEE++=第1種算法,商業(yè)原因.我的算法就不公開了.大家可以準(zhǔn)備一個(gè)數(shù)組查表
        while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);  
         *pEE++=第2種算法,商業(yè)原因.我的算法就不公開了。大家可以準(zhǔn)備一個(gè)數(shù)組查表
        while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);  
         。。。。
        第N種算法
    }              
}
//解密函數(shù)
unsigned char StmCheckUniqueID(unsigned char Addr)
3.主函數(shù)里面設(shè)置一個(gè)時(shí)間最好設(shè)置長一點(diǎn)。半個(gè)鐘或其他,讓人家難跟蹤
    while(1)
     {
         其他任務(wù)...............
         /////////////////////////////////////////////////////////////////////////
          if((Flag&FLAG_CHECK_ID)==FLAG_CHECK_ID)
         {
             Flag&=~FLAG_CHECK_ID;
             if(StmCheckUniqueID(UniqueIDAddress)==1){IsIDCorrect=0x01;}//正確寫入
            else{IsIDCorrect=0x00;}//錯(cuò)誤寫入      
         }        
         /////////////////////////////////////////////////////////////////////////
               其他任務(wù)...............
     }
         /////////////////////////////////////////////////////////////////////////


總結(jié):
這樣做還是能被破解的。但對方已經(jīng)很難跟蹤了.
如果破解者對芯片熟悉.他會根據(jù)ID號的地址!----畢竟芯片ID號的地址是固定的.找到對應(yīng)的調(diào)用程序.加密時(shí)用到芯片ID號的地址。解密時(shí)也有用到芯片ID號的地址
所以只有對方熟.是能很快跟蹤到加密/解密程序.而在解密程序入口就return出去!


這種方法已經(jīng)很實(shí)用了.畢竟不是太專業(yè)的很難破.

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

使用道具 舉報(bào)

沙發(fā)
ID:38212 發(fā)表于 2015-4-21 21:00 | 只看該作者
回復(fù)

使用道具 舉報(bào)

板凳
ID:187690 發(fā)表于 2017-4-9 13:53 | 只看該作者
老師傅:你好!我看到STM8S解密用的程序是怎么用的能不能詳說一下,拜托!
回復(fù)

使用道具 舉報(bào)

地板
ID:187690 發(fā)表于 2017-4-9 13:56 | 只看該作者
老師傅:你好!
    我想請教!怎么解密STM8S的方法。
回復(fù)

使用道具 舉報(bào)

5#
ID:187690 發(fā)表于 2017-6-29 18:01 | 只看該作者
老師傅:你好!我看到STM8S解密用的程序是怎么用的能不能詳說一下,拜托!
回復(fù)

使用道具 舉報(bào)

6#
ID:187690 發(fā)表于 2017-6-29 18:03 | 只看該作者
我們學(xué)習(xí)加密!

怎么解呢?
回復(fù)

使用道具 舉報(bào)

7#
ID:187690 發(fā)表于 2017-7-2 17:08 | 只看該作者
群主怎么沒有人應(yīng)呢?
回復(fù)

使用道具 舉報(bào)

8#
ID:59768 發(fā)表于 2017-7-22 11:12 | 只看該作者
學(xué)習(xí)了!思路不錯(cuò)``
回復(fù)

使用道具 舉報(bào)

9#
ID:608322 發(fā)表于 2019-9-6 10:06 | 只看該作者
//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ò)誤分支
        }
}
回復(fù)

使用道具 舉報(bào)

10#
ID:608322 發(fā)表于 2019-9-6 10:08 | 只看該作者
樓主的程序,需要把4865這個(gè)id地址通過計(jì)算得出,不要直接在程序里面出現(xiàn)
回復(fù)

使用道具 舉報(bào)

11#
ID:608322 發(fā)表于 2021-1-4 09:27 | 只看該作者
1,如果板子上有外部存儲器,可以先編寫一個(gè)程序,利用算法把id計(jì)算得到一些值存入外部存儲器,然后再燒寫真正的程序,真正的程序去校驗(yàn)外部存儲器的數(shù)據(jù)是否合法即可

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

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

4,讀出的id通過一定算法,例如異或加上一個(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對程序區(qū)進(jìn)行校驗(yàn),防止改程序
回復(fù)

使用道具 舉報(bào)

12#
ID:608322 發(fā)表于 2021-10-20 17:12 | 只看該作者

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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