2010年5月7日 星期五

USB軟體狗的設計及反破解技術

資料源自: 香港IT網
地址: http://www.hkitn.com/article.php/4677

如有侵犯智慧財產權,請告知。

USB軟體狗的設計及反破解技術

摘要:介紹了軟體狗技術的發展,提出了一種改進的低成本USB軟體狗的設計方案,分析了常見的加解密技術,並據此提出了一系列反破解措施。
關鍵字: USB 軟體狗 加解密技術 反破解

1 軟體狗技術

近年來,軟體狗技術在保護軟體發展者利益、防止軟體盜版方面起了很大作用。軟體狗技術屬於硬加密技術,它具有加密強度大、可靠性高等特點,已廣泛應用於電腦軟體保護。軟體狗技術的發展經歷了多次更新換代。第一代軟體狗通過短接並行口的某兩根線,或者再加上一些電阻、電容、二極體等實現;第二代軟體狗採用邏輯門電路跨接在並行口上,並採取適當的措施儘量避免軟體狗和印表機之間的相互干擾;第三代軟體狗的核心晶片是EEPROM,主機通過並行口直接讀寫EEPROM以實現對加密資訊的存取;第四代軟體狗以微控制器和EEPROM為核心器件,又稱微狗,它具有一定的智慧,應用靈活性和抗破解能力都得到了很大提高。

傳統的軟體狗通過在並行口上附加一定的電路實現,而並行口本身的特點限制了傳統軟體狗技術的進一步發展。由於並行口本身沒有電源線,所以傳統的並行口軟體狗都是通過各種"偷電"技術從資料線或控制線獲得軟體狗電路所需的電源,其電路必須選用規模不大的低功耗元器件。在負載能力很低的並行口上,並行口軟體狗難以保證正常工作。由於並行口是為連接單個設備設計的,在連接多個設備時很難避免衝突,傳統的並行口軟體狗必須仔細考慮與印表機之間的相容性問題。特別是對於一些非標準介面的並行口設備,就更難解決衝突問題。這些都使並行口軟體狗技術的發展受到了很大限制。

USB是在1994年底由Compaq、IBM、Microsoft等多家公司聯合提出的一種連接外部設備的新型的通用串列介面技術,它具有真正的即插即用和熱插拔功能,理論上可支援多達127個不同外設的同時連接。USB是一種先進的很有前途的介面標準,隨著USB介面器件的發展,使用USB介面的設備會越來越多。USB介面本身具有電源線,可為外設提供穩定可靠的工作電源,從而對USB軟體狗所用元器件的工作電壓、功耗等的要求大大降低,軟體狗的工作條件得到很大改善,更容易實現複雜、靈活的設計和電路的微型化。由於USB是為連接多個設備而設計的,有著嚴格的規範,從介面本身避免了設備間的衝突,只要遵循USB介面規範,USB軟體狗不但不會對別的USB設備產生影響,也不會受到別的USB設備的影響。與並行口相比,USB介面更適合於軟體狗技術。

2 USB軟體狗的硬體

在本設計中,所使用的微控制器是CY7C63100A/CY7C63101A。它是CYPRESS公司生產的8位元精簡指令集(RISC)的OTP型微控制器。它集成有1.5Mbps的USB串列介面引擎(SIE)(即USB收發器),具有128位元組的片內RAM、2/4K位元組的程式存儲空間,片內還具有一個自由執行的8位計時器、一個看門狗計時器和內部上電重定電路,它的指令集專門為開發USB應用進行了優化。該控制器擁有兩個輸入輸出埠、16根通用I/O線,且每根線均可作為中斷源。埠1的所有引腳都帶有可編程驅動器,可以直接驅動LED發光。該控制器的操作電壓為4.0~5.25V,它需要6MHz的外部陶瓷共振器,片內操作時鐘為12MHz。

CY7C63100A/CY7C63101A是低速USB外設的低成本解決方案,符合USB1.1規範,支援1個設備位址和2個端點(一個控制端點和一個資料端點)。

