單片機 防破解 技術論述

單片機防破解,近幾年專門針對於產品設計,最終在產品程序加密這一塊,發現是一個非常實際的問題,公司研發產品幾十萬,競爭對手花幾萬破解複製你的產品,而其他競爭對手能夠使用更低的成本複製已經被破解的產品,讓你的產品在短短1個月內成爲爛大街的貨;在這種市場風氣下非常阻礙具備創新能力公司的發展;因此在3個月各種詢問以及溝通過程中,從如何破解單片機系統到如何防止破解進行說明,希望能夠幫助具有相同需求的朋友;在此利用市場上破解率最高的STM32單片機來說明。
一、破解單片機系統,分爲兩步:
1、從單片機中將二進制文件讀出;雖然單片機有各種所謂的讀/寫保護機制;防止bin文件被讀出,讀出的方法起始也很簡單,將單片機的晶元漏出,在晶元上跳線,將讀保護從硬件上跳過,再用設備讀取Bin文件,(不同的單片機這一塊的難度也有不同,例如目前絕大部分的STM32F1系列單片機晶元破解技術已經成熟,而STM32F4系列只有少部分的系列可以進行此破解,並不是不能晶元操作只是市場佔有率比較低破解需求小,破解行業還不願意花費大量成本來拓展這一塊);本質上這些都是成本的問題,願意花鉅額破解也是可以的。
2、二進制文件破解,能夠獨立運行;說明白一點就是將Bin文件中和單片機標誌相關的或者和外部硬件設備相關而導致Bin文件不能通用(就是能夠直接複製使用)的部分進行屏蔽,能夠讓Bin文件獨立的在任何一個相同的平臺上運行;這個部分屬於軟件破解,破解人員拿到bin文件後會將其進行反彙編成爲彙編代碼,直接使用匯編代碼在在破解的平臺上仿真運行觀察文件執行流程(這點需要消耗大量的人力和時間);軟件加密大體分爲兩部分,密文加密、硬件加密;密文加密一般都是將單片機內部的標誌性密文,例如STM32的UID或者相同單片機具備不同硬件數據的部分在軟件層面上進行綁定,最最簡單的就是STM32在上電的時候讀取UID比對,如果錯誤就怎麼處理等,破解密文加密實際上就是通過仿真跟蹤的手段,找到密文加密地點,改寫此段的彙編代碼,通過多種方式繞過密文對比,或者更改密文對比結果,從而屏蔽密文對比對程序的作用,目前用的最多的就是轉移讀取密文的位置,破解者將相同的UID密文數據寫在FLASH內部的某個地方(也就是Bin文件的某一個地址),並且在STM32讀取UID時不讀取硬件UID而是讀取破解者存在在FLASH內部的UID,將程序矇騙過去,破解完密文加密後,此時的Bin文件就和單片機內部的密文一點關係都沒有,讀密文的時候都是程序自己讀自己bin的某一個數據和硬件平臺沒有關係了,如果沒有硬件加密此時就可以在任意相同的平臺上運行了;硬件加密一般用的比較多的就是加密芯片,這種方式加密方法會強一些,破解方法一般會建立在密文加密之後,硬件解密也是兩種方法:第一就是在單片機內部找到和外部加密芯片通信的程序觀察發出哪些數據和接收哪些數據,同時在外部硬件設備上通過邏輯分析儀進行同時觀察,記錄結果,由於通過密文解密之後,設備已經成爲通用設備,並且密文也是一個假的固定密文,通過這個固定密文算出的加密運算符也是固定的,從設備發給加密芯片的加密碼也就是固定的,加密芯片通過固定的加密算法返回的密文也是固定的,所以這個時候程序內部可以將這個讀取的部分跳過,或者在外部仿製一個固定的通信過程,取代加密芯片即可,這一步做完硬件加密就完事了。
實際上破解加密就是把單片機有特異性的部分全部屏蔽掉,從實際上說在不差錢和時間的情況下沒有破解不了的系統;作爲加密者能做的就是極大的增加其解密的成本和週期,拖住對方;


加密方法:

1、大量使用內聯驗證函數;
驗證函數是用來檢測本系統是否被破解的功能函數,內部應該包含加密的正反解算法,在此特別說明一定要用內聯函數 inline,普通函數作爲一個反覆調用的模塊編譯時被存儲在bin文件的固定地點,每次調用時會跳轉到這個地點運行,如果驗證函數使用普通函數,那麼破解人員只用搞定存儲驗證函數在bin文件的這個區域就萬事大吉了,那麼系統中所有驗證功能都被破解了;而內聯函數在系統編譯時會將函數複製在調用的部分成爲一個分身,是一塊獨立部分,如果系統在不同的地方調用了10次內聯函數,那麼就有10個功能相同的函數在bin內,互不影響,這樣可以有效的增加破解的時間成本,狡兔N窟;驗證函數最好放在一些不經常運行到的程序中,在程序體積與性能允許的情況下,×××;
2、讀取密文絕對不使用直接尋址;
由於Bin文件被反彙編之後成爲彙編代碼,如果只直接尋址(例如尋址到UID密文0X11111111地址上的數據)那麼被尋址的地址是直接在彙編代碼上可以看到的,直接通過查找功能就可以鎖定讀取密文的位置,所以一定要用間接尋址,例如我們要尋址0x11111111,可以制定一個32位數據指針,先讓其等於0x11110000,再加上0x00001111,最後等於0x11111111再進行尋址,這樣的方法破解人員只能在仿真時嚴格跟蹤R0-R3寄存器,才能發現在哪讀取了密文,增加其破解時間成本和難度;
3、儘量增加外部功能硬件的密文數量,獲取密文後進行算法運算增加其複雜性;此處實際上是增加其餘的密文,避免破解人員觀察加密程序讀取UID的代碼位置,防止被鎖定;
4、全文加密,針對於單片機系統的程序區code進行全文計算算出MD5,計算出MD5存儲到某一個位置,如果bin文件中程序區段被修改,那麼在檢測函數針對全文進行二次MD5驗證是得到的密文會和之前不同,這種方法可以查看出代碼區是否被動過手腳;
5、程序中發現被破解或者動過手腳不要卡死,或者不要有任何實時的處決動作,而是儘可能的延後處決;這個很重要,因爲在破解人員自認爲破解成功後,會自行測試設備是否能夠正常運行,如果防破解此時發現被破解直接自毀程序或者卡死,那麼就是告訴破解人員還有地方沒有破解完成,需要繼續,這個時候需要用戶做的就是設置一個延遲處決的代碼,當發現系統被動過手腳,先要按兵不動,程序能夠正常運行,當系統重新啓動500次或者通電時間超過1000個小時,系統再自毀,增加足夠的測試周期,極大地延緩測試頻率,拖慢腳步,如果此時被誤認爲已經破解成功,並量產產品,往往會對破解用戶造成足夠大的經濟損失;更絕的是在自毀之後再FLASH中寫入當前代碼的原作者以及公司,通過bin讀取出提取信息,可以告發對方侵權!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章