淺談多型變形技術結合人工智慧演算法在軟體保護中的應用

看雪資料發表於2015-11-15

注:本文僅從個人對有關軟體保護技術的淺顯認識,試圖面向那些對此領域感興趣的初學者,帶來一些啟發性的參考思路。謬誤之處在所難免,還望大家批評指正,非常感謝!

前言

對於一個軟體產品進行技術保護的目的,就是要給那些嘗試破解,逆向分析被保護軟體產品的研究者帶來最大限度技術性阻礙,利益損失。以使它們的破解,逆向行為變得需要消耗大量時間,精力等代價,得不償失。

就作者本人以往的經驗,總體來看,一般軟體保護技術的進步總是遜色於相關破解技術的發展。現有公認的具有一定強度的軟體保護技術,大都直接涉及一定的數學理論,並且基於許多數學上的難題,形成一定強度的加密演算法。研製一套好的軟體保護系統,不是一件輕而易舉的工作。一般的軟體製作者是很難同時具有良好的數學基礎和軟體開發經驗的。況且,目前許多大型軟體(例如winxp採用了橢圓演算法)依然在較短的時間內被攻破。

網路聚合了人類的集體智慧,隨著並行處理技術的不斷成熟,計算網路幾何級數的增長,不斷複雜化,精確化,快速化,促進了人們的交流更加直接,快速,使得那些被認為安全性很高的加密演算法(特別是依據數學難題的那些演算法)可能被攻破的時間遠遠小於被預計的期限。目前,是我們應該對軟體保護技術進行更多的思考和嘗試的時候了。

建立一個軟體保護系統不但要要有可靠的理論基礎,而且需要耗費繁雜的資源(時間,精力,資金,技術,人才等等),而任何一個具有一定數學基礎,程式設計能力的破解者都有可能找到這個系統的漏洞而摧毀它。防禦遠比進攻代價要大。

在此,本文作者嘗試探討如何利用當前較新的軟體保護理論,結合我們自己的特長,所能掌握的資源,盡最大可能使我們自己開發的軟體產品得到一定程度的安全保障。




一.  多型變形技術
多型變形技術的發展和形成,最早在計算機病毒中得到體現。病毒程式的設計者為了使病毒程式碼躲避掃描程式的監察,不斷對自身的執行程式碼進行變換,儘量隱藏掃描程式依據的病毒特徵程式碼,從而使得掃描程式無法正確偵測和清除該病毒。正是不斷動態的變化特性,使得病毒程式具有更高的存活性,可發展性,危害性。對於任何不斷變化的事物,採用單一的對抗措施都是徒勞和效率底下的。我們應該重視變化特性的軟體保護技術中的應用。

二.  人工智慧技術
遊戲軟體大都不同程度的設計各種人工智慧演算法,那些大型複雜的遊戲,可以對玩家體現出很強的對抗性,正是這種智慧特性的發展才推動了遊戲產業的發展。我們可以在一定程度上結合簡單的智慧演算法作為軟體保護步驟中的一個環節,來對抗破解者的攻擊。

三.  軟體保護方案的設計思路

設計一套結合智慧特性和多型變形理論的軟體保護系統,首先,我們需要考慮準備一個知識庫(或者更簡單的說,是一個資料倉儲),它應該具有一定程度的自學習功能,也就是資料的不斷更新變化的特性。缺少這樣一個資料庫,也就失去了我們設計基礎。人正是透過不斷學習,積累知識,思考,創造,才會進步的。如何讓我們的程式學會思考?這個問題我回答不了,但是我們可以利用已經掌握的技術,進行各種組合嘗試,集合資料庫概念,研究一套可行的具有一定強度的軟體保護系統。

針對軟體保護的不同形式,我們先來看看線上註冊,名稱/列號保護方式。