本設計中所使用的記憶體是24C02,它是帶有硬體防寫功能的串列EEPROM,其介面相容I2C匯流排規範,通過一對串列時鐘、資料線對片內存儲單元進行讀寫。24C02的片內記憶體容量為2K位元(或256位元組)。
本文設計的USB軟體狗的硬體電路圖如圖1所示。其核心器件是微控制器(可根據需要選用CY7C63100A或CY7C63101A,其區別為程式記憶體的空間不同,分別為2K位元組和4K位元組)和串列EEPROM(24C02),各元件的具體參數如圖1所示。
微控制器的第15(D-)、16(D+)腳分別連接USB連接器的第2(D-)、3(D+)腳,提供微控制器和主機之間資訊交換的電信號通道,其中第15引腳(D-)所接的7.5kΩ的上拉電阻是為了滿足USB規範的要求。微控制器通過USB介面與主機進行資訊交換。

微控制器的第20腳(P1.1)經過10KΩ的上拉電阻連接24C02的第7腳(WP,防寫),控制24C02的寫操作使能。當WP為高電平(Vcc)時,只能讀取24c02的內容而不能對其進行寫入;當WP為低電平(Vss)時,則可以進行讀、寫操作。設定防寫功能,可以防止記憶體內容被意外改寫。微控制器的第19腳(P1.3)連接24c02的第6腳(SCL,串列時鐘),為控制24C02的讀寫操作提供時鐘;微控制器的第18腳(P1.5)經過10KΩ的上拉電阻接24C02的第5腳(SDA,串列資料、位址),作為讀寫24C02的資料、位址信號線。微控制器通過這三根信號線完成對24C02的讀寫操作,對24C02的讀寫控制滿足I2C匯流排規範。

3 USB軟體狗的軟體

USB軟體狗的軟體包括主機軟體和微控制器中的軟體(固件)。主機軟體和固件相配合,協同完成主機與USB軟體狗間的資訊交換。其中,微控制器中的固件主要完成與USB主機的通信(包括參與USB匯流排設備枚舉、USB軟體狗的自身標識等)、對24C02的讀寫操作、與主機程式相配合實現和主機程式間的資料交換等任務。微控制器程式的簡化軟體框圖如圖2所示。
3.1 USB設備枚舉
USB軟體狗插入主機後,主機發現USB軟體狗,在執行USB重定操作後,主機使用預設位址(位址0)向USB軟體狗發出設備描述符請求,USB軟體狗向主機返回自己的設備描述符作為回應;接收到要求的設備描述符後,主機為新發現的USB軟體狗指定一個新的USB位址;然後,主機使用新的USB位址重新向USB軟體狗發送一個設備描述符請求,USB軟體狗向主機返回自己的設備描述符作為回應。主機向USB軟體狗發送配置描述符請求,USB軟體狗從程式存儲空間中取出相應的描述符並返回給主機。當主機接收到所有的描述符後,USB設備枚舉過程即告結束。至此,主機已完全瞭解USB軟體狗的資源要求、端點類型和性能等特性。

3.2 USB軟體狗和主機間的資料交換
由於CY7C63100A/CY7C63101A只提供兩個USB端點:端點0和端點1。端點1只能發送資料而不能接收資料,所以不適合USB軟體狗的互動式資料交換的要求,故只有使用端點0與主機進行資料交換。

USB共支援四種類型的傳輸:等時傳輸、中斷傳輸、控制傳輸和批量傳輸。要求恒定的連續傳輸速率的即時應用程式一般都採用等時傳輸方式。等時傳輸要求及時地提供資料,且對資料的正確性要求不高而對時間極為敏感,所以在等時傳輸中,資料的有效性不能保證。在傳送資料發生錯誤時,USB並不處理這些錯誤,而是繼續傳送新的資料。中斷傳輸方式總是用於對設備的查詢,以確定設備是否有資料需要傳輸。因此中斷傳輸的方向總是從USB設備到主機,傳送的資料量很小。但這些資料需要及時處理,以達到即時效果。控制傳輸提供了一種方法來配置USB設備,並對它操作的某些方面進行控制。每個設備都必須實現一個缺省的控制端點(端點0),控制端點用來配置設備、控制設備狀態以及設備操作的其他方面,包括設備控制指令、設備狀態查詢及確認命令。批量傳輸適用於對資料的正確性要求很高、而對資料傳輸速率沒有特殊要求的設備。

除缺省的針對端點0的控制傳輸外,對於其他三種傳輸方式,端點的傳輸方式一旦確定,則該端點在此配置下只能進行某一特定方向上的資料傳輸,而不可以在通信過程中改變傳輸方向,除非重新選擇配置。對於USB軟體狗應用,由於USB軟體狗與主機間要不斷地相互進行資料交換,且每次所需要交換的資料量不大,故選用控制傳輸方式。

