第五章 實作方法
5.3 如何手動加入註冊碼保護程式
這節分為兩部份,先介紹將如何將註冊碼保護程式加入軟體。再介紹註冊碼
保護程式的實作方法,也就是產生註冊碼的演算法。
5.3.1 如何加入註冊碼保護程式
先挑選所要限制的功能,選定功能後在此功能函式中加入 f 註冊碼的檢查,
如果檢查失敗則輸出錯誤訊息並中斷該功能的執行,如果檢查通過則繼續該功能 執
行。
5.3.2 註冊碼保護程式
圖 20 註冊碼保護程式實作方式及其執行流程
我們採用 RSA 簽章驗章演算法實作產生註冊碼的演算法,其執行流程如圖 20 所示。
軟體公司有公開金鑰(e,n)與私密金鑰(d,n)以及不可逆雜湊函數 H 軟體使用者有該軟體(內建公開金鑰(e,n)與驗章演算法)
整個軟體註冊流程
1. 軟體使用者將用戶資訊及註冊費用交給軟體公司
2. 軟體公司先將用戶資訊作雜湊處理得 H(用戶資訊),再用簽章演算法對 H(用 戶資訊)簽名並交給軟體使用者
3. 軟體使用者將簽章輸入電腦
4. 軟體於執行時執行驗章演算法檢驗其正確性,如果正確則執行受限制的功 能,如果不正確則不執行受限制的功能
碼產生器,我們只需要保護軟體內公開金鑰(e,n)與驗章演算法完整性。除非破 解者能破解 RSA 才能產生合理的用戶資訊與註冊碼配對。因此第四章第三節的圖 16 模型修正為圖 21 更貼近實作結果。
圖 21 新的軟體保護模型
5.4 如何在其它函式加入檢查註冊碼保護程式完整性的程 式
軟體中其它函式(圖 21 中的 B,C,D,E,F,G 函式)必須檢查程式三部份 1.公開 金鑰(e,n),2.呼叫 Verify 函式的動作,3.Verify 函式本體的完整性以確定軟 體保護機制正確運作。其檢查的方法必須滿足下列所有條件:
1. 不需要每個函式在每次被呼叫都執行檢查工作
假設我們在其它函式(圖 21 中的 B,C,D,E,F,G 函式)放入為數 100 次的檢 查動作,而且我們在每次的函式呼叫皆執行檢查工作,則破解者最少執行此 軟體 100 次即可找出所有檢查點並破解此保護方法,因此我們希望滿足某些
條件才執行檢查動作,透過設定其條件我們可以設計例如執行每 n 小時才有
圖 22 檢查方法的基本精神
不過,這個檢查方法還有個漏洞,註冊碼保護程式所在位址 0x500000- 0x500064 為一固定位址,破解者可以該位址為線索進行辨別工作。不過這只 是檢查方式的基本精神,其實際作法稍有改變以避免這個缺點(見下文)。
4. 檢查的方法需具有不易辨識的性質
前面提到註冊碼保護程式所在位址這個漏洞,針對這個問題我們先對破 解者的能力做假設再進行設計。破解者可以動態分析查看電腦任何一刻記憶 體的狀況,我們額外假設破解者有能力把每個指令執行前後記憶體的狀況儲 存下來並分析之,因此檢查方法在執行中的任何一刻記憶體與暫存器都不能 出現 0x500000-0x500064。我們使用第二章第二節介紹過間接定址法的觀念,
解決方法即是用間接定址的觀念讓記憶體與暫存器在執行任何指令的前後接 不會出現 0x500000-0x500064。例子如下:
假設我們要讀出記憶體位置 0x500000 的資料放到變數 j 中:
int *p=(int *)0x300000; 指令 1 int j=*(p+80000); 指令 2
其中因為型別 int=4 bytes 故增加一各位置等於增加 4 bytes 即 p+80000=0x300000+80000*4=0x500000
指令 2 的機器碼與組合語言如下所列: 0x200000 相加得到 0x500000,我們可以如前文所提做個簡單的條件判斷只 在真正執行比較的時才讓變數 p 存正確的基底 0x300000。如此一來,除非 1.人為解析分辨 2.程式按正常執行流程至此發生異常狀態(即檢查不通過) 而遭到破解者追蹤,否則破解者難以分辨之。
void sort(int *a,const int n) {
int i,j,k,temp;
for(i=0;i<n;i++) {
圖 23 Selection Sort
01:void sort(int *a,const int n) 02:{
03:int i,j,k,temp,*m;
04: for(i=0;i<n;i++) 05: {
圖 23 為 Selection Sort,圖 24 為修改後的 Selection Sort,比較兩個程式的 變化來檢視是否滿足上列四點。
在此架構下,如果破解者已取得一組合法的用戶資訊與註冊碼的確可以達到 與破解相同的效果,不過只要對此架構稍做改良即可克服,例如我們要求用戶資 訊必需含有電腦資料(如 cpu 型號和硬碟型號)並在軟體中檢查之,以一機一授權 的模式即可克服合法註冊碼洩露的問題。
第六章 程式說明
第一節與第二節我們將對為本系統所撰寫的程式做功能介紹,第三節則介紹 如何使用前兩節的工具對軟體加入保護。
6.1 註冊碼產生器
圖 25 註冊碼產生器介面 圖 25 為註冊碼產生器的介面,程式共分兩個功能:
1. 產生 Keys 2. 載入 Key 並加密
產生 Keys 使用 OpenSSL 產生長度為 2048bits 的 RSA 金鑰依照(n,e,d) 的 順序儲存於檔案 key.pem 裡,其中 d=65537。載入 Key 並加密將以 key.pem 為金 鑰對輸入文字長度為 20 bytes 做簽章並儲存於檔案 licence 裡,另外將金鑰的 n 以方便程式撰寫的格式儲存於檔案 keyn 中。
6.2 加入完整性檢查的工具程式
圖 26 程式介面
圖 27 操作流程圖
本節介紹的程式將會在所有函式加入檢查註冊碼保護程式完整性的程式。程 式介面如圖 26 所示,這一節的操作流程將如圖 27 示分為三個步驟。1.將軟體原 始碼及預留位置大小輸入程式功能 1,再按下產生原始碼就會將完整性檢查程式 碼加入原始碼中,因為此時只有原始碼沒有執行檔,無法得知程式實際執行位 置,因此這時後完整性檢查程式碼的檢查位置及值皆是錯誤的,工具程式功能 1 只是在原始碼中預留指定數量的檢查程式碼。2.將修改後的軟體原始碼編譯為執 行檔,由於前面提到的檢查位置與值皆錯誤,一旦檢查將會出現非法記憶體存取 錯誤如圖 28 所示。3.將執行檔及欲保護之記憶體位置與大小描述檔交給工具程 式功能 2 處理,工具程式將依描述檔的內容修正前面放入錯誤的檢查位置及值,
最後得到加入保護的程式。
圖 28 錯誤訊息 欲保護之記憶體位置與大小描述檔格式:
範例:
&&4198535 ##100
&&4193024 ##200
&&後的數字是 10 進位的欲保護記憶體開始位置
##後的數字是 10 進位的欲保護記憶體大小
因此 &&4198535 ##100 代表從記憶體位置 4198535=0x401087 開始檢查 100 bytes,&&4193024 ##202 代表從記憶體位置 4193024=0x3ffb00 開始檢查 200 bytes。
Unsigned char name[20],name2[512],m[512];
fp=fopen("licence","rb");
fread(name,1,20,fp);
fread(m,1,256,fp);
fclose(fp);
fexpm(m,name2);
if(strncmp((char *)name,(char *)name2,20)!=0)return;
這段程式讀取註冊檔 licence 中前 20 bytes 的明文與後 256 bytes 的 簽章做比對,如果驗章成功則繼續執行,若失敗則中斷。
3.使用 6.2 的程式完成加入步驟。
4.使用註冊碼產生器則可產生合法註冊碼。
第七章 實驗結果
為 1447 bytes *22 =31834 bytes假設檢查 n 次,總共需要空間為 1447 bytes + 1447 bytes *22*n=1447
電腦:IntelR PentiumR 4 CPU 2.80GHz,504MB RAM
系統:Microsoft Windows XP Professional Version 2002 Service Pack 1 工具:Microsoft Visual C++ 6.0
類型 排序數量 100 1000 10000 Selection sort 328 20329 1993172
修改的 Selection sort 329 20500 1995860 表 2 時間複雜度分析表
7.3 未來工作
1. 檢查註冊碼保護程式完整性的程式
這部份如果能與編譯器結合,透過編譯器取得更多資訊,則可設計出與軟體 結合更緊密的完整性檢查程式碼。
2. 更完整性的分析
軟體含有程式碼以及其它資料諸如圖片,數據等,程式碼的比例依照軟體屬 性而變,本文提出的方法只針對程式碼部份動手腳,因此缺乏對各種不同性 質的軟體分析與綜合比較。
參考文獻
[1] 施威銘,”IBM80x86 組合語言實務”,旗標出版有限公司,第三章,2000 [2] 羅雲彬,”Windows 環境下 32 位元組合語言程式設計”, 全華科技圖書股份
有限公司,第三章,2003
[3] 羅雲彬,”Windows 環境下 32 位元組合語言程式設計”, 全華科技圖書股份 有限公司,第一章,2003
[4] 段鋼,”加密與解密,第二版”,全華科技圖書股份有限公司,第十七章,2004 [5] 段鋼,”加密與解密,第二版”,全華科技圖書股份有限公司,第三,四
章,2004
[6] R.L.Rivest, A.Shamir and L.Adleman,”A Method for Obtaining Digital Signatures and Public-key Cryptosystem” ,Commun.ACM,Vol.21, pp.120-126,Feb.1978