3.1 序列號保護的策略
首先,在軟體產品擁有者的伺服器上裝有一個用於產生合法註冊號的資訊庫。任何試用本軟體並且願意購買的人,將他個人的資料,以及依賴他安裝此軟體的計算機自動產生的識別碼傳送到軟體發行者的註冊伺服器。經確認成功,系統將發回一個註冊檔案,使用者可以合法使用該軟體。

3.2 序列號保護的安全性保障:

首先,軟體開發者應該定期不斷的更新軟體,所提供試用的軟體的Key演算法或程式片斷已經被簡化或者尚未提供。如此,一個試用者在尚未得到一個正式版本時,對軟體的破解失去了意義。正式註冊者,可以得到一個註冊檔案,其中包括那些被提取或簡化的程式碼片斷,當然,這些關鍵程式碼依然是被加密的,相關的解密過程在程式執行時動態進行。

實際上,這個註冊檔案是一個小型的資料庫,其中包括:
1.  依據註冊時提交的註冊資訊機本機特徵字形成的針對需要被解密程式片斷的演算法庫(比如至少有20個)
2.  解密過程中需要呼叫的反跟蹤程式(程式執行過程中使用的多執行緒監視程式)
3.  各種不同的智慧處理程式,用於形成有效解密資料
4.  用於不同解密程式的資料資訊(針對不同解密演算法,針對不同需解密的程式片斷)
5.  被加密的關鍵程式片斷
6.  聯機更新程式(可連結主機,更新程式)

3.3 外殼加密程式
外殼加密程式應該提供一個可靠的加密庫。其中包括,各種不同加密演算法庫,反跟蹤庫,智慧演算法庫,以及相關資料庫。必須保證,被外殼加密程式保護的軟體產品,任何一個都具有互不相同的加密子庫,並且可以隨時獲得線上的更新,保證變化性,智慧性。

3.4 外殼加密的安全性
外科加密程式生成的被保護軟體,應該需要在實現安裝,才可以真正執行。安裝過程,既是要使得被加密軟體的執行,不能脫離安裝它的宿主計算機,如此才可以保證被保護軟體不至於因一個版本被破解形成通用的破解補丁。

四.  關於保護中反逆向工程的技術探討

逆向工程大都是透過對執行程式採取靜態,動態分析的結果推測程式實現功能的步驟和方法。其中對於逆向工程來說,最大的障礙不是利用某些特別的系統特性而設計的反跟蹤技術性陷阱,而是不可理解的大量的程式程式碼。那麼,我們如何為破解者準備這些他們必須看要分析又難以看懂的程式碼呢?我們應該使用比較複雜的程式控制流程,程式碼序列已經加密演算法。

任何人透過執行程式內含的程式碼和資料,對於一個較複雜演算法的分析都是十分困難的。人的生物特性,畢竟不適合從事長期單一性,如此艱鉅而繁瑣枯燥的分析研究工作。如此,我們可以嘗試利用有關人工智慧的演算法,作為軟體保護系統的主程式序列流控制部分,如此,破解者對於我們的保護程式的執行流分析就會成為意見十分艱鉅的任務,足以讓任何嘗試分析它的人望而生畏,如果分析類似的人工智慧演算法的C, JAVA, PASCAL語言寫程式碼都很困難,那何況是組合語言呢?

只有複雜的演算法還不夠,我們的資料倉儲呢?它正好為我們構造可變性的程式控制流序列和不同的加密演算法提供了足夠的原料,呵呵。

我們可以嘗試簡單設計一些不否步驟:

第一步,我們可以在程式執行的開始,自動生成一個大型的迷宮。其實很簡單,生成一棵大的二叉樹就可以了,因為你可以想見,把這個二叉樹圍攏起來,再隨意在樹幹上來一斧頭,那它不是肯定有一條通路嗎?我們可以在樹幹上,樹枝上都多來幾刀,形成一個有多條通路和出口的迷宮。然後隨機採用一種路徑搜尋演算法,從一個隨機的入口走到另一個隨機設定的出口(需要具有一定的深度)。這個過程計算機執行是很快的,然而,如果破解者想單步分析跟蹤出來我們的演算法和迷宮,那在他事先不知道我們的設計時,還是有些困難的。

