專利名稱:一種Linux系統下軟件代碼保護方法
技術領域:
本發明涉及一種在Linux操作系統下代碼保護方法,屬于軟件保護技術領域。
背景技術:
在通常情況下,Linux系統下編譯器生成的代碼以原始機器碼的形態存在于可執行文件中,并在執行時由操作系統加載入內存執行。這就造成了安全隱患一方面,攻擊者可以通過調試器動態跟蹤程序的執行,找到軟件保護判斷點,然后在可執行文件中尋找對應的機器碼部分進行修改,以永久解除軟件的保護;另一方面,攻擊者可以通過反編譯器對可執行文件中未修改的機器碼進行反匯編得到軟件的所有匯編代碼,然后對其進行靜態分析以找到軟件的保護判斷點,甚至將軟件中重要的算法提取出來使用。代碼保護是針對破解軟件技術而提出的軟件保護方法。無論是動態跟蹤還是靜態分析,軟件破解技術的最后步驟通常需要修改可執行文件中的機器碼以永久解除軟件保護。代碼保護的基本思路是使程序代碼不以原始機器碼的形式保存在磁盤上,而是執行時在內存中恢復成機器碼,使得破解者無法在保護后的可執行文件中找到并修改程序代碼,更無法對其進行反編譯,從而達到保護軟件的目的。在Linux系統中,每個內存頁都是有其內存頁屬性,所述內存頁屬性為可讀、可寫、可執行或者無訪問權限中的一種或幾種;當具有多種屬性時,各屬性之間要保證無沖突。如果程序嘗試在不允許這些權限的本地內存上操作,它將被SIGSEGV信號(Segmentation fault,段錯誤信號)終止。在內存映射完成后,這些內存頁屬性仍可以被Linux系統中的mprotect系統函數所修改。mprotect系統函數的參數分別為內存空間的起始地址,內存空間的大小,新的內存頁屬性。所指定的內存空間必須包含整個內存頁區間地址必須和整個系統頁大小對齊,而區間長度必須是內存頁大小的整數倍。這些內存頁的內存頁屬性被mprotect系統函數中的新的內存頁屬性替換。目前在Linux系統,已有的代碼保護方法有軟件加殼、自檢測等。目前Linux下代碼保護的技術水平不高,無法有效地對抗攻擊者的靜態分析和動態跟蹤。Linux平臺下軟件保護技術較之Win32平臺下落后很多,不僅商用保護產品屈指可數,軟件作者自己設計的保護也通常比較簡單,這主要表現在缺乏反跟蹤手段和代碼保護手段。
發明內容
本發明的目的是為了解決目前已有Linux系統下的代碼保護方法存在的不足,提出一種新的Linux系統下軟件代碼保護方法。本發明的目的是通過以下技術方案實現的。一種Linux系統下軟件代碼保護方法,用于對Linux系統下的軟件代碼進行保護。所述Linux系統下的軟件代碼包括主程序代碼以及I個或多個被調用函數,采用本發明提出的代碼保護方法對Linux系統下的軟件代碼進行保護,其操作過程為步驟一、加密和存儲擬保護代碼,具體為第I步在被調用函數中指定擬保護代碼,擬保護代碼是以函數為單位的。第2步為擬保護代碼定義一個數組(用符號pF表示),數組pF中的每個元素分別用來記錄擬保護代碼用到的一個系統庫函數地址。將數組PF中元素的初始值設置為空。然后將擬保護代碼用到的系統庫函數的地址替換為數組PF中對應的元素值。第3步將擬保護代碼編譯為關鍵代碼庫文件。第4步將關鍵代碼庫文件分為m個部分,m大于等于I ;再對m個部分加密后,分別存儲于m個數據文件中。步驟二、通過主程序申請一個內存空間(用符號Hi1表示),并記錄該內存空間中第一個完整的內存頁的起始地址(用符號P表示)。步驟三、將步驟二申請的內存空間Hi1中的全部完整的內存頁的屬性設置為可讀并可寫并可執行。所述內存頁的屬性包括可讀、可寫、可執行或者無訪問權限中的一種或幾種。步驟四、當主程序需要調用擬保護代碼時,其操作過程為第4.1步通過主程序申請一個內存空間(用符號m2表示);從步驟一中所述m個數據文件中讀取擬保護代碼的密文到內存空間Hl2。第4. 2步對第4.1步中所述擬保護代碼的密文進行解密,并將解密后的內容拷貝到步驟二中所述的內存空間Hl1中以P開始的內存中。第4. 3步把關鍵代碼庫文件中用到的系統庫函數地址賦值給內存空間Hi1中的pF數組。第4. 4步修正內存空間Hi1中被調用函數的地址,即將當前的被調用函數地址加上P的值。第4. 5步主程序調用擬保護代碼。經過上述步驟,即可實現Linux系統下的代碼保護。有益效果本發明提出的方法與已有Linux操作系統下代碼保護方法相比較,具有更好的安全性。本發明方法將擬保護代碼的加密存儲在一個或者多個數據文件中,在磁盤上沒有明文的二進制文件,增加攻擊的靜態分析難度,因此提高了安全性。
具體實施例方式下面結合具體實施例對本發明方法進行進一步詳細說明。本實施例中有5個二進制文件host、myl、my2、my3和my4,其中host為主程序;myl、my2、my3和my4為被調用函數。采用本發明提出的代碼保護方法對Linux系統下的軟件代碼進行保護,其操作過程為步驟一、加密和存儲擬保護代碼,具體為第I步在被調用函數中指定文件myl、my2和my4為擬保護代碼。第2步為擬保護代碼定義一個長整型數組pF,長度為200,數組pF中的每個元素分別用來記錄擬保護代碼用到的一個系統庫函數地址。將數組PF中元素的初始值設置為空。然后將擬保護代碼用到的系統庫函數的地址替換為數組PF中對應的元素值。myl中用到的系統庫函數為printf ( ) ;scanf ()。my2 中用到的系統庫函數為printf ( ) ;scanf ( ) ;read ( ) ;write ()。my4 中用到的系統庫函數為printf ( ) ;scanf Oread ( ) ;lseek ()。長整型數組pF中的第一個元素用來記錄printf ()的地址;長整型數組pF中的第二個元素用來記錄scanf ()的地址;長整型數組pF中的第三個元素用來記錄read ()的地址;長整型數組pF中的第四個元素用來記錄write ()的地址;長整型數組pF中的第五個元素用來記錄Iseek ()的地址。第3步將擬保護代碼編譯為關鍵代碼庫文件,關鍵代碼庫文件名為my. bin。第4步將關鍵代碼庫文件my. bin分為5個部分,再對5個部分加密后,分別存儲于5個數據文件中,5個數據文件名分別為A、B、C、D、E0步驟二、通過主程序host申請一個內存空間Iii1,并記錄該內存空間中第一個完整的內存頁的起始地址P。步驟三、使用mprotect函數將步驟二申請的內存空間Hi1中的全部完整的內存頁的屬性設置為可讀并可寫并可執行,具體代碼為mprotect(p, n*4096, PR0T_READ|PR0T_WRITE|PR0T_EXEC);其中,n表示內存空間Hi1中的全部完整的內存頁的數目。步驟四、當主程序host需要調用my2時,其操作過程為第4.1步通過主程序host申請一個內存空間m2 ;從步驟一中所述5個數據文件A、B、C、D、E中讀取擬保護代碼的密文到內存空間m2。第4. 2步對第4.1步中所述擬保護代碼的密文進行解密,并將解密后的內容拷貝到步驟二中所述的內存空間Hi1中以P開始的內存中。第4. 3步把關鍵代碼庫文件my. bin中用到的系統庫函數地址賦值給內存空間Hi1中的PF數組。第4. 4步修正內存空間Hi1中被調用函數的地址,即將當前的被調用函數地址加上P的值。第4. 5步主程序調用擬保護代碼my2。經過上述步驟,即可實現Linux系統下的代碼保護。
權利要求
1.一種Linux系統下軟件代碼保護方法,其特征在于:其操作過程為: 步驟一、加密和存儲擬保護代碼,具體為: 第1.1步:在被調用函數中指定擬保護代碼,擬保護代碼是以函數為單位的; 第1.2步:為擬保護代碼定義一個數組,用符號pF表示,數組pF中的每個元素分別用來記錄擬保護代碼用到的一個系統庫函數地址;將數組PF中元素的初始值設置為空;然后將擬保護代碼用到的系統庫函數的地址替換為數組PF中對應的元素值; 第1.3步:將擬保護代碼編譯為關鍵代碼庫文件; 第1.4步:將關鍵代碼庫文件分為m個部分,m大于等于I ;再對m個部分加密后,分別存儲于m個數據文件中; 步驟二、通過主程序申請一個內存空間,用符號%表示,并記錄該內存空間中第一個完整的內存頁的起始地址,用符號P表示; 步驟三、將步驟二申請的內存空間Hl1中的全部完整的內存頁的屬性設置為可讀并可寫并可執行;所述內存頁的屬性包括:可讀、可寫、可執行或者無訪問權限中的一種或幾種;步驟四、當主程序需要調用擬保護代碼時,其操作過程為: 第4.1步:通過主程序申請一個內存空間,用符號m2表示;從步驟一中所述m個數據文件中讀取擬保護代碼的密文到內存空間m2 ; 第4.2步:對第4.1步中所述擬保護代碼的密文進行解密,并將解密后的內容拷貝到步驟二中所述的內存空間Hi1中以P開始的內存中; 第4.3步:把關鍵代碼庫文件中用到的系統庫函數地址賦值給內存空間Hi1中的pF數組; 第4.4步:修正內存空間Hi1中被調用函數的地址,即將當前的被調用函數地址加上P的值; 第4.5步:主程序調 用擬保護代碼; 經過上述步驟,即可實現Linux系統下的代碼保護。
全文摘要
本發明涉及一種在Linux操作系統下代碼保護方法,屬于軟件保護領域。其步驟為①指定擬保護代碼;定義一個數組,記錄系統庫函數地址;將擬保護代碼編譯為關鍵代碼庫文件;并將其分為m個部分加密后存儲于m個數據文件中。②申請一個內存空間m1,并記錄該內存空間中第一個完整的內存頁的起始地址p。③將內存空間m1中的完整內存頁的屬性設置為可讀并可寫并可執行。④當主程序需要調用擬保護代碼時,申請一個內存空間m2;讀取擬保護代碼的密文到內存空間m2,并解密到內存空間m1中以p開始的內存中;把系統庫函數地址賦值給內存空間m1中的pF數組;修正內存空間m1中被調用函數的地址。此時主程序調用擬保護代碼。本發明提出的方法具有更好的安全性。
文檔編號G06F21/14GK103077333SQ20131002358
公開日2013年5月1日 申請日期2013年1月22日 優先權日2013年1月22日
發明者朱瑞瑾, 譚毓安, 左偉歡, 李元章, 馬忠梅, 張全新 申請人:北京理工大學