?

Java軟件保護機制的研究與實現

2016-09-06 08:55尹艷陽任洪敏
現代計算機 2016年19期
關鍵詞:序列號源代碼字節

尹艷陽,任洪敏

(上海海事大學信息工程學院,上海 201306)

Java軟件保護機制的研究與實現

尹艷陽,任洪敏

(上海海事大學信息工程學院,上海 201306)

軟件保護是一個困擾軟件行業開發者的問題,特別是在當今互聯網飛速發展且強調知識產權的時代,更應該引起業界的足夠重視。Java語言以其“一次編譯,到處運行”等眾多優點占據著編程語言排行榜第一的位置。但是天生的特性使其非常容易通過各類反編譯軟件反編譯得到源代碼,致使Java軟件安全面臨著巨大危險。因而提出Java軟件序列號方式實現授權,對序列號和Java類文件分別加密,在自定義加載類中解碼編譯,并用混淆器做代碼混淆。結果表明Java軟件無任何異常同時實現保護作用。

軟件保護;類文件;自定義加載類;代碼混淆

0 引言

軟件的開發需要大量的人力、智力和財力的投入,是由一個人或團隊協作完成的高強度腦力勞動的結晶,是以知識、經驗和智慧為基礎具有創造性的產物。與有形財產一樣,也應受到保護,以提高開發者積極性和創造力,促進軟件行業發展。但它同一般物質性商品有明顯的差別,軟件產品的復制(批量生產)是極其簡單的,其復制成本同其開發成本相比較,幾乎可以忽略不計。

Java語言在知識產權保護方面有著天然的劣勢,Java代碼經過編譯后產生字節碼,但是字節碼能夠通過反編譯從而獲得到軟件源代碼的,從而來推導出軟件產品所使用的思路、結構、算法、原理、運行方法、處理過程等具有知識產權的設計要素,這樣就使Java軟件的安全和知識產權受到嚴重威脅。

1 Java軟件保護的研究現狀

目前已經有多種技術方法來限制反編譯或者提升反編譯的難度。本地編譯技術是把 Java程序編譯成為能夠在特定計算機上運行的應用程序。編譯后產生的是本地可執行的二進制文件,使得用戶無法通過反編譯獲得源代碼,但此方法破壞了Java語言的可移植性。數字水印是在軟件產品中嵌入的標識信號,數字不破壞軟件的使用價值和使用體驗。但是水印技術不是從本質上解決反編譯問題,只是提供了有反編譯行為時的證據。代碼混淆(Obfuscated code)也稱之為花指令,是保持軟件程序功能等價的基礎上對源代碼做復雜的再組織和加工,令閱讀和理解代碼增加難度。

在Java軟件保護方面,本文提出Java軟件以序列號方式授權,用戶必須擁有合法身份使用軟件,對于非法用戶有排斥和懲治措施。以及對Java class文件加密,動態解密。該方案的主要思想是:由程序獲得運行計算機唯一標識MAC地址,對唯一標識做RSA公鑰加密作為軟件序列號。同時對選擇的類文件加密,然后在類文件被加載調用時對其進行解密,在動態解密過程中隨機對序列號進行檢測,從而實現對 Java源代碼的保護。然后對加載類和部分代碼做混淆。

2 Java軟件保護的設計

2.1 Java軟件序列號授權設計

本文提出的Java軟件保護機制的序列號方式授權的主要思路過程可以分為如下步驟:①將程序獲得運行機的唯一標識MAC地址以及用戶提交用戶信息交由開發者;②開發者對計算機唯一標識和用戶信息進行處理,做加密作為軟件序列號,然后將軟件的序列號發送給用戶;③用戶輸入軟件序列號并保存在軟件配置文件中,由本地程序判斷序列號的合法性,檢查用戶是否為合法身份。Java軟件序列號授權過程整體流程如圖1所示。

圖1

2.2 class文件加密設計

(1)加密類文件

利用 Java Security包中加密擴展接口結合 RSA加密算法來對 Java應用程序里關鍵核心類文件和數據進行加密。加密后class文件不再是符合規則的字節碼文件,而是變成反編譯器無法打開的亂碼文件,那么意味著反編譯器為首的逆向工程工具無法從加密后的Java class文件中獲得任何受保護的信息。整體思路如圖2所示。