如果我們設計9層這樣的迷宮(Diablo裡是幾層來著?),每個迷宮特定的步驟都生成進入下一個迷宮的跳轉程式碼,而且行進到某些步驟時定期檢測是否有跟蹤程式,或者其它條件的狀況,或者生成某些關鍵資料。每次我們的程式執行時,這些動態的步驟是基本可以對跟蹤者起到一定的迷惑作用的,並且初步避免了通用補丁程式。

關於註冊資訊的識別,關鍵資料的加密與大資料庫應用

加密部分程式片斷,我們不必使用什麼特別複雜的方法,你可以儲存一本電子版的聖經,然後根據註冊資訊,計算出應該選擇某一頁,某幾段的聖經內容對目標進行簡單的xor加密,在未知加密資料的前提下,密文幾乎是不可破譯的,如此的加密強度完全可以媲美任何複雜的加密演算法。

智慧演算法程式的應用

我們可以在軟體保護程式的控制程式碼序列中採用一套中國象棋演算法(或其它任何博弈演算法),在我們的大資料庫中儲存1萬個棋局,我們的演算法可以根據加密程式的要求和具體設定選擇部分棋局,每次程式執行時動態調入幾組棋局,當使用者輸入了正確的註冊碼或者合法使用者的資訊後,透過演算法轉換這些資訊給博弈演算法(我們的人工智慧演算法),它透過象棋的規則,應用人機對弈得到一個結果(可能是勝負的判斷,或者優劣形勢的判斷),然後根據這個棋盤上的結果生成一些用於解密的資料,解密程式的後續部分以及關鍵資料,致使程式正常執行。如此,可以避免一套被安裝在某個計算機上的程式被破解後,形成該軟體的某個通用破解補丁。由於每次程式執行時都可能呼叫某個博弈演算法,程式碼序列和流向不可預知,而是動態地依據當時執行環境的計算結果,解密後續部分,使得程式的跟蹤更加難以進行。

五.  總結

總之,軟體保護技術一定會具有更多動態變化的智慧特性,仿生學不正是科學借鑑大自然的巧妙安排來改進我們人類技術的嗎?我相信,有一天,我們不再需要去編寫一行一行的程式碼來實現我們的軟體保護系統。隨著科技進步的加快,高階的人工智慧必將最終取代這個任務。

六.  後記

我感到不安的,不是我們將來可以高枕無憂,盡享安逸,而正如許多科學家預言的那樣,人類的未來,必將使人造的科技最終控制和消滅人類。

如果這就是人類的宿命和必然的未來,就如今天我們在主宰者這個星球上的其他生物,也許這是一種輪迴,你還依然期待看到那一天的到來嗎?也許那是再一次的奴隸社會體驗的開始。人類可以摧毀matrix 安排的世界嗎?revolution會有一個結局嗎?我們的兄弟是否又會重新拾起木棍,胸前掛著cpu的碎片,在廢墟和叢林中,為了爭奪一隻野兔而相互廝殺?

故事還沒有完,我想起一部老電影裡的話:這,是個 有錢人的 世界。
那些有錢人,設計了未來。。。。。。。