控制傳輸至少由兩個階段組成,也有可能是三個階段。建立階段--控制傳輸總是從建立階段開始,在本階段主機向目標設備傳送資訊,定義對USB設備的請求類型(例如讀設備描述符)。資料階段--這個階段僅僅是因要求資料傳輸的請求定義的。例如,在資料階段,讀描述符的請求把描述符的內容發送給主機。狀態階段--這個階段用來報告所請求的操作的結果。控制傳輸從建立階段開始,它包含8位元組的資訊包。這個8位元組的資訊包定義了在控制傳輸的資料階段所傳輸的資料數量。在資料階段,資訊包的最大資料載荷限制為64位元組。對於本設計,由於CY7C63100A/CY7C63101A的端點0只提供了8位元組的FIFO緩衝區,故最大資訊包只能取8位元組。如果有更多的資料需要傳輸,可以分多次完成。控制傳輸參與錯誤檢測和恢復機制,努力提供一種最大限度的恢復,以保證資料的完整性。

USB設備枚舉過程結束後,並沒有立即開始工作,必須由主機根據在枚舉階段所獲得的資訊對USB設備進行配置。配置完成後,USB設備才進入工作狀態。此後,主機就可以與USB設備進行資料交換了。

主機與USB軟體狗間的資料交換過程均由主機方發起,每一次資料交換都由完整的控制傳輸完成。在控制傳輸的建立階段,主機向USB軟體狗發送8位元組的資訊包,通過用戶自定義的請求類型欄位規定USB軟體狗對後續資料應進行的處理,或要求USB軟體狗向主機返回特定的資訊。在資料階段,USB軟體狗接收指定資料或按要求向主機發送相應資料。控制傳輸的狀態階段指示本次資料傳輸的結果狀態,以確定本次交互是否正確完成。

3.3 讀寫24C02
為防止24C02的內容意外改變(例如,由於強干擾或不規範操作等),在不進行寫操作時,應使WP引腳保持為高電平,即P1.1保持為高電平。在進行寫操作時使WP變低,並一直保持到寫操作完成。寫操作完成後立即恢復WP為高電平。對24C02具體的讀寫操作符合I2C匯流排規範,很多相關書籍都有具體的實例程式,本文不再贅述。
為安全起見,記憶體24C02中的資料應採用加密後的形式存放。
4 軟體狗反破解技術

針對軟體狗的破解方法主要有兩種:硬體方法和軟體方法。
軟體狗的硬體破解方法,主要是仿製軟體狗的硬體電路。這個方法對付早期的軟體狗比較有效。當微狗出現後,由於很多微控制器本身都提供了程式碼保護功能,這使得仿製軟體狗特別是獲取固件變得越來越困難,這種方法現在已經很少使用。還有一種硬體破解方法是使用邏輯分析儀或軟體攔截I/O,記錄下軟體狗與主機軟體間所傳送的資料並進行分析以找出規律。這對於一些簡單的軟體狗比較有效,而對於演算法眾多、交互資料量很大的軟體狗,這種方法所帶來的繁雜性可想而知。USB通信規程本身相當複雜,這也大大提高了對USB軟體狗進行資料攔截的破解方法的難度。

現在,更加常用的軟體狗破解方法主要集中在軟體方面,並有軟體類比、跟蹤分析等方法。

軟體類比,就是先啟動I/O攔截軟體,然後在有軟體狗的情況下啟動受保護軟體,並對受保護軟體的每一個功能都進行試執行;同時,後臺的I/O攔截軟體記錄下受保護軟體與軟體狗之間交互的資料供以後使用。記錄完成後,只需在啟動受保護軟體前先啟動類比軟體,就可以使受保護軟體在沒有軟體狗的情況下也可以正常執行。在受保護軟體執行過程中,當它企圖與軟體狗進行通信時,後臺的類比軟體攔截到該通信請求,根據先前記錄下的資料對真實軟體狗進行仿真,使受保護軟體誤認為軟體狗確實存在。對於軟體狗和受保護軟體間通信資料不變的情形,軟體類比方法十分有效;但如果通信資料中含有隨機性的參數(例如,系統的當前時間),那麼軟體狗和受保護軟體間所交互的資料就各不相同,在這種情況下,軟體類比方法就顯得無能為力了。例如,主機軟體可以取系統當前時間送給軟體狗,軟體狗使用一定的規則對其進行變換,並把結果送回主機軟體,主機軟體用同樣的規則對上述時間值進行同樣的變換,檢查變換後的結果是否一致。這裏需要有好的變換演算法,使變換結果對參數的各個部分的改變很敏感且程度相似。或者,軟體狗和受保護軟體間遵循一定的通信協定(當然是不公開的),所傳輸的資料中含有大量隨機的無用資訊,而根據該通信協定,軟體狗和受保護軟體都可以從中提取出有效的資訊。

