軟體狗[Dongles]的加密與解密技術

看雪資料發表於2002-05-27

此文章為本人蒐集資料的部分摘錄,帖出的目的在於方便大家交流,有些東西可能已經過時或不適應當前應用,希望您在閱讀時取其所長,補己所短。。。

   此篇文章將從基礎開始,從瞭解軟體狗的工作原理到手工製作軟體狗,到介紹軟體狗以前和現行的保護措施,其次是在現行基礎上如何改進使其保護功能更加完善,而後將從軟體和硬體方面詳細講解軟派和硬派高手是如何解密軟體狗的,全文中我將引用大量的例項,以便您能夠很好的理解。

   因為本人不是做計算機專業,所學知識非常淺薄,只能邊學習邊請教,並且只能利用業餘時間完善此文章,所以我會對其不斷修改[我不想每一篇文章都單獨發帖,這樣影響版面的美觀,相關的東西總結一下就好了],力求全面、詳細、完整。


軟體狗[Dongles]


1、認識軟體狗。[首先我對軟體狗作一簡單介紹,在後面我們將對各種軟體狗的加密和解密做詳細的講解。]    


   軟體狗是插在微機並行口上的一個軟體保護裝置,它包括主機檢查程式和金鑰(也稱加密盒)兩部分。主機檢查程式就是前面說的加密程式碼的一部分,加密盒是用來存放密碼的。一般來說,軟體狗插在並行口上,不會影響印表機的正常工作。常見的軟體狗加密盒外形,如兩個一公一母的D行25針聯結器倒接在一起,公頭(DB25/M)插在並行口上,母頭(DB25/F)可接印表機,相當於原來的並行口。整個軟體狗的硬體電路板就在這約5釐米見方的加密盒子裡。

   電路板上的公頭(DB25/F)之間的管腳是一一對應、直接相聯結的,以保證並行口的作用不變。儲存密碼或起訊號加密變換作用的器件及其它輔助元件就跨接在這25根線上面,應用程式以特定的方式跟他們溝通、核對。除了某些設計不良的情況之外,一般不會影響印表機的正常工作,印表機工作時也不會影響它們。

   為了防止程式被非法複製,所做的加密保護措施一般都包括兩部分。首先是要有儲存密碼資料的載體,即金鑰;其次是夾雜在應用程式中的主機檢查程式,即加密程式碼。金鑰應該能保證不易被解密、複製;如一般用磁碟做加密時,加密部分無法用一般的工具複製。另外,當檢查程式用特殊方法去讀密碼時,密碼應該能很容易地被讀出,而不致影響應用程式的正常執行。當發現密碼不對或金鑰不存在時,就讓主機掛起、重新起動或採用被的措施。


軟體狗經歷的“時代”

   軟體狗的發展經歷了好幾代,至2001年初就已發展到了第四代。

   第一代是儲存器型的加密鎖。這是最有歷史的加密鎖,內部只有儲存體,廠商只能對鎖進行讀、寫。軟體狗起訊號加密變換作用的器件,最多隻簡單採用一些電阻、二極體等,檢查方法也比較簡單,很容易被人解密.常見的有原金天地的“軟體狗”、深思洛克的Keypro型、Rainbow的Cplus等。這種鎖的主要特點是廠商可以預先把自己的保密資料設定到鎖內,然後在軟體執行時隨機讀取,這樣防止瞭解密者透過簡單重複並口資料來解密,但解密者進一步分析一下資料規律就可以解決了,這就是常說的“埠”層的資料分析。這種加密鎖原理非常簡單,是種正在被逐步淘汰的產品,但是其原料成本極低,即使在很低的價位也有很好的利潤,加密廠商一般都不願放棄這種鎖;而很多廠商由於成本原因又不得不採用,因此這種鎖仍有一定的市場份額;

   第二代是演算法不公開的加密鎖。硬體內部增加了微控制器,即所謂內建CPU,廠商主要是利用演算法功能進行加密。加密鎖通常還增加了一些輔助功能,比如倒計數器、遠端升級等。軟體狗採用了低功耗TTL,COMS等邏輯元件,在電路上做了一些加密工作,檢查時也要比第一代軟體狗多一道手續,解密的難度自然也增加了。常見的有深思洛克的“深思Ⅰ”型,彩虹天地的SuperPro、微狗,ALADDIN的MemoHASP等。利用微控制器,軟體與鎖之間的資料通訊建立了一個保密協議,資料都是經過加密的,解密者就難以分析出資料內容和規律了,因此對於這種鎖的資料分析就不是停留在“埠”層了,解密者轉向了“功能”層,就是對軟體中的函式呼叫進行分析。為了抵擋功能層的資料分析,這種鎖來了個“軟硬”兼施的策略。
   “軟”的是指驅動程式內反跟蹤、外殼加密等等軟體工作,讓解密者難以在功能層上模擬,誰都靠的是對作業系統、微機系統的精確理解。誰都無法決勝,結果是加密驅動程式在不斷更新、膨脹。
  “硬”的就是加密鎖內的演算法功能,這大大增加了解密難度,這是掌握在加密者手中的武器。但是,加密者只能設定演算法的引數,即所謂內含多少種演算法可選,而演算法內容並不知道。這樣就限制了廠商對演算法的使用,要麼預先記錄演算法結果然後在軟體執行時核對(使用碼錶);要麼在軟體中至少變換兩次然後比較結果是否一致。如果解密者截獲這些資料,透過統計、分析就有可達到解密目的;

   第三代加密鎖,即所謂“可程式設計”的加密鎖。1999年初,以北京深思洛克為代表推出了第三代加密鎖,“可程式設計”加密鎖概念的推出是軟體加密技術的一次進步。“可程式設計”加密鎖設計初衷是希望使用者能夠將軟體中重要的程式碼或模組“移植”到加密保護裝置中執行,使軟體與加密鎖實現真正無縫連結。但由於成本限制,早期推出的幾款“可程式設計”加密鎖採用的低檔微控制器給 “可程式設計”性造成了很大的侷限,主要表現在:1、演算法變換的複雜度不夠高,2、指令編碼空間較小,3、程式區的空間較小。這些侷限性使得使用者根本不可能利用“可程式設計”加密鎖實現理想的高強度加密方案。 軟體狗採用了PAL(Programmable Array Logic)、PEEL(Programmable Electrically Erasable Logic Device)、GAL(Generic Array Logic)等可程式設計器件,但目前流行的期間大概要算序列讀寫的EEPROM(Serial Electrically Erasable PROM)了。這些器件由於密碼編制的靈活性和製成金鑰後在程式中插入檢查的方便性,極大地增加了解密的難度。從使用的角度來看PAL、PEEL、GAL等邏輯器件只能讀取資料,不能隨時寫入資料,密碼的重新設定比較麻煩;而EEPROM晶片可隨意讀寫,用在軟體狗上靈活性相當大,譬如可以為每一個軟體狗單獨設一個密碼,以增加解密的難度;另外,從EEPROM器件的電器效能上來說也非常適合做軟體狗;因此這種器件在軟體狗的設計中獲得了廣泛的應用,是當時軟體狗製作者的首選晶片。它象一般RAM儲存器一樣可讀寫(只不過讀寫是序列的),即使斷電後也能儲存資料不變。常用的EEPROM型號是93C46,它是64×16bit的結構,也就是說一個93C46具有64個16位bit單元的容量,每次處理資料也都是16位。有的93C46,如Microchip、ATMEL、CSi等品牌的93C46可以透過切換,變為128×8bit或64×16bit兩種模式,這對軟體狗製作來說就更靈活了,其加密效果也更好。當然也有人採用更大容量的93C56、93C66或容量小一點的93C06、93C26等EEPROM晶片。因為軟體狗是插在微機的並行口上,所以檢查程式是透過並行口的I/O地址去讀寫EEPROM。具體的讀寫方式跟硬體線路以及EEPROM的時序有關,因此,一般的檢查程式針對某一種硬體線路;但是這些程式大同小異,大體上是差不多的。

   第四代軟體夠在第三代軟體狗基礎上,加入一個微控制器晶片,如PIC16C5X。此晶片中存有特定的演算法程式,可將讀出的金鑰資料進行加密變換,以對抗邏輯分析儀。可以說,軟體狗發展到第四代,已經非常成熟了。在此技術上,各軟體狗研製公司又加入自己的電路設計,形成了各自的產品特色。

   平時常見的狗主要有“洋狗”(國外狗)和“土狗”(國產狗)。這裡“洋狗”主要指美國的彩虹和以色列的HASP,“土狗”主要有金天地(現在與美國彩虹合資,叫彩虹天地)、深思、堅石。總的來說,“洋狗”在軟體介面、加殼、防跟蹤等“軟”方面做得沒有“土狗”好,但在硬體上絕對“無法”pj(應當說pj難度非常大):而“土狗”在“軟”的方面做得絕對稱得上世界第一,許多技術,如噪音、自檢測、演算法可變、碼錶變換等等,可以說都很先進,而在硬體上不及國外,只要稍有微控制器功力的人,都可複製。