附:有關多型加密方法的介紹(譯自CyProtect AG)
一種有關新的對稱加密系統的方法是自編譯機器碼解決長金鑰的速度問題。密碼系統的執行時間僅僅依據金鑰長度線性增加。 這種設計思路是要隨機化演算法自身,所以我們稱之為‘多型方法’。假設資料和實際採用的演算法在初始時是未定義的。一個計劃對你的金鑰進行攻擊的人會感到缺少必要的資訊,當它進行分析時,這個變化的過程很快複雜化起來,使其困惑難解。 一般我們都知道,密碼使用一個金鑰(也就是一個變數)。一個含有兩個變數的數學等式是無法求解的。對於密碼系統,這當然是一個解決方案,唯一得到正確金鑰的方法,只有搜尋全部的金鑰空間。問題就在於,對於一般的密碼需要一個一維搜尋空間,對於多型密碼,需要二維搜尋空間。
多型方法屬於目前最具強度的加密演算法,它大概應該算是最強的了。這個方法具有透過簡單地獲得隨機產生的機器碼產生足夠安全的特性來對抗任何種類的攻擊行為的優勢。它甚至能夠對抗對程式指令流的分析研究,因為這些指令流自身是可變的! 對於破解密碼系統來說,掌握被應用的加密演算法的細節,對於推導金鑰是非常重要的事情,但是對於採用多型方法的加密系統來說,所採用的演算法具有本質上的不可知性。
多型方法的基本法則

兩個不同的金鑰(或者一個金鑰的兩個部分)是由隨機數發生器產生的。其中一個隨機數發生器(左發生器)產生一個用於彙編的機器指令程式碼位元組流。在執行期間,內建的編譯器簡單地依照標準建立程式塊(片段),調整那些地址和入口,以及退出點,去產生相應的機器碼,這些機器碼,將在執行期間影響Key資料陣列。這個資料陣列由另一個隨機數發生器(右發生器)參照正確的口令字。
在這些機器碼被執行後,Key資料陣列能夠被用於加密明文(透過xor操作)。Key資料陣列應該採用優先選擇採用簡單快速的密碼演算法。經此處理,整個加密系統的複雜性得到增強,使得Key資料陣列的內容難以被分析,有關金鑰的線索無法被獲取。
這個方法的動態和變形特性,有時甚至可以迷惑分析者重新編譯指令序列。
多型加密方法內建的編譯器以同樣的方式使用處理器的暫存器編譯可替代的程式碼片斷。每一個建立的程式塊可被同樣功能的其它塊替代。除非資料是由一個塊到另一個塊,實際的程式碼長度可以依據複雜性進行改變。 一個資料陣列(可以被看作是一個長變數)是參照一個金鑰(口令字)被初始化的。它代替了常規加密演算法中的金鑰。CPU 針對這個安全盒(S-box)進行有關的工作,例如置換,mod運算,替換或其它非線性操作。
對多型加密方法安全性的攻擊
每個建立的塊至少影響32位資料並且頻繁的改變金鑰(key)。
假設只有4密碼指令塊和16個這樣的塊能夠被無序的相繼組合,那麼存在4^16 = 4294967296種不同的實際加密演算法!如果128指令塊被組合,將會有4^128 = 1,158*1077 組合結果 (標準128 位加密產生3,403*1038)。

有一個重要的地方要注意,這個方法不會影響執行時間。因為要產生一個被很好混淆(加密)的Key資料陣列,常規的演算法同樣需要作出如此的保證-不能影響執行時間。
多型方法實際上較之常規方法有更好的抗攻擊性。為了計算攻擊安全性總量,大量的程式碼組合必須被大量的金鑰可能性相乘。金鑰尺寸(Key size)可以是16位元組 = 128 位; 那麼儲存在key資料陣列中的key組合是2^128 = 3,403*1038 。在多型方法種,兩個Key空間相乘產生1,158*1077 * 3,403*1038 = 3,913*10115種可能的Key組合。
為了比較常規的傳統加密方法與多型方法,總Key空間必須被比較。在假定兩者同樣工作在128位資料Key的情況下,這種比較是合情合理的。由此,多型方法明顯優於任何的常規傳統方法: 3,913*10115 / 3,403*1038 = 1,150*1077 (!). 這個數字比我們星球上的原子還要多!

無間道III之《終極無間》引用《地藏菩薩本願經》,說“如是等輩,當墮無間地獄”。是誰?
If you wanna be somebody else, just change your mind

相關文章