圖2

(2)自定義加載器

類加載器 Classloader是Java運行環境的一部分,負責把Java類動態加載到Java虛擬機的內存里。每一個Java類必須由某個類加載器裝入到內存中。Java虛擬機啟動時,虛擬機內有三個默認的類加載器,形成類加載器層次:Bootstrap ClassLoader是用本地代碼實現的,它負責加載Java核心庫 (存儲在

圖3

在Java軟件開始運行時,Java虛擬機將自定義的類加載器載入JVM內存中。在自定義ClassLoader中調用findClass方法實現父親委托。所謂的父親委托機制就是自定義加載器委托父加載器(Common)加載Class,Common委托System加載器,System委托BootStrap,如果BootStrap不能加載,則讓Sys加載,逐級下發,如果直到自定義 ClassLoader還不能加載 Class這拋出ClassNotFindException。委托機制被提出的最初原因是為安全性考慮的,為了確保Object等重要類只可由JVM加載。要特別說明的是加載器之間的父子關系與類之間的繼承關系不是同一概念,指的是加載器彼此的包裝關系。在本方案中,自定義的類加載器通過讀取配置文件中的參數,實現查找辨別完成解密處理后完成類文件的加載。請求加載過程如圖 4所示。

2.3 混淆設計

Java Obfuscator的原理就是將字節碼轉換為一個邏輯上的對等物,這種轉換后的版本極難拆散。即使有人試圖去反編譯,過程將極其艱難復雜,并很難繞過轉換后模糊晦澀的編碼。主要的過程如下:

用一個常規編譯器(例如JDK)編譯Java源代碼運行混淆器,在受保護的環境下生成編譯類文件。最后生成的會是一個不同的輸出文檔,也許擴展名也會不同。這個被重命名為.class file的文件在功能上與原字節碼是對等的,由于虛擬機仍然可以對其進行解譯,因此對功能不會產生影響。

圖4

3 Java軟件保護的實現

3.1 Java軟件序列號的生成

將程序獲得的計算機唯一標識,用戶提交的用戶信息,提交注冊時間戳,隨即字符串做為Java軟件序列號生成的參數,通過處理得到序列號。如式(1)。

在檢查序列號正確性時,對用戶輸入的序列號做MD5加密與用戶名判斷是否為特定值,同時與MAC、用戶信息做對比,如果身份合法則調用裝載器將軟件加密部分做解密處理裝入內存,初始化JVM虛擬機環境并運行Java軟件,否則終止退出。如式(2):

3.2 自定義加載類的實現

使用自定義的類加載器 ClassLoader:在自定義ClassLoader中調用findClass()方法判斷類是否己經是需要解密的類文件,如果是普通未被做加密處理的類文件,則交給父類Webapp加載類的findClass()方法負責加載;否則由自定義加載器調 findClassEncrypt()方法來載入className,這樣被 className直接或間接引用的Java類都將由自定義加載類DeryptClassLoader載入。自定義加載類調入方法核心代碼如下所示:

自定義加載類調入過程詳細說明:

(1)判斷此Class有沒有載入過(即在cache中是否有此Class),如果有到(8),如果沒有到(2)。

(2)如果parent classloader不存在(沒有parent,那parent一定是bootstrap classloader了),到(4);如果存在,到(3)。

(3)請求parent classloader載入,如果成功到(8),不成功到(5)。

(4)請求JVM從bootstrap classloader中載入,如果成功到(8)。

(5)查找Class文件(在和該classloader有關的類路徑中查找)。找到了到(6),如果找不到則到(7)。

(6)從文件中載入Class,到(8)。

(7)拋出ClassNotFoundException。

(8)返回Class.

在 Java軟件加載自定義加載類和對加密后的class文件進行解密的過程中,添加一個隨機調用序列號判斷方法,概率控制在10%,該方法用于進行檢測用戶身份合法性,對于非法用戶有排斥和懲治措施。

3.3 代碼混淆的實現

使用Zelix KlassMaster混淆器,它是一款用Java寫的實用工具,能讀取和修改Java類文件。該工具綜合了控制流模糊處理和異常模糊處理技術,對Java字節碼文件進行混淆處理。含有對字符串加密技術,加密后的字符串存儲在常量池中。同時它提供了命名混淆功能,以降低項目包、類、字段、方法名稱字節碼大小。下圖為例子HelloWorld混淆之后代碼。

圖5

4 Java軟件保護部署及測試

運行class文件加密程序,選擇要加密的class文件。運行效果圖6:

圖6

用加密過的class文件替換掉原未被加密的class文件

將自定義的加載器打成jar包放在lib文件夾中。并在context.xml里

用JD-GUI等反編譯軟件測試反編譯加密后的class文件結果無法打開。

測試在class文件加密后,項目依然可以正常運行。加密后的字節碼文件對比如圖。

圖7

圖8

由于class文件的加密,在加載時有解密的過程,必然會消耗一些時間,降低一點運行效率。實驗用了幾組不同大小的class文件做測試性能分析,發現系統執行效率與加密的class文件大小存在線性關系。

5 結語

任何的軟件保護都并不是無法攻克的城池,但作為保護軟件安全和知識產權的最后一道關卡,要盡可能地阻止和增加破解的代價。本文主要研究了一套Java軟件的保護方案,實現了在不影響Java軟件正常運行的情況下完成了對Java軟件的保護。通過Java軟件序列號方式實現授權。以兩種加密方式對序列號和Java類文件分別加密,在自定義加載類中解碼編譯。用Java混淆器做代碼混淆。詳解了部署過程和方法,對測試結果做了判斷分析,證明該方案起到了保護作用。

[1]Eckel B.Java編程思想[M].機械工業出版社,2007

[2]SHorstmann G,Cornell G.Java核心技術 卷II:高級特性[M].機械工業出版社,2008.

[3]探矽工作室.深入嵌入式Java虛擬機[M].中國鐵道出版社,2003.

[4]梁棟.Java加密與解密的藝術[M].機械工業出版社,2010

[5]周志明.深入理解Java虛擬機:JVM高級特性與最佳實踐[M].機械工業出版社,2011

[6]Herbert Schildt著.Java:The Complete Reference.張良華等譯.電子工業出版社,2008

[7]Jason Brittain著.Tomcat權威指南.O’Reilly Taiwan譯.中國電力出版社,2004

[8]Alex Kalinovsky.透視Java-反編譯、修補和逆向工程技術[M].清華大學出版社,2005

[9]Joshua Bloch.《Effective Java中文版》第二版 [M].機械工業出版社,2009

Software Protection;Class Files;Custom ClassLoader;Code Obfuscation

Research and Implement of Java Software Protection Mechanism

YIN Yan-yang,Ren Hong-min
(College of Information Engineering,Shanghai Maritime University,Shanghai 201306)

Software protection is a troubled developer of software industry,particularly the rapid development of the Internet in today's era of intellectual property rights and stressed,should arouse enough attention to the industry.Java language with its"compile once,run anywhere" and many other advantages list of programming languages occupy the first position.However,the natural features make it very easy to decompile the source code through various decompile software,resulting Java software security is facing great danger.Therefore,proposes ways Java software serial number authorization for serial numbers and Java class files are encrypted,in a custom compiled loaded class decoding,and code obfuscation to do with confusion.The results show no protective effect of Java software while achieving the exception.

1007-1423(2016)19-0027-05

10.3969/j.issn.1007-1423.2016.19.008

尹艷陽(1990-),男,吉林梅河口人,碩士,研究方向為軟件開發方法與軟件管理

任洪敏 (1969-),男,上海人,博士,副教授,研究方向為軟件體系結構、構件技術、軟件復用、過程工程、軟件項目管理

2016-05-04

2016-06-30

猜你喜歡
序列號源代碼字節
No.8 字節跳動將推出獨立出口電商APP
基于TXL的源代碼插樁技術研究
一種離線電子錢包交易的雙向容錯控制方法
一種控制器硬件序列號的更新方法
關于《國家稅務總局 工業和信息化部關于加強車輛配置序列號管理有關事項的公告》的解讀
No.10 “字節跳動手機”要來了?
輕量級分組密碼Midori64的積分攻擊
保護好自己的“源代碼”
解密別克安全“源代碼”
人類進入“澤它時代”
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合