[發(fā)明專利]一種防止Java程序被反編譯的方法有效
| 申請(qǐng)?zhí)枺?/td> | 201010620153.8 | 申請(qǐng)日: | 2010-12-31 |
| 公開(公告)號(hào): | CN102043932A | 公開(公告)日: | 2011-05-04 |
| 發(fā)明(設(shè)計(jì))人: | 張旻;胡林平;田丹;賈璐 | 申請(qǐng)(專利權(quán))人: | 中國(guó)航空工業(yè)集團(tuán)公司第六三一研究所 |
| 主分類號(hào): | G06F21/24 | 分類號(hào): | G06F21/24 |
| 代理公司: | 西安智邦專利商標(biāo)代理有限公司 61211 | 代理人: | 王少文 |
| 地址: | 710068 *** | 國(guó)省代碼: | 陜西;61 |
| 權(quán)利要求書: | 查看更多 | 說(shuō)明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 一種 防止 java 程序 反編譯 方法 | ||
技術(shù)領(lǐng)域
本發(fā)明是用于阻止對(duì)Java字節(jié)碼文件進(jìn)行反編譯以獲取Java程序源代碼,即用于Java程序的保護(hù)。
背景技術(shù)
Java是一種跨平臺(tái)的、解釋型語(yǔ)言。Java編譯工具將Java源代碼被編譯成為Java字節(jié)碼文件,由Java虛擬機(jī)負(fù)責(zé)對(duì)Java字節(jié)碼文件進(jìn)行解釋執(zhí)行。與本地目標(biāo)代碼不同,Java字節(jié)碼文件中仍然保留了方法名稱、變量名稱,并且通過(guò)這些名稱來(lái)訪問變量和方法,這些符號(hào)往往帶有許多語(yǔ)義信息。因此,對(duì)Java字節(jié)碼文件進(jìn)行反編譯就顯得比較容易。有許多Java的反編譯工具都能夠從Java字節(jié)碼文件生成高質(zhì)量的源代碼。為阻止對(duì)Java字節(jié)碼文件進(jìn)行反編譯,目前主要采用的有以下幾種方法:
(1)隔離Java程序:是指將關(guān)鍵的Java字節(jié)碼文件放在服務(wù)器端,客戶端通過(guò)訪問服務(wù)器的相關(guān)接口來(lái)獲得服務(wù),而不是直接訪問Java字節(jié)碼文件。這樣黑客就無(wú)法反編譯Java字節(jié)碼文件。但是對(duì)于單機(jī)運(yùn)行的程序是無(wú)法采用這種方法進(jìn)行隔離的。
(2)字節(jié)碼混淆:主要是通過(guò)將定義的類、變量、方法和包的名字改為無(wú)意義的字符串、使用非法的字符代替變量符號(hào)和在軟件中添加一些無(wú)關(guān)的指令或永遠(yuǎn)執(zhí)行不到的指令等手段來(lái)增加反編譯和對(duì)反編譯后源代碼閱讀的難度。但這種方法并不能真正阻止反編譯,而且混淆都有一定的規(guī)律可循,如果掌握這些規(guī)律,在反編譯時(shí)仍然可以得到一定質(zhì)量的源代碼。
(3)轉(zhuǎn)換本地代碼:即將Java程序像C/C++程序一樣編譯成本機(jī)可執(zhí)行的二進(jìn)制代碼。但是這樣做使得Java程序失去其跨平臺(tái)的特性,而且這種技術(shù)目前并不十分成熟,因此不適用于大型應(yīng)用程序。
(4)自定義類加載器:是指首先將Java字節(jié)碼文件進(jìn)行加密處理,然后自已編寫一個(gè)Java類裝載器在Java字節(jié)碼文件裝載時(shí)再進(jìn)行解密處理。這種方法的缺點(diǎn)在于雖然經(jīng)過(guò)加密的Java字節(jié)碼文件無(wú)法被反編譯,但自定義的類加載器本身卻不能防止被反編譯。因此,加密過(guò)的Java字節(jié)碼文件仍然是不安全的。
發(fā)明內(nèi)容
為了解決現(xiàn)有的技術(shù)中阻止對(duì)Java字節(jié)碼文件進(jìn)行反編譯的方法應(yīng)用范圍局限、不能從根本上杜絕Java字節(jié)碼文件被反編譯的技術(shù)問題,本發(fā)明提供一種防止Java程序被反編譯的方法。
本發(fā)明的技術(shù)解決方案:
一種防止Java程序被反編譯的方法,其特殊之處在于:包括以下步驟:
1】采用加密算法對(duì)要發(fā)布的Java字節(jié)碼文件進(jìn)行加密;
2】采用Java虛擬機(jī)工具接口監(jiān)聽Java虛擬機(jī)初始化事件;
3】采用Java虛擬機(jī)工具接口為步驟2】中Java虛擬機(jī)監(jiān)聽到的Java虛擬機(jī)初始化事件指定Hook函數(shù);
4】Java虛擬機(jī)初始化完成時(shí)自動(dòng)調(diào)用相應(yīng)的Hook函數(shù),并在的Hook函數(shù)中使用Java本地接口將Java虛擬機(jī)在生成類對(duì)象時(shí)調(diào)用的函數(shù)注冊(cè)為自定義的代理函數(shù);
5】Java虛擬機(jī)在生成某個(gè)類對(duì)象時(shí)調(diào)用相應(yīng)的自定義的代理函數(shù),在自定義的代理函數(shù)中對(duì)在步驟1】中加密過(guò)的Java字節(jié)碼文件進(jìn)行解密處理;
6】將解密后的Java字節(jié)碼文件生成相應(yīng)的類對(duì)象后返回給Java虛擬機(jī)。
上述步驟4】中所述Java虛擬機(jī)在生成類對(duì)象時(shí)調(diào)用的函數(shù)是函數(shù)java.lang.ClassLoader.defineclass1。
本發(fā)明所具有的優(yōu)點(diǎn):
1、保持了Java程序的跨平臺(tái)特性:Java虛擬機(jī)工具接口和Java本地接口是Java虛擬機(jī)提供的機(jī)制,在所有支持Java虛擬機(jī)的平臺(tái)上都可以應(yīng)用本方法。
2、保持了Java虛擬機(jī)的通用性:不需要修改源代碼重新生成Java虛擬機(jī)。
3、解密過(guò)程對(duì)用戶透明:解密過(guò)程被嵌入到了Java虛擬機(jī)的類裝載過(guò)程中,不保存解密后的Java字節(jié)碼文件。
4、保證了解密過(guò)程的安全性:使用Java虛擬機(jī)工具接口和Java本地接口編寫的程序(包括解密程序)全部編譯為本機(jī)可執(zhí)行的二進(jìn)制代碼。
附圖說(shuō)明
圖1為本發(fā)明中與java虛擬機(jī)工具接口進(jìn)行交互的時(shí)序圖;
圖2為Java虛擬機(jī)的初始化過(guò)程:
其中圖a為現(xiàn)有的Java虛擬機(jī)的初始化過(guò)程;圖b為使用本發(fā)明方法時(shí)Java虛擬機(jī)的初始化過(guò)程;
圖3為Java虛擬機(jī)加載Java字節(jié)碼的過(guò)程:
其中圖a為不使用本發(fā)明方法時(shí)Java虛擬機(jī)加載Java字節(jié)碼的過(guò)程;圖b為使用本發(fā)明方法后Java虛擬機(jī)加載Java字節(jié)碼的過(guò)程;
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于中國(guó)航空工業(yè)集團(tuán)公司第六三一研究所,未經(jīng)中國(guó)航空工業(yè)集團(tuán)公司第六三一研究所許可,擅自商用是侵權(quán)行為。如果您想購(gòu)買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請(qǐng)聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201010620153.8/2.html,轉(zhuǎn)載請(qǐng)聲明來(lái)源鉆瓜專利網(wǎng)。
- 同類專利
- 專利分類
G06F 電數(shù)字?jǐn)?shù)據(jù)處理
G06F21-00 防止未授權(quán)行為的保護(hù)計(jì)算機(jī)或計(jì)算機(jī)系統(tǒng)的安全裝置
G06F21-02 .通過(guò)保護(hù)計(jì)算機(jī)的特定內(nèi)部部件
G06F21-04 .通過(guò)保護(hù)特定的外圍設(shè)備,如鍵盤或顯示器
G06F21-06 .通過(guò)感知越權(quán)操作或外圍侵?jǐn)_
G06F21-20 .通過(guò)限制訪問計(jì)算機(jī)系統(tǒng)或計(jì)算機(jī)網(wǎng)絡(luò)中的節(jié)點(diǎn)
G06F21-22 .通過(guò)限制訪問或處理程序或過(guò)程
- 基于支持類的標(biāo)識(shí)來(lái)下載Java應(yīng)用的方法、系統(tǒng)和計(jì)算機(jī)程序產(chǎn)品
- 啟動(dòng)JAVA應(yīng)用的方法及裝置
- Java虛擬機(jī)的管理方法、監(jiān)控系統(tǒng)和監(jiān)控代理模塊
- 一種運(yùn)行Java程序的方法和裝置
- 一種保護(hù)java程序的方法
- Java卡的Java代碼補(bǔ)丁方法
- 一種基于中間件架構(gòu)下java棧的多線程實(shí)現(xiàn)方法
- 一種支持JAVA卡補(bǔ)丁函數(shù)的智能卡
- 一種改進(jìn)的Java卡初始化方法和Java卡
- JavaEE平臺(tái)構(gòu)建方法、JavaEE平臺(tái)及云端系統(tǒng)
- 功能限制程序、安裝程序生成程序和程序存儲(chǔ)介質(zhì)
- 程序生成系統(tǒng)、程序生成程序和程序生成模塊
- 程序生成系統(tǒng)、程序生成程序和程序生成模塊
- 程序創(chuàng)建裝置,程序創(chuàng)建方法和程序
- 程序生成裝置、程序生產(chǎn)方法及程序
- 程序生成裝置、程序生成程序以及程序生成方法
- 程序生成裝置、程序生成方法及程序生成程序
- 程序開發(fā)支持裝置、程序開發(fā)支持方法以及存儲(chǔ)介質(zhì)
- 程序執(zhí)行輔助裝置、程序執(zhí)行輔助方法及程序執(zhí)行輔助程序
- 程序?qū)φ昭b置、程序?qū)φ辗椒俺绦驅(qū)φ粘绦?/a>





