2008年,我的一個(gè)朋友因?yàn)樗麄兊目刂浦靼灞槐I抄了,損失相當(dāng)巨大,他找到了我尋求加密措施,由于他們采用的是ATmega128單片機(jī),盡管他們已經(jīng)采取了加密,但還是被破解了,為此我搜索了網(wǎng)絡(luò)上的大部分資料,都沒有一個(gè)具體有效的方案。經(jīng)過本人研究后,在這里介紹一種有效的MRC多重加密技術(shù),已經(jīng)用到了實(shí)際產(chǎn)品中,可以說這種加密技術(shù)是非常有效的。
本文引用地址:http://m.butianyuan.cn/article/201611/320750.htm1. 單片機(jī)程序的破解過程:
目前對(duì)于AVR單片機(jī)來講,本身有加密熔絲位,一旦熔絲被燒寫程序就不能讀出了。但這種加密技術(shù)可以通過芯片揭蓋侵入式破解,大多數(shù)破解公司都掌握了這種技術(shù),破解費(fèi)僅1000元左右。
對(duì)于這種情況已經(jīng)不可避免,如果源碼沒有其他加密措施的話,把反匯編出來的程序編譯一下,換到原電路板上即可運(yùn)行了。
那么如何對(duì)源碼做加密處理呢?
事實(shí)上,不管你怎么處理,都可以分析源碼,找出你的關(guān)鍵所在,并修改匯編出來的程序來破解。
而我們要做的是,將加密部分盡可能隱藏,擾亂,使得破解者只能逐一分析來破解,這樣他不但要全部了解產(chǎn)品的工作特點(diǎn),功能,還要了解內(nèi)部全部的硬件設(shè)計(jì),以及芯片的工作原理。對(duì)于一些特殊算法他可能永遠(yuǎn)也搞不明白,這樣使得破解的成本遠(yuǎn)遠(yuǎn)大于重新設(shè)計(jì)的成本。
凡是從事盜版生產(chǎn)的單位基本沒有開發(fā)能力,而破解者只是一些二三流工程師,真正的一流工程師對(duì)破解都不屑一顧。
2. MRC加密技術(shù):
為啥叫MRC機(jī)密技術(shù),因?yàn)檫@是香港MRC公司采用的實(shí)用加密技術(shù),這種技術(shù)不需要增加硬件成本,主要通過以下幾個(gè)技術(shù)實(shí)現(xiàn):
- 利用AVR的校準(zhǔn)值,做身份認(rèn)證,100片里面最多10片的校準(zhǔn)值相同。
1)在頭文件里定義:
#define OSCID 0XAF //校準(zhǔn)數(shù)值,必須設(shè)置成與MCU一致
2)在特殊程序(中斷程序,特殊算法)里
unsigned char *p;
p=(unsigned char *)0x68; //賦值,芯片為mega88,OSCID寄存器=0X66,不直接寫0X66,知道為什么嗎?
…... //賦值和恢復(fù)語句,中間有很多其他語句
p--;p--; //恢復(fù),
if ((*p-8)==OSCID-8) //判斷,為啥這里也不直接寫為OSCID?
{
//放置正確的處理程序
}
else
{
//故意寫錯(cuò)計(jì)算的程序
}
類似上述這樣的程序可以放在中斷處理程序,CRC算法,糾錯(cuò)程序,編解碼程序,快速開方程序等關(guān)鍵程序里,另外長時(shí)間(幾天,幾個(gè)月)才運(yùn)行一次的程序里也要放置來對(duì)付仿真器的單步跟蹤。最好每個(gè)程序里的處理都不一樣,不要寫成子程序。
- 利用隨機(jī)數(shù)產(chǎn)生代碼長度浮動(dòng)。
#if (OSCID)%3==0 //這里利用校準(zhǔn)值來擾動(dòng),也可利用編譯時(shí)的時(shí)間來擾動(dòng)。
a++; //也可能是個(gè)函數(shù)
#endif
#if (OSCID)%3==1
a++;
b++;
#endif
#if (OSCID)%3==2
a++;
b++;
c++;
#endif
把類似這樣程序的條件編譯語句放入關(guān)鍵程序,使程序代碼浮動(dòng),避免解密者對(duì)比兩樣片的16進(jìn)制代碼來尋找不同的位置。
- 利用隨機(jī)數(shù)使靜態(tài)變量浮動(dòng)。
每個(gè)芯片的變量地址在RAM或EEPROM中都是浮動(dòng)的。
unsigned int IR_buff[100+(OSCID)%7]; //不同的芯片緩沖區(qū)長度不同
…… //其他變量定義在下面
由于編譯后,產(chǎn)生的代碼差異很大,這個(gè)措施可以對(duì)付反匯編代碼比對(duì)來尋找有差別的位置。
利用AVR的校準(zhǔn)值與特殊器件內(nèi)部的寄存器綁定。
這里用CC1101無線收發(fā)器來舉例
rfSettings.PKTCTRL1= 0x27^ (OSCID^0X55); //
halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1^(OSCID^0X55)); //寫到寄存器
……
#define CCxxx0_SRX 0x34-OSCID
halSpiStrobe(CCxxx0_SRX+OSCID); //進(jìn)入接收狀態(tài)
3. 安全性評(píng)估:
如果破解者能讀出多個(gè)樣片的匯編程序。他無法通過比對(duì)16進(jìn)制或匯編后的代碼來獲得這些樣片的差異。
他只有仔細(xì)閱讀匯編代碼來解除加密的代碼,對(duì)于一些特殊算法,他要搞清楚原理才能修改,否則可能埋下極大故障隱患。對(duì)于單步追蹤,由于長時(shí)間程序并沒觸發(fā),因此不能保證都能追蹤得到,有些程序需要特定的條件才能激活,因此也不能保證一一追蹤得到,這樣要徹底破解,解密者只能在全部弄清楚設(shè)備的功能后,一一解除,一一燒錄,一一測試。這樣的工作量可能相當(dāng)?shù)拇蟆?br /> 對(duì)于類似CC1101這樣的器件,寄存器既多又復(fù)雜,稍微錯(cuò)一個(gè)地方就可能引起莫名其妙的故障。
4. 結(jié)語:
本文提出的MRC加密技術(shù)不是不能破解,而是破解的代價(jià)很大,即使破解后用于產(chǎn)品中隱患也很大,有可能加密程序里含有自毀程序,在一定時(shí)間后才能發(fā)作,到時(shí)可能導(dǎo)致無法想象的損失,因此用戶不要貪小便宜,應(yīng)該購買具有自主知識(shí)產(chǎn)權(quán)的產(chǎn)品。
通過多重MRC加密,可以大大打擊盜版者和破解者的信心,達(dá)到為自主創(chuàng)新產(chǎn)品保駕護(hù)航的目的。
評(píng)論