現在狗的技術發展很快,針對不同的應用場合有不同的型別,如:

強勁狗:自由定義演算法的高強度加密方案
微狗:  面向微控制器環境的高強度加密方案
USB狗: USB介面的微狗全相容產品
軟體狗:面向單機環境的低成本加密方案
網路狗:面向網路環境的加密方案
卡式狗:面向網路環境的加密方案


軟體狗採取了各種的加密技術,目前較先進的加密技術有以下幾種:

AS技術:API函式呼叫與SHELL外殼加密結合,即使外殼被破壞,加密程式依然不能正常執行。
反跟蹤:
       a.資料交換隨機噪音技術:有效地對抗邏輯分析儀分析及各種除錯工具的攻擊。
       b.迷宮技術:在程式入口和出口之間包含大量判斷跳轉干擾,動態改變執行次序,提升狗的抗跟蹤能力。
抗共享:可從硬體對抗並口共享器,由開發商選擇是否共享狗。
口令:  可由軟體開發商設定32位口令,口令錯誤將不能對儲存區進行讀寫。
時間閘:某些狗內部設有時間閘,各種操作必須在規定的時間內完成。狗正常操作用時很短,但跟蹤時用時較長,超過規定時間狗將返回錯誤結果。
微控制器:硬體內建微控制器,固化的微控制器軟體保證外部不可讀,從而保證狗不可仿製。
儲存器:提供20位元組掉電保持儲存器供開發商存放關鍵資料、配置引數等資訊。


市場上常見幾種軟體狗的簡單介紹

彩虹天地:在中國應該算是老大了,從第一代到第四代的產品都有,但它的主要產品還是第三代的微狗(TD-MH),該代產品中有干擾晶片,能隨時產生無用的干擾訊號,更加有效的對抗邏輯分析儀;雖然有第四代的強勁狗(CS-QA),但好象有不少問題,所以推出的USB介面的加密鎖還是相容微狗的。彩虹天地的加密強度不高,最簡單的pj方法就是隨便買一個狗,然後複製成要解的狗。

深思洛克:也是一個比較有名的,至2001年初最主要的產品就是第四代的深思Ⅲ型加密狗,特點就是使用者可在狗中定義自己的演算法,這大大加強了其保護能力,但它的CPU功能還不夠強,演算法上有漏洞,而且只提供一種加密方式,所以也是可以擊破的,並且也能硬體複製原狗。此類狗加密的產品有Pkpm結構計算軟體、分析家股票軟體、圓方cad軟體等等。
深思 Ⅲ 的n階黑箱模型法:
   深思 Ⅲ 的n階黑箱模型法並不是簡單的記憶,而是透過深思 Ⅲ 獨特的完全可程式設計使得深思 Ⅲ 鎖對於輸入和輸出呈現高階黑箱控制模型的特徵。每次呼叫程式碼執行時使用鎖記憶體儲作為運算變數和引數,改變鎖的狀態影響後續的呼叫。使用者自定義的程式碼沒有任何的說明書和特徵,甚至兩次相同的呼叫會返回不同的有用的結果。這是深思 Ⅲ 獨特之處。
   以上加密範例並不要求加密者尋找複雜並難以預料的函式關係加以移植。
如果是採用0階黑箱模型那麼輸入與輸出具有直接的對應關係 y=f(x1,x2),其中x1,x2為本次輸入,y為本次輸出。這時如果函式關係簡單就很容易被解密者破譯,比如用迭代法、插值法和列表法等方法逼近;這就迫使加密者尋求複雜函式來防止解密者的破譯和模擬。但由於鎖內資源的限制使得軟體移植幾乎不可能。現在採用n階黑箱模型,就使得輸入與輸出的對應關係複雜化: yn=f(yn-1,yn-2,yn-3,...,y1,xn1,xn2),其中,y1,y2,...,yn-1為以前n-1次呼叫輸出或隱藏的結果,xn1,xn2為本次(第n次)呼叫的輸入引數。
   面對這樣的複雜關係,解密者簡單地取消中間的任何一次呼叫都可能使後邊的結果發生錯誤,既使是簡單的函式關係也可以被這高階黑箱過程隱藏得難以推測。這樣,藉助於高階黑箱模型法很容易找到應用軟體中可以利用的公式或函式作為加密的物件。
   n階黑箱模型法使用過程中一樣可以使用碼錶法,例如,範例中的第一次呼叫。
但是,這樣的碼錶法不同的加密點互相關聯,必須進行整體解密,這就大大地提高了加密強度。使用傳統的0階黑箱模型時,不同的加密點之間互不關聯只需各個擊破分別解密即可,其複雜度無法與n階黑箱模型相比。對於比較複雜的函式,儘管鎖內沒有足夠的資源,還是可以透過n階模型法進行加密處理我們可以將複雜函式化為簡單函式的運算組合,例如:y=(a-b)*(a+b)+c可以先計算(a-b)和(a+b)然後將結果相乘再加c。
n階模型嚴格說是不可解的(只是目前理論上,也請深思公司記住這一點),因為第n次輸出依賴於前n-1次輸入和輸出,而前n-1次輸出可能已部分或全部被隱藏,所以第n次輸出無法推測,至少推測n-1次輸入產生的輸出要比一次輸入產生的輸出複雜度有質的飛躍。
   深思 Ⅲ 具有完備的指令系統,可以透過程式設計實現n階或任意階黑箱模型,每次呼叫互相關聯,並且可以絕對隱藏中間結果,只要使用得當,理論上是不可解的( 我的理論是沒有不可解的:)

飛天誠信:是新崛起的一家,主要產品是ROCKEY-IV和相相容的USB狗,技術支援比較好,功能比較多,它的外殼加密程式很不錯,用在加密上主要是8號功能(種子碼)和14、15、16號功能(都是自定義演算法),它的自定義演算法比深思的產品好,“沒有”漏洞(目前理論上說)。如果很好地使用它加密,是極難pj的。但大多數開發商都很偷懶,比如就只用8號功能(種子碼)來加密。

   製作和出售軟體狗的公司很多,你只要注意一下計算機雜誌上的廣告就能得知。各公司生產的軟體狗除了上述特點外,一般都有一些為吸引使用者而附加的功能,主要是一些工具軟體,其核心技術卻是大同小異。