在各種軟體狗的軟體破解方法中,以跟蹤分析方法的威力最為強大,具體的有靜態分析和動態跟蹤等方法。

靜態分析方法是用一些靜態反彙編、反編譯工具對受保護軟體進行逆向分析,以求找出訪問軟體狗的代碼並進行相應的修改。如果預先對受保護軟體的程式碼採用一定的變換(可以取軟體狗中的資料作為變換參數),在執行時再進行反變換動態生成將要執行的代碼,就可以有效地對抗靜態分析方法。還可以使用可執行檔壓縮工具對受保護軟體進行壓縮處理,或採用軟體加殼工具對其進行處理等,這些都可以有效地對付靜態分析法。另外,如果把主機軟體的內部函數調用與外殼加密相結合,則可進一步提高加密強度,即使軟體的外殼被破除,也仍然不能正常執行。

動態跟蹤破解法不僅可以用於軟體狗破解,還可以用來獲取一些軟體的註冊序列號,取消軟體的試用期限制、試用次數限制和解鎖試用版軟體等。這種方法是使用一些調試分析工具軟體(如DEBUG,SOFTICE等),控制受保護軟體的整個執行過程,找出它與軟體狗間交互部分的代碼並進行修改,以使其跳過對軟體狗的檢測或使檢測結果無效。該破解方法的使用者往往都具有相當豐富的破解經驗,對各種加解密方法瞭若指掌,這種方法也需要破解者付出很大的精力。對付這種暴力破解方法,主要就是設定跟蹤陷阱、使用大量各不相同的加密演算法並大量分散地設定對軟體狗的訪問、分離對軟體狗的檢測命令和對結果的判斷等,目的就是加大跟蹤分析的工作量、擾亂破解者的思路,大量消耗其體力和腦力,最終達到使其知難而退。動態跟蹤法的一種很有效的對策是限定主機軟體與軟體狗間交互操作執行的時間。如果軟體狗發現某個操作的執行時間超出設定的值(時間閘),則不作回應或送回錯誤的回應以迷惑破解者。這是由於對於同樣的操作,動態跟蹤所需要的執行時間常常要遠大于正常連續執行所需要的時間。在主機軟體中也可以設定時間閘,但與在軟體設中放置時間閘相比它更容易受到攻擊而失效,效果不太好。主機軟體也可以接管作業系統的調試函數或檢測某些調試軟體的存在,一旦發現自身在調試狀態下執行,就立即退出執行或使程式不正常執行以迷惑破解者;也可以通過縮短軟體升級的週期來使解密者疲于應付。靜態分析和動態跟蹤方法常常是相互配合使用的。與此對應,相應的反破解方法也是密切結合的。

軟體狗除用來進行軟體合法性檢驗外,還可以實現很多其他有用的功能。例如,可以在軟體安裝時把硬碟的產品序列號、CPU的產品序列號或者網卡的物理位址等硬體資訊寫入軟體狗,以後軟體在每次執行時都進行一致性檢測以判斷本次執行機器和安裝時所用機器是否為同一台機器,這樣就可以實現軟體對執行機器的限制。也可以利用軟體狗中的計時器和記憶體實現更加安全的軟體試用期和使用次數等功能。
從微狗開始,軟體狗就引入了微控制器技術,這大大提高了軟體狗技術實現的靈活性;USB介面為軟體狗提供了一個理想的工作環境,使軟體狗硬體所受的限制大大降低;現代密碼技術的發展也為軟體狗技術提供了更加廣闊的發展空間。作為USB技術和軟體狗技術相結合的產物,USB軟體狗技術無疑會具有十分強大的生命力。

沒有留言:

張貼留言