加密狗的一般特點

1、不佔用並行口,因為它雖然插在並行口上,但是它又提供了一個跟原來一致的並行口。
2、軟體具有防解密功能,可對抗各種除錯工具的跟蹤。
3、一狗一密碼或一種線路,軟硬體不可互換,就像一把鎖一把鑰匙那樣。
4、提供各種語言的程式設計介面以及一套實用工具,方便使用者在自己開發的程式中嵌入加密模組。
5、提供對可執行檔案的加密工具,以便使用者對已有的產品進行加密。


目前主流軟體加密鎖的不足

  對軟體加密保護產品而言,使用者最關心的是加密的有效性,產品的相容性和穩定性。目前市場上主要的軟體加密鎖硬體內部均含有微控制器,即所謂內建CPU,軟體廠商主要是利用演算法功能進行加密。加密鎖通常還增加了一些輔助功能,比如倒計數器、遠端升級等。這型別加密鎖主要產品有彩虹天地的“微狗”“SuperPro”、深思洛克的“深思Ⅰ、III型”、 ALADDIN的HASP3、4等。透過對這些軟體鎖進行分析,認為從安全性上講他們至少有三方面致命的薄弱點:

  薄弱點1:設計原理有很大缺陷
  目前主流的加密鎖硬體提供了讀、寫和演算法變換功能,且演算法變換關係難以pj和窮舉。但這類加密鎖最大的缺陷是演算法不向軟體廠商公開,鎖內的變換演算法在出廠時已經固定,軟體加密者只能設定演算法的引數。這樣就限制了廠商對演算法的使用,要麼預先記錄演算法結果然後在軟體執行時核對(使用碼錶),要麼在軟體中至少變換兩次然後比較結果是否一致;如果解密者截獲這些資料,透過統計、分析就有可達到解密目的。

  薄弱點2:加密鎖受處理能力的限制,無法為軟體提供強有力的保護
  市場上曾先後推出了幾款“可程式設計”加密鎖。這型別加密鎖最大的特點就是可以讓使用者自行設計專用演算法。“可程式設計”加密鎖的出現的確是軟體加密技術的一次進步。深思洛克的“深思III”、飛天誠信的“Rockey4”均屬此類產品。
   但由於成本限制,這型別加密鎖往往只能採用10~20元人民幣的通用8位微控制器或同檔次的ASIC晶片作為核心微處理器。這種低檔微控制器的處理運算能力是相當弱的,這就給 “可程式設計”加密鎖造成了很大的侷限性,主要表現在:1、演算法變換的複雜度不夠高,2、指令編碼空間較小,3、程式區的空間較小。這些侷限性使得使用者根本不可能利用“可程式設計”加密鎖實現理想的高強度加密方案。

  薄弱點3:硬體本身抵抗惡意攻擊的能力較弱
  隨著積體電路設計、生產技術的發展,安全產品的核心晶片硬體本身受到攻擊的可能性越來越大。典型的硬體攻擊手段有電子探測攻擊(如SPA和DPA)和物理攻擊(探測,如採用SiShell技術),下面我們就這方面進行簡要的分析。
  電子探測(SPA和DPA)攻擊技術的原理是:微控制器晶片是一個活動的電子元器件,當它執行不同的指令時,對應的電功率消耗也相應的變化。透過使用特殊的電子測量儀和數學統計技術,來檢測和分析這些變化,從中得到微控制器中的特定關鍵資訊。
  物理攻擊的方法有:透過掃描電子顯微鏡對晶片內部儲存器或其它邏輯直接進行分析讀取;透過測試探頭讀取儲存器內容;透過從外部無法獲取的介面(例如廠家測試點)對儲存器或處理器進行直接資料存取;再啟用微控制器的測試功能等。
  由於通用低檔微控制器並非定位於製作安全類產品,沒有提供有針對性的防範物理攻擊手段,因此比較容易透過電子探測(SPA和DPA)攻擊直接讀出儲存器內的資料。雖然大多數普通微控制器都具有熔絲燒斷保護微控制器內程式碼的功能,但此類晶片應用場合廣、發行批次大,隨著廠商間委託加工與頻繁技術轉讓,使得利用該類晶片下載程式的設計漏洞,利用廠商的晶片測試介面,透過特殊的燒寫時序和資料讀出資訊成為比較容易的事情。
  ASIC晶片是完全根據使用者需求而特別定做,屬於小批次生產。由於其採用特殊的邏輯電路且不會輕易公開測試功能介面,因此只要以其為基礎開發的系統不是儲存重要的資訊或者不用於高階別的安全場合還是可以防範一般情況下的物理攻擊。

加密鎖效能判定

加密鎖很小巧,包含的技術內容卻很豐富。一般我們從三個方面分析加密鎖的效能:

  第一個是加密原理,或者說加密鎖有些什麼功能,這往往是針對一些解密方法發展起來的,最需要創造性的地方就是這裡。國內產品在這個方面一直與國外產品具備足夠的競爭能力。

  第二個是加密鎖的可靠性、穩定性、相容性、透明性等。這些是對鎖的基本要求,但是做完整並不容易,尤其是相容性、透明性問題,加密廠家在這方面有著豐富的經驗,但是沒有誰可以100%保證。透明性是鎖的一個比較特殊的指標,由於鎖是工作在並口(列印口),並口還會有其他裝置,比如印表機、繪圖儀、硬碟、光碟機等,鎖如果影響到原來裝置的正常工作就是透明性不夠好,完全的透明是難以做到的,一般的加密廠家不保證鎖對並口硬碟、光碟機等裝置的透明性。

  最後一個是鎖的易學性、易用性。


軟體狗加解密技術的簡單介紹(我將在以後陸續加入並詳細介紹)

  涉及到加、解密的技術可以說是包羅永珍,基本的有組合語言、除錯工具、作業系統等,還需要一些密碼學的基本常識,如果對資料結構、編譯原理等有一定的瞭解會更有幫助。當然,這並不是說沒有這些基礎就做不好加密,在使用加密鎖時,很多工作已經由加密廠家完成了,其實加密者只要對“隨機性”有一些基本的認識,就可以完成很出色的加密。這個隨機與一般意義上的隨機有所不同,這裡強調的是“不可預測性”。如果解密者可以預知加密鎖返回的資料,就可以用程式代替鎖來返回,軟體就無法知道鎖是否真正存在,就是被解密了。這就是我們常說的“模擬”,在密碼學中就是假冒攻擊。所以,加密的一個重要思路就是讓解密者看來:鎖輸入輸出資料有很強的隨機性。目前,加密設計中最迫切解決的就是構造隨機性的問題。

  常有人這樣加密:在軟體中反覆檢查鎖內的資料,而且運用了很複雜的檢查方法,比如中間插入一些運算或者垃圾程式等,加密的工作量很大,以為“我查了那麼多次鎖還不夠嗎?”。但這在解密者眼裡不值一提,只要發現鎖返回資料的規律性就足夠解密了,根本不必理會軟體是怎麼使用的。這種加密失敗在於,只是用了些讀操作,沒有構成返回資料的隨機性。那麼,如果擴大加密鎖儲存容量,或者進行些寫操作就行嗎?顯然還是隨機性太差。因為這點,第一代加密鎖很難勝任真正的加密工作了。也因為這點,過去比較繁榮軟加密技術難以深入發展。這提醒我們,如果加密原理不合理,再大的加密工作量也是徒勞無益的。

  使用演算法變換就可以增強隨機性,但是有人這樣加密:在軟體中大量呼叫演算法變換,變換的資料量也很大(即演算法碼錶很大),可還是被輕易解密了。為什麼呢?是不是演算法被破了?不是。這種加密方法在解密者看來和上個沒有什麼不同,只要把每次變換的資料內容都記錄下來,如果軟體再用同樣的資料呼叫演算法,解密者自然知道應該返回什麼資料了。失敗原因是,碼錶內容是固定的,被解密者窮舉了,沒有構成隨機性,這說明可以窮舉的東西是不具備隨機性的。那麼怎麼才能防止被窮舉呢?由於加密者也不知道演算法方程,實際上是做不到的。但是,我們可以給解密者增加很多窮舉困難。我們知道,只要讓解密者抓到一次,這個資料就再也沒有加密作用了,因此不能讓軟體執行一次就用完所有碼錶,另外還可以用些隨機數來做變換,這就考驗解密者的分辨能力了。這是個技巧性比較高的問題,需要不小的工作量,但這的確對加密強度有貢獻。

  如果加密者知道演算法內容,而解密者不知道,這樣就可以用任何資料來訪問加密鎖的演算法功能,解密者就無法窮舉了,第三代“可程式設計”加密鎖就能實現這種思想。

  由於第三代鎖的出現,需要補充另外一個話題,就是加密鎖的功能。如果解密者可以透過數學方法解析出鎖的內部功能,就可以“模擬”了。如何設計鎖的功能才不易被破呢?這涉及到一點密碼學,一般的加密者只要能夠將不同型別的運算混合使用就夠。對於第一、二代加密鎖,解密者沒有必要去分析程式是如何使用鎖返回資料的(模擬的思路),而對於第三代鎖,這種方法常成了解密者唯一希望,寄希望於透過跟蹤鎖返回資料的使用過程而推測出鎖的內部功能。這時候幾乎任何能夠降低程式可讀性的手段都會提高加密效果,比如程式垃圾、反覆的資料搬動、嵌入彙編、插入浮點運算等等。這點很吸引人,即使你剛明白加密,也能讓解密專家圍著你團團轉。

  加密者往往遠不如解密者專業,隨著網際網路的發展,解密技術正以更快的速度傳播,這給加密帶來了更大的挑戰。


軟體狗的加密技術介紹

   解密一個軟體狗可以從兩方面入手,其一是軟體,只要把檢查軟體狗的那部分程式碼解除,那麼軟體狗就成了一隻“死狗”。其二是從硬體入手的解密方法,其含義是要仿製一個加密盒,不管機密做的如何好,如果加密盒被仿製了,那麼軟體狗的加密作用也就不存在了。因此,從硬體入手的解密跟從軟體入手的解密其效果是一樣的,只不過後者需要付出一定的額外代價―硬體成本而已。

  那麼既然從軟體、硬體著手都能解密,用它來保護軟體還有什麼作用?不用著急,讓我們來談談如何更地保護您的軟體。

  針對解密的兩種方法,我們也從這兩方面來加強軟體的加密功能。

   
增強軟體狗加密功能的方法

  一、軟體加密

  全面我們說,從軟體入手的解密方法很多,針對這種情況,人們也研製出了很多行之有效的防解密措施,在次,我們把一些常用的防止軟體跟蹤解密的措施列於下面:

  1、計算程式執行時間,並判斷程式的執行時間是否過長;
  2、關鍵程式部分禁止 鍵盤中斷,並檢查鍵盤中斷是否被開放;
  3、關鍵程式部分禁止顯示輸出和列印輸出;
  4、在軟體中多做幾次軟體狗檢查;
  5、把程式的重要部分加以編碼加密,在執行時才解密;
  6、修改斷點中斷功能;
  7、利用除零中斷或溢位中斷是否有程式跟蹤;
  8、利用時鐘中斷檢查是否有程式跟蹤;
  9、在程式中呼叫INT 7;
  10、程式不要寫得很結構化,要多一些“廢話”;
  11、若干種加密方法綜合使用;
  12、用黃玫瑰軟體製作組出品的BITSHELL作外層防護;
  ......    ......
==================================================
[   附:外殼反跟蹤反破譯程式BITSHELL簡介
  一、系統簡介

  BITSHELL是一套可反跟蹤反破譯的軟體加密系統,主要用語保護軟體開發者的合法權益,防止未經授權的複製、演算法解讀及目標碼反彙編。它是我們應高階開發者的要求從BITLOK中提煉出來的,專為應用軟體提供pj保護的系統。應用軟體開發者可以充分發揮自己的才智編寫或精巧或複雜的程式,有BITSHELL的保護不用擔心競爭者對商品軟體進行逆向分析。應用軟體開發者更可以設計自己的反複製介質(加密卡、加密狗等),然後用BITSHELL進行外層保護,從而不必擔心訪問反複製介質的程式碼被截獲。應用軟體開發者也可以購買商品化的加密卡,加密狗等,在應用系統內部秘密地存取加密卡、加密狗,用BITSHELL作外層保護,防止訪問反複製介質的程式碼被截獲。

  主要功能和效能如下:

  千變萬化的加密方案
  內含隨機可選的二十套加密演算法,構造出千變萬化的反跟蹤反破譯方案,特別適合加密有多個單獨執行程式的軟體。

  先進超強的反跟蹤技術
  採用加密虛擬機器、多層間址多  鏈解等獨創的世界領先技術,結合傳統的加密方法,具備超強的動態反跟蹤能力。防範各種軟硬體偵錯程式對其破譯。不僅防止了國際上通用的偵錯程式,如:Soft-ICE,Turbo Debugger,Symdeb等,還重點防範了國內開發的各種專用偵錯程式。

  可靠性高、相容性好、使用面最廣泛
  經BITSHELL1.0加密過的軟體日夜執行在超過60萬臺機器上,經過了最廣泛、最嚴格的測試。BITSHELL2.0具備同樣可靠的效能,加密過的軟體可以在各種廠牌各種機型上正常執行,相容各種流行的DOS系統。

  功能全面、使用方便
  可加密各種帶覆蓋模組的執行檔案,特別適合加密有Clipper,FoxPro等編譯的各種資料庫應用系統。

  提供OBJ嵌入式加密模組。這樣,使用者還可以在源程式里加入加密模組,與外殼部分相互關聯,有效地提高破譯難度。

  可以為使用者定製專用BITSHELL反跟蹤反破譯系統,可以滿足使用者的獨特需求。

  二、快速入門

  BITSHELL經過了使用者嚴格的檢驗,作者對其精雕細琢反覆修正,現在的版本使用極容易。確保BITSHELL硬碟或網路安裝已經成功,或BITSHELL源盤在軟碟機中,加密方法如下:

  BITSHELL<原始檔><目標檔案>

  例如:
  把TEST.EXE加密成TESTOK.EXE。輸入以下命令:

  BITSHELL TEST.EXE TESTOK.EXE

  把TEXE.EXE加密不保留未加密的程式。輸入以下命令。

  三、操作指南

  1、BITSHELL引數的詳細說明

  BITSHELL可以用KEY環境變數來設定一些引數,這樣可以簡化使用過程。設定方法如下:

  SET KEY=[SCHEMExx,][STAY,][CHECKOVL]

  BITSHELL各項引數的意義如下:

  (1)引數SCHEMExx,若給出則依使用者的要求使用指定的變形演算法,否則將隨機抽取一種加密演算法。BITSHELL2.0共有20種演算法可選。

   每一種演算法都有自己的特點,有的加密難度大但解碼時間長,這種演算法適合加密重要的程式碼不是特別大的軟體,如演算法三和十二;還有的加密難度適中但解碼速度快,如演算法一,適合加密大型軟體。

   每個使用者可以根據自己的特點選擇,如加密不同的版本用不同的演算法,加密不同的程式用不同的演算法。如選演算法十五可給出SCHEME15,選演算法十九可給出SCHMEM19等,依次類推。

   (2)引數STAY用來選擇在加密程式執行完畢後,是否駐留監控程式。預設值為不駐留監控。

    如果加密FoxPro編譯的程式,必須加引數SET KEY=STAY,以監控覆蓋模組。

   (3)引數CHECKVOL如果被加密的程式中有覆蓋模組,此引數是用來選擇是否檢查覆蓋模組。對於用CLIPPER編譯出來的軟體,加密時設定該引數非常有必要。預設值不檢查覆蓋模組。

    BITSHELL引數都是可選的,如果不設定,都有相應的預設值。預設的設定為:

   (1)SCHEME為隨機挑選演算法
   (2)不駐留檢測程式(加密FoxPro編譯的軟體,設定為駐留檢測)
   (3)不檢查覆蓋模組

    2、使用BITSHELL

    BITSHELL的商品盤是加密的,使用者可以將其安裝在NOVELL網路伺服器上使用,源盤不能複製。如果只是臨時使用一次也可不用安裝,將BITSHELL源盤放入軟碟機中直接使用。方法:

    BITSHELL<源程式>[<目標程式>]

    如果不設定目標程式,加密的結果直接覆蓋在源程式上。加密所用演算法可用環境變數KEY來設定。

    例如:①BITSHELL C:TEST.EXE
          ②BITSHELL TEST.EXE SAMPLE.EXE
          ③A:BITSHELL D:TEST.EXE C:TEST.EXE

    其中<源程式>是需要加密的程式路徑名。原始檔必須是可執行檔案以COM或EXE為字尾。如果預設<目標程式>則直接在<源程式>上加密。如果還想保留未加密的程式,就不要預設<目標程式>,並且保證源程式名與目標程式名不同。

    [說明]
   (1)BITSHELL系統本身是加密的,不能複製。
   (2)經BITSHELL加密的軟體,可以複製,散發,任意執行,除非被加密的程式有自己的反複製介質。
   (3)經BITSHELL加密的軟體不能還原為未加密狀態。
   (4)經BITSHELL加密的軟體無法跟蹤,無法反彙編。

    四、BITSHELL高階技巧

    1、源程式嵌入式保護措施

    軟體開發者在其軟體開發完成以後,再在關鍵地方鏈入以下函式。當連結成功後,用BITSHELL.EXE將使用者軟體加密。這套被加密的軟體執行時,就可以檢測該程式是否被解密修改,以採取響應的反擊措施,如拒絕執行等等。

    使用者可參考以下流程加密:

   (1)將自己的軟體(SAMPLE.C)編好,除錯透過。

    SAMPLE.C
    #include<stdio.h>
    main()
    {
    printf("This is my sample program! \n");
    }

   (2)在SAMPLE.C重要的地方呼叫加密函式。

   SAMPLE.C
   #include<stdio.h>
    main()
    {
    /* Insert BITSHELL function call */
    id (BL_ComeIn()==0)
    {
    printf("Error! \n")
    return(255);
    }
    printf("Thin is my sample program! \n");}

   (3)編譯SAMPLE.C成為SAMPLE.OBJ後,再將SAMPLE.OBJ和BLOBJ.OBJ連結成SAMPLE.EXE。
    QCL /AL SAMPLE.C BLOBJ.OBJ

    (4)用BITSHELL加密,鍵入命令執行:
    BITSHELL SAMPLE.EXE SALE.EXE
    軟體加密過程完成了!
    如果被加密的程式SALE.EXE被解密或修改,就會提示錯誤,然後退出。

    2、使用BITSHELL須知
    請不要使用PKLITE,LZEXE或EXEPACK進行壓縮商品程式。
    建議高階語言程式設計者,如有可能將所用程式設計語言的啟動程式碼作修改,改變程式的入口點,避免被截獲。在程式內部識別BITSHELL的嵌入式模組最好採用隨機呼叫。

    加密時用環境變數指定引數。生產一批軟體,用同一種變形演算法,萬一軟體有漏洞,新版本的軟體可換一種變形演算法。加密後的檔案放在硬碟上,可提高加密速度。超大檔案加密後,再用PKZIP等壓縮後,放入商品軟體盤上。

    3、注意事項

   (1)執行BITSHELL系統,或執行經BITSHELL加密的程式系統,如果安裝了駐留型的除錯跟蹤器(如:Soft-ICE,GameBuster等),請先拆除之,否則程式將拒絕執行,因為這樣有跟蹤解密的嫌疑。

   (2)使用BITSHELL加密商品軟體的開發者,不要將BITSHELL系統盤上的任何檔案和資訊,以任何方式提供給終端使用者。不要將自己所用的BITSHELL的版本,序列號和變形演算法透漏出去。

    五、系統提供的可連結函式

    函式BL-ComeIn(BLOBJ.OBJ).........................[1]
    C語言說明:
    extern unsigned long BL_ComeIn(void);
    說明:
    利用這個函式可判斷是否執行過反跟蹤程式,同時還返回程式的PSP段地址和機器的ROM檢查和,供使用者程式進一步檢查。這是一個與加密外殼相關的函式,這樣可使使用者程式與加密軟體融為一體。對PSP段地址和ROM檢查和的判斷不要隔的太近。
    入口引數:無
    出口引數:如果出錯,返回 0FFFFFFFFH ;
                       (DX:AX=0FFFFFFFFH)
              如果成功,返回一個無符號的長字。
              其中:
              低位元組是ROM檢查和,高字是PSP段地址。
                 (AL=ROM檢查和,DX=PSP段地址)
    注意:ROM檢查和計算方法:
          累加ROM(0xF000:0xE000)處開始位元組,長度為0x100。
          獲取PSP段地址方法:
          MOV AH,62H
          INT 21H
          BX就是該程式的PSP段地址。
    呼叫建議:
        不要每次執行都去檢查該函式,用適當頻率、在關鍵的地方呼叫這個函式。

    C Usage Example:
    /*
    * function:BL_ComeIn
    */

    extern unsigend long far BL_ComeIn(void);
    /* Error return 0xFFFFFFFF,Success Return
    * Lo Byte is checksum,Hi Word is PSP segment
    */

    void My_BL_ComeIn()
    {
    unsigned long ComeIn;
    unsigned short int ROM_CheckSum;
    unsigned int PSPsegment;
    ComeIn=BL_ComeIn();
    if (ComeIn==0xffffffff)
    {
    printf("\nERROR:not loaded from BITSHELL shell ! \n");
    {
    else
    {
    ROM_CheckSum=ComeIn&0xff;
    PSPsegment  =ComeIn>>16;
    printf("nBITSHELL On Entry:\N");
    printf("ROM checksum is %x\nh",ROM_CheckSum);
    printf("PSP segment is %xh\n",PSPsegment);

    inregs.h.ah=0x62;
    intdos(&inregs,$outregs);
    printf("n This program PSP segment is %xh\n",outregs.x.bx);
    {
 {


    五、一個簡單的例子

    這裡我們一起看一下經BITSHELL加密後的程式的情況。
    採用一個極簡單的例子,用DEBUG生成一個 TEST.COM檔案:

    C:\>DEBUG
    -A
    876B:0100 MOV AL,0
    876B:1012 MOV DX,260
    876B:0105 OUT DX,AL
    876B:0106 INT 20
    8760:0108
    -RCX
    CX 0000
    :8
    -N TEST.COM
    -W
    Writing 00008 bytes
    -Q

    用BITSHELL對TEST.COM進行加密:

    C:\>BITSHELL TEST.COM
    BITSHELL(tm)Version 2.01
    Copyrighe(c) 1989-1995 by Yellow Rose SoftWare Workgroup

    Scheme 6 (CodeKey shift repeated)

    9K
    Total encryption size is 9K

    Encryption completed successfully.

    再用DEBUG來看一下加密後的TEST.COM:

    C:\DEBUT TEST.COM
    -R
    AX=0000 BX=0000 CX=4CBC DX=0000 SP=00C0 BP=0000 SI=0000 DI=0000
    DS=877C ES=877C SS=878C CS=878C IP=021C NV UP EI PL NZ NA PO NC
    878C:021C FA       CLI
    -U
    878C:021C FA       CLI
    878C:021D 8CCC     MOV SP,CS
    878C:021F 8ED4     MOV SS,SP
    878C:0221 BC4D25   MOV SP,254D
    878C:0224 9C       PUSHF
    878C:0225 51       PUSH    CX
    878C:0226 52       PUSH    DX


    878C:0227 56       PUSH    SI
    878C:0228 57       PUSH    DI
    878C:0229 55       PUSH    BP
    878C:022A 0E       PUSH    CS
    878C:022B 1F       POP DS
    878C:022C 2E       CS:
    878C:022D 8C061000 MOV[0010],ES
    878C:0231 2E       CS:
  878C:0232 C606480080 MOV BYTE PTR [0048],80
    878C:0237 0E       PUSH       CS
    878C:0238 07       POP ES
    878C:0239 BEAD24   MOV SI,24AD
    -U


    ......    ......


    -Q

    可以看到經加密後TEST.COM檔案變長了很多,這是因為在程式外面加了一層外殼。同時,您也發現了加密後的程式沒法反編譯;如果您再跟蹤一下,您又會發現加密後的程式已經無法跟蹤了。如果您手頭有Turbo Debugger或Soft-ICE等等,它們也是無效的。

    看起來,這是一個比較好的加密工具,尤其是它提供的函式可以嵌入原始碼中,跟軟體狗配合起來,達到內外結合的加密效果,大家不妨一試。     |||||
==================================================    

  雖然加密方法那麼多,但是道高一尺,魔高一丈,隨著加密技術的發展,解密技術也進一步蓬勃發展起來,目前可用於解密的工具有SOURCE、DEBUG、SYMDEB、TURBO DEBUG、SOFT-ICE、TRW2000等等。這些工具的功能一個比一個強,更何況還有那麼多“專業”解密高手,似乎任何加密技術到了他們手裡都會迎刃而解。說來說去,您可能會想,你仍然沒有最終解決軟體的加密問題嗎。是的,本來嗎,加密和解密就是一對矛盾的統一體,某一階段的優  只能看是哪一方先亮出了新招,誰都不敢說他的加密方法別人破譯不了,或者說他能破譯任何加密方法。如此看來,我們所做的工作只在於盡量減少被解密的可能性,以贏得時間進行下一步的開發。

  軟體解密就是要想辦法把加密程式碼攻破,具體到軟體狗上,即是找到檢查程式,然後幹掉它。因此,如果我們在應用程式的不同地方多做幾次檢查,就可以讓解密者浪費更多的時間。這對I/O速率很快的軟體狗來說是很方便的,不像軟盤加密那樣檢查起來既費時又不方便。

  一個好的程式設計師會把程式設計得簡單易懂,具有結構化,但這也給解密者帶來了方便,所以程式不要寫得太規則,另外還要加上一些“廢話”,以干擾解密者。

  另外一種不破壞程式結構化,也不需要寫“廢話”就可以有效干擾解密者,提高解密難度和複雜性的方法是,把子程式全部用宏改寫。這樣彙編出的程式是一串串很難看出結構的指令,進出堆疊的資料和各種傳遞的引數以及積存器暫存數的存取相距很遠,巢狀很深,分析起來很傷腦筋。第三代軟體狗的存取程式就是全部用這種方法寫的。

  很多軟體加密技術的研製者對Soft-ICE很頭疼,因為它的解密功能太強了,但是您只要在程式中呼叫一下INT 7,就能防止它的跟蹤,您不妨試試看。

  在用解密工具跟蹤程式時,執行時間顯然要比平常的長,另外一般都用鍵盤來操作,用顯示器或印表機作輸出,所以採用執行時間檢查或者在關鍵程式部分禁止鍵盤中斷,以及禁止顯示器或印表機輸出(修改INT 10H 或INT 17H 中斷)等都是較好的方法。例如在第三代軟體狗程式設計中用到的方法:


          ......    ......
          ......    ......
;................MACRO.....................
;.            計時反跟蹤                  .
;..........................................
;-----------------------------------------[+]
;儲存時間
;-----------------------------------------[+]
TimeSave    macro
ifndef debug-Time
               push ds
               push cs:[_const_word_0_]
               pop  ds              ;ds=0000H
               push ds:[046ch]      ;把時鐘記數值
               pop  cs:start_time   ;儲存到start_time
               pop  ds
endif
               endm

;-----------------------------------------[+]
;檢查程式執行時間,超過5秒則主機被掛起
;-----------------------------------------[+]
TimeTest    macro
ifndef debug_Time
               push es
               push ax
               push cs:{_const_word_0_]
               pop  es              ;es=0000H
               mov  ax,es:[46ch]    ;得到新的時間記數值
               sub  ax,cs:start_time;
               cmp  ax,18*5         ;執行時間超過5秒嗎?
               ja   $+4             ;是,則主機被掛起
               pop  ax
               pop  es
endif
               endm

;..................MACRO...................
;.                鍵盤反跟蹤              .
;..........................................

;-----------------------------------------[+]
;禁止鍵盤中斷
;-----------------------------------------[+]
KbdOff    macro
ifndef debug-Kbd
               mov cs:_tmpB_,al   ;儲存al
               mov al,02h         ;禁止鍵盤中斷
               out 21h,al
               mov al,cs:_tmpB_   ;恢復al
endif
               endm

;-----------------------------------------[+]

;檢查鍵盤中斷,若被開放則主機被掛起
;-----------------------------------------[+]
KbdTest_jmp    macro
 ifndef debug_Kbd
               push ax
               in   al,21h
               test al,02h        ;鍵盤中斷被開放?
               jz   $+3           ;是是,則掛起
               pop  ax
endif
               endm

               ......    ......
               ......    ......

  另外,如果我們把關鍵部分的程式加以編碼,執行時再譯碼出來,這也增加了解密的難度,因為解密者必須懂得編碼、譯碼規則才能修改可執行檔案,而這些規則加密者一般是不會洩露的。
   
  多種軟體加密方法的綜合,以及幾種加密技術交叉使用,足以讓許多解密者知難而退。因為必須瞭解所有的加密技術原理才有可能解密,這就增加了難度,畢竟能夠精通各種加密方法的人不多。例如有就把軟體狗加密技術和磁碟加密技術結合起來做。


二、硬體加密

  軟體狗的電路不要做的太直接,否則不利於加密。這裡我們就來講講如何增進軟體狗的複雜性,加強硬體電路的機密功能。

  在講第二代軟體狗時,我們說它其實就是幾個簡單的與或邏輯閘,目前已經被淘汰。現在我們將要把它跟EEPROM結合起來,經過變化,組成比較複雜的第三代軟體狗,從而增加解密難度。

  CAL晶片由於本身就有加密功能,所以也常被用來與EEPROM結合做成複雜的軟體狗,更由於其內部邏輯配置的靈活性,使得解密的難度上漲了很多倍。

  解密者要仿製加密盒,首先必須搞到同型號的EEPROM,所以,我們儘量採用市場上一般購買不到的EEPROM型號,這樣也能起到保密的作用。另外,如果採用特殊的93CX6系列,就可以利用不同廠商出品的特殊93CX6,其特性不同這一點來加強硬體的 加密功能。

  下面我們給出兩個具體例子來說明(以93C46型為例)

  例1  在電路中加入一個非們,以改變93C46某一管腳的極性,電路中要儘量採用低功耗的晶片,所以這裡用了CMOS型的74HC04非門來實現。

  這是在前面例子的基礎上把CS訊號反了相,讀者還可以適當加入一些無用的電阻,電容等器件,以迷惑解密者。同時,我們還需要把相應的程式修改一下,把原來對CS訊號的控制也反相才行。

          ......    ......
          ......    ......
;---------------------------------------------[+]
;設定EEPROM的片選CS為高電平,即選中EEPROM(-AUTO FEED線反相
;後接CS)
;硬體電路變化時,本部分程式應作相應改動
;---------------------------------------------[+]
SetCS    macro
       push ax
       CtrlPort          ;選擇控制口
       in   al,dx
;       and  al,not,02h   ;令-AUTO FEED線輸出
                         ;為高電平
       or   al,02h       ;令-AUTO FEED線輸出
                         ;為低電平
       KbdTest_Add_AL    ;檢查鍵盤中斷,若被開
                         ;放,則改變al值
       out  dx,al
       _CtrlPort         ;選擇資料口
       pop  ax
       endm

;--------------------------------------------[+]
;設定EEPROM的片選CS為低電平,即不選中EEPROM(-AUTO FEED線反相
;後接CS)
;硬體電路改變時,本部分程式應作相應改動
;--------------------------------------------[+]
ClearCS    macro
         push  ax
         CtrlPort        ;選擇控制器
         in    al,dx
         or    al,02h    ;令-AUTO FEED線輸出
                         ;為低電平
         and   al,not 02h;為高電平
         KbdTest_Add_0w  ;檢查鍵盤中斷,若被開放
                         ;則改變_const_word_0_值
         out   dx,al
         _CtrlPort       ;選擇資料口
         pop   ax
         endm

         ......    ......
         ......    ......


  例2  在電路中加入一個或非門,使得必須用兩根並行口的訊號線來得到一根93CX的控制線,這裡採用了COMS型的74HC02或非門。

  這是在前面例子的基礎上把CS訊號用兩根口線(D2和D3)來控制,還可以適當假如一些無用的電阻、電容等器件,以迷惑解密者。同時,我們還需要把相應的程式修改成只有當D2和D3都為低電平時CS才為高電平。

        ......    ......
        ......    ......
;--------------------------------------------[+]
;設定EEPROM的片選CS為高電平,即選中EEPROM(D2D3線或非後接CS)
;硬體電路改變時,本部分程式應作相應改動
;--------------------------------------------[+]
SetCS    macro
       push    ax
       in      al,dx      ;取資料口資料
       and     al,not,0ch ;令D2D3線都輸出低電平
       KbdTest_Add_AL     ;檢查鍵盤中斷,若被開
                          ;放,則改變al值
       out     dx,al
       pop     ax
       endm
;--------------------------------------------[+]
ClearCS    macro
         push    ax
         in      al,dx    ;取資料口資料
         or      al,08h   ;令D2=0,D3=1
         KbdTest_Add_0W   ;檢查鍵盤中斷,若被開放
                          ;則改變_const_word_0_值
         out     dx,al
         pop     ax
         endm
         ......    ......
         ......    ......


第四代軟體狗加密技術

  前面我們介紹了從第一代軟體狗到第三代軟體狗的使用和製作,但是,這些軟體狗都是著眼於別人想不到這樣的做法這個基礎上的,一旦被人解密,散發出來,那麼它的保護效果就要大打折扣了。任何人只要搞得到相同的晶片,便能仿製出一模一樣的軟體狗。即使你在加上一些TTL和CMOS等邏輯器件,甚至加上PAL、PEEL、GAL,或者在加上一些無用的電阻、電容,但畢竟都是侷限於一些簡單的邏輯變化和干擾手段,對於那些“專業解密高手”來說,仍然可以輕易地把它當作一個黑盒子,找一臺儲備示波器或者邏輯分析儀、邏輯分析卡,然後把電腦和軟體狗之間的所有操作訊號都記錄下來,再用微控制器將所有操作訊號一五一十加以模擬就成了。甚至還可以設計出學習式的軟體狗,像市場上那種學習式萬用遙控器一樣,去學習原版軟體狗的操作訊號,真正是道高一尺,魔高一丈。

  這種情況是否以為這軟體狗已經沒有什麼用了呢?那倒也不是,只不過還需要再往上提高一個層次―採用微控制器來設計軟體狗。目前已經有不少軟體公司在他們的一系列軟體上都採用了這種新的軟體狗作加密保護用。

  採用微控制器制作軟體狗有什麼優點呢?主要在於主機存放程式與加密盒之間的溝通方式可以任意設計,不像第三代軟體狗那樣比較固定。這樣,解密、破譯的難度就成倍增加了。譬如,對於想用模擬方式仿製軟體狗的做法,我們可以採用用特定的演算法來溝通的方法予以解決,讓示波器或邏輯分析儀每次記錄的訊號都不一樣,別人就難以模擬您的軟體狗了。再如,為對付學習式軟體狗,我們可以設定若干種溝通方式,平時只用一種方式溝通,在某種條件下、才出現特別的溝通方式,過一陣子也會失效,很難把所有的溝通方式都記錄下來。

  說了那麼多,那麼好,這種軟體狗到底該如何製作呢?是不是採用任何一種微控制器都行呢?不是。前面說過,軟體狗是靠“偷電”來獲得電源的,所以,在選擇微控制器時,首先要保證它的功耗比較低,適合在並口上工作。其次微控制器的指令要簡單,功能要較強,適合做軟體狗,最後一點,微控制器本身帶內建ROM,並有加密功能,以簡化電路和防止被非法複製。符合這些條家的微控制器是很多的,如NEC的MPD7554,Microchip的PIC16C5X系列等等。

第四代軟體狗硬體設計思想

  現在,我們給出第四代軟體狗的一個例項,供大家參考。我們採用PIC16C54結合93C46來設計。

  以並行口(DP25)的第9腳DATA7作為主電源,而以16腳―INIT為輔助電源。這樣做,可以避免PIC16C54的電源因DATA7的變化而時有時無。-INIT腳的輸出是很弱的,所以為了降低功耗,當DATA7為LOW時,就令PIC16C54的振盪頻率降低到100kHz以下。這是透過對電阻R2的控制實現的。DATA 7為HIGH時,R1與R2並聯,總的電阻小於100K歐,振盪頻率大於100kHz;當DATA7變為LOW時,R1就與R2斷開,總的電阻等於100K歐,振盪頻率就小於100kHz,使得PIC16C54處於低功耗狀態。PIC16C54的RTCC腳是用來監視並行口的-STROBE腳。因為當-STROBE出現負脈衝時,表示並行口有資料要送入印表機,所以此時軟體狗不能工作。而RA0是用來監視並行口的-SLCTIN腳的,當-SLCTIN為HIGH時,印表機不會工作,這時候與軟體狗通訊比較合適。

  在我們的電路中採用了93C46,但它並不是必須的。因為它的用途是來記錄一些密碼,序號等資料,如果採用OTP型,每一個晶片本身就可以儲存不同的密碼,是用不著外接儲存器的;但在大批次生產MASK時,它是必須的,要不然,所有的軟體狗就一個樣了,這不符合加密原則。

  第四代軟體狗在硬體電路方面沒有什麼好變化的,最多也就仿照第三代軟體狗的做法,但是在軟體方面,由於採用了微控制器,儘可以根據各人的巧心思,進行自由的發揮。

  2、第四代軟體狗的一個軟體設計

  (1)在DATA7及-SLCTIN為HIGH時才能工作。
  (2)工作期間如-STROBE有負脈衝則軟體狗停止工作。
  (3)建立128BYTES迴圈式的密碼錶,以資料口送出去的第一個BYTE為密碼的起點,並以BIT2決定所要核對的密碼是七次或八次。
  (4)送出資料的方式採用從資料口出,前後兩個資料XOR後所得的值為所要傳送的資料。
  (5)所有密碼核對正確後,有-SLCTIN腳以約100ms的負脈衝,以序列方式從-ACK腳在上升沿時讀回密碼錶的下一個密碼供PC機核對。

   根據這個原則,我們可以卸出一個比較好的軟體狗程式,足以另解密者頭疼很長時間了。有興趣的朋友不妨自己編一編,解一解看。

   這是當前軟體狗加密技術中比較好的一個解決解密問題的方案。別人想要仿製您的軟體狗,一般是不可能的,除非找到讀出微控制器中程式程式碼的工具。


以智慧卡技術為核心構建的新一代加密鎖的安全特徵(新一代加密鎖介紹)

  IC智慧卡以其可靠的安全保障效能廣泛應用於軍事、金融、保險等國民生計的重要領域。以智慧卡技術為核心構建的新一代高強度加密產品,也因此具備了極為優越的安全效能。

  改進之一:重要軟體程式碼完全移植到硬體中執行
   在新型鎖軟體保護的方案中,PC端應用軟體的關鍵的程式碼和資料“消失”了,被安全地移植到加密鎖的硬體中保護起來。在需要使用時,應用軟體可以透過功能呼叫引擎來指令加密鎖執行硬體中的關鍵程式碼和資料並返回結果,從而依然可以完成整個軟體全部的功能。由於這些程式碼和資料在PC端沒有副本存在,因此解密者無從猜測演算法或竊取資料,從而極大程度上保證了整個軟體系統的安全性。
  利用智慧卡技術的新一代加密鎖最多可提供總計高達32~64K位元組的程式和資料空間,可容納近萬行的C語言程式碼。

  改進二:強大的運算處理能力
  利用智慧卡技術的新一代加密鎖具有強大的運算和資料處理能力,能夠支援浮點運算庫、數學函式庫、安全服務庫、標準輸入和輸出庫等;這些對提高加密強度起著至關重要的作用。

  改進三:智慧卡晶片具有極高的安全性
  智慧卡晶片具有很高的整合度,與普通低檔的微控制器不同,只有已透過國際安全機構檢測和認證(EAL 4+和IT SEC認證)的專業安全晶片製造商才能提供智慧卡晶片。
  智慧卡晶片能夠有效抵禦電子探測攻擊(SPA和DPA)和物理攻擊(SiShell),其在硬體設計階段就提供了完善的安全保護措施。它透過晶片廠商開發,透過產生額外的噪聲和干擾訊號,或透過增加濾波電路來消除噪聲,再加上若干保護層,採用特殊的材料(對電子束敏感的材料)等,使監測晶片內執行的指令序列不可能實現。同時智慧卡晶片提供了硬體隨機數發生器,在CPU 的控制下,每次晶片與外界資料傳輸中,產生的隨機數可以保證資料不會重複。
  為了保證智慧卡晶片的可靠性和可用性,國際權威技術標準管理機構ISO為此專門制定測試標準DDISO/IEC 10373,其中就明確了智慧卡在紫外線、X射線、電磁場下的測試要求。1999年,ISO推出了安全晶片技術的新標準ISO/IEC 15408,新標準對智慧卡晶片的防物理攻擊能力提出明確要求。

  符合以上標準的智慧卡晶片具有以下防物理攻擊的功能:

  ◆透過燒斷熔絲,使測試功能不可再啟用(測試功能是智慧卡晶片製造商提供的對智慧卡晶片進行全面檢測的功能,這一功能對智慧卡晶片具有較大的操作性,不能啟用測試功能將大大提高智慧卡晶片的安全性);
  ◆高/低電壓的檢測;低時鐘工作頻率的檢測;
  ◆防止地址和資料匯流排的擷取;
  ◆邏輯實施對物理儲存器的保護(存取密碼等);
  ◆匯流排和儲存器的物理保護層等。

  此外,智慧卡晶片還具有一些軟體保護來說極為有用的安全功能:

  晶片自鎖功能DD軟體對晶片的訪問首先由PIN碼保護,PIN碼的嘗試次數可由軟體開發商設定。當非法使用者利用字典攻擊的情況出現時,如果次數超過設定值以後,晶片會自我鎖定,外界一切對晶片的操作均被停止。
  全球唯一序列號DD智慧卡晶片具有全球唯一序列號,不可更改。這可以杜絕冒用的情況發生,同時也可以對已發行的產品進行有效管理。如果軟體開發商與加密技術供應商合作,可以獲得提供特殊序列碼區段控制服務,這幾乎可以從根本上解決硬體的複製仿冒問題。
  硬體隨機數發生器(白噪聲技術)DD用於產生高強度隨機數。除對稱演算法生成金鑰需要外,隨機數在安全加密領域具有非常重要和廣泛的應用,因此,硬體本身帶有高強度隨機數發生器對安全而言意義重大。
  硬體時鐘定時器 DD是軟體計時使用、反跟蹤等常用軟體保護手段中必備的功能。

  改進四:智慧卡技術的核心DD作業系統COS
  COS(卡片作業系統Card Operating System)存放在智慧卡晶片上,是一個比較小但非常完整、嚴密的系統。COS管理著智慧卡的一舉一動,智慧卡整套系統的安全性除一部分由晶片設計生產廠商保證外,大都由COS開發商實現。
  COS 主要分為四部分:通訊管理、檔案管理、安全管理和應用管理。國際標準化組織 ISO 已經對智慧卡的物理和電器指標以及應用標準做出較詳盡的規定DDISO7816,有關智慧卡與外界交換資訊的電氣指標以及指令格式在ISO7816DD3&4中有詳細的規定。
  開發COS系統是有相當大的難度和工作量的,需要投入很大的人力、物力;任何不按標準快速開發出的晶片控制系統很可能存在導致巨大安全隱患的設計缺陷。而採用第三方廠商的COS系統組合而成的產品由於其核心技術不太可能由加密鎖廠商完全掌握控制,系統的安全性依賴於第三方COS廠商,由此也增大了使用者的安全風險。
   因此,利用智慧卡技術開發軟體加密保護類產品,從安全性、效率、穩定性、可靠性等各方面來說,核心的COS系統必須具有自主版權而且完全符合國際標準ISO7816。
(加密技術未完待續)

軟體狗解密技術(待續)


  軟體加密技術和解密技術是矛與盾的關係,總是形影不離,當有了一項新的加密技術的時候,過不了多久,相應的解密技術也就誕生了。有時候,一項絕妙的解密技術也能使加密技術的研製這痛苦半天,反之怡然。如此糾纏,何時方休:回答是,永遠完不了。唯一的出路,就是普遍提高人們的素質,尋求版權保護。切實做好產品的服務和質量,以此增強人們對您產品的吸引力,而不想去使用盜版產品。。。

相關文章