国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Java防反編譯技術(shù)研究

2016-12-31 07:20
移動信息 2016年10期
關(guān)鍵詞:源碼解密代碼

焦 涌 賴 娜

?

Java防反編譯技術(shù)研究

焦 涌 賴 娜

中國電子科技集團(tuán)第28研究所,江蘇 南京 210000

隨著互聯(lián)網(wǎng)技術(shù)的興起,Java編程語言發(fā)揮著越來越重要的作用,越來越多的互聯(lián)網(wǎng)應(yīng)用使用Java編程語言編寫而成。但是,由于Java語言的開放性和平臺無關(guān)特性,Java代碼不是直接編譯成二進(jìn)制可執(zhí)行代碼,而是編譯成class文件。class文件能夠被輕易的反編譯源代碼,這樣用Java編寫成的程序就很容易被破解,泄漏應(yīng)用邏輯或者被非法使用。首先從最一般的反編譯技術(shù)談起,分析了目前市面上流行的反編譯技術(shù),最后提出了一種新的反編譯技術(shù),能夠有效防止Java程序被反編譯。

Java防反編譯技術(shù);代碼混淆;class文件加密

由于Java編平臺的開放性,Java應(yīng)用程序是由class文件組成。class文件并非是二進(jìn)制機(jī)器碼,而是將源碼進(jìn)行符號化和標(biāo)記化,這種class文件很容易進(jìn)行反編譯還原出源碼。這就帶來了非常嚴(yán)重的問題,只要非法用戶愿意,他就能夠輕松的獲取軟件源碼,從而獲得一些商業(yè)信息。因此,防止反編譯就成為了一個非常重要的內(nèi)容。

1 防反編譯起源

Java程序自誕生起的一個目標(biāo)就是跨平臺,為了實現(xiàn)這個目標(biāo),Java程序選擇將源碼編譯成平臺無關(guān)的class文件,編譯的過程不是直接產(chǎn)生機(jī)器碼,而是將源碼符號化和標(biāo)記化,這就為反編譯創(chuàng)造了條件?,F(xiàn)在市面上有很多流行的反編譯軟件,能夠輕松的將class文件反編譯成源碼。一旦獲得了源碼就等于是獲得了軟件的所有信息,這對于軟件的開發(fā)者非常的不利。畢竟很多軟件都是收費(fèi)的,擁有版權(quán)信息,甚至于很多軟件還包含了商業(yè)公司的重要機(jī)密,一旦軟件被反編譯,這就意味著軟件不再擁有版權(quán),因為竊取者能夠通過修改源碼輕松的破解版權(quán)保護(hù),甚至通過閱讀源碼輕松的獲取商業(yè)機(jī)密。因此,Java軟件的防反編譯就成為了一項非常重要的內(nèi)容,是很多J2EE項目的基本組成部分。為了防止反編譯,目前市面上主流的技術(shù)有代碼混淆、class文件加密、JNI本地代碼和class文件隔離[1]。

2 代碼混淆

代碼混淆是一種最基本的防反編譯方式。前面說過,由于Java的編譯過程就是將源碼簡單的符號化和標(biāo)記化。因此代碼混淆主要是將class文件中的符號進(jìn)行修改,將其復(fù)雜化,這樣就加大了class文件反編譯的難度,同時,反編譯后的源碼也難以閱讀。由于這種方式并沒有對class文件進(jìn)行加密,因此源碼仍然可以獲得,只不過是增加了閱讀的難度而已,對于耐心的程序員這都不是問題。同時,由于對class文件進(jìn)行了混淆,有可能會造成class文件無法被Java虛擬機(jī)正常執(zhí)行?,F(xiàn)在市面上有很多代碼混淆軟件,有免費(fèi)的也有收費(fèi)的。代碼混淆只是初級的防反編譯技術(shù),僅僅做了最低程度的保護(hù)。如果對Java軟件有著較高的安全要求,代碼混淆技術(shù)無法勝任[2]。

3 class文件加密

既然明文形式形式的class文件很容易被反編譯,如果將class文件進(jìn)行加密,class文件以密文形式交給用戶,這樣非法用戶就無法通過反編譯class文件來竊取軟件源碼。這樣做有一個問題就是所有的class文件都必須要交給Java虛擬機(jī)去執(zhí)行,而Java虛擬機(jī)是無法識別加密的class文件的,因此在交給虛擬機(jī)執(zhí)行以前,class文件必須解密。Java虛擬機(jī)通過classloader來加載class文件,因此,為了解決這個問題,通常要提供自己的classloader類,在將類最終交給Java執(zhí)行之前,會將類解密。這樣,class文件只會在內(nèi)存中被解密,不會以明文形式存在于用戶的系統(tǒng)中,從而保證了class文件不會被反編譯。這種方式最大的問題就是用戶自己實現(xiàn)的classloader不可能被加密,因為它是首先被Java虛擬機(jī)加載的。所以,如果用戶將最初的classloader進(jìn)行反編譯,獲得源碼,就能夠獲得將其他類解密的方式,從而將其他的class文件解密,然后反編譯,最終獲得源碼。因此,為了防止非法用戶反編譯最初的classloader文件,通常的做法是將最初的classloader文件盡可能的隱藏起來,防止用戶找到。這種方式治標(biāo)不治本,如果非法用戶有足夠的耐心,他還是能夠找到那個未加密的class文件,從而竊取整個軟件的源代碼。

4 JNI本地代碼

Java通過JNI方式來實現(xiàn)和C/C++代碼的相互調(diào)用,而C/C++編譯成的可執(zhí)行代碼是無法反編譯的。這就又提供了一種方式,就是將核心重要的代碼用C/C++寫成,然后用Java程序調(diào)用它。這樣做確實可以防止反編譯,但是由于沒有使用Java語言,就喪失了很多Java語言的優(yōu)勢,并且這樣做其實本質(zhì)上是用C/C++語言而不是Java語言,這里不多做研究。

5 class文件隔離

class文件存儲在用戶系統(tǒng)上很容易被用戶反編譯,那么如果不將class文件存儲在用戶系統(tǒng)上,用戶也就無法反編譯了。為了做到這一點(diǎn),需要客戶端-服務(wù)端雙層架構(gòu)。所有的應(yīng)用程序邏輯都存放到服務(wù)端,服務(wù)端提供訪問接口,客戶端通過接口訪問服務(wù)端提供的服務(wù)。這種方式由于沒有class文件存放在客戶端,因此用戶也就無法通過反編譯class文件來獲取應(yīng)用邏輯。但是這種方式必須要求雙層架構(gòu),因此適用場景有限。很多時候用戶都只需要一個單獨(dú)的應(yīng)用程序運(yùn)行在本地,沒有網(wǎng)絡(luò)訪問,對于這種情形,就無法實現(xiàn)class文件的隔離。

6 JVMTI加密

上面羅列的幾種防止反編譯的方法都不能夠有效的防止反編譯,不是不徹底就是使用場景有限。下面本文將討論一種新的防止反編譯的方法。

JVMTI是JDK提供的一套用于開發(fā)JVM監(jiān)控, 問題定位與性能調(diào)優(yōu)工具的通用編程接口(API)。通過JVMTI,我們可以開發(fā)各式各樣的Java虛擬機(jī)應(yīng)用,這種應(yīng)用的表現(xiàn)形式是一個以C/C++語言編寫的動態(tài)共享庫。Java虛擬機(jī)啟動或運(yùn)行時,動態(tài)加載一個外部基于JVM TI編寫的動態(tài)模塊到Java進(jìn)程內(nèi),這個動態(tài)模塊就是基于JVMTI編寫的JAVA虛擬機(jī)應(yīng)用,然后觸發(fā)JVM原生線程Attach Listener來執(zhí)行這個動態(tài)模塊的回調(diào)函數(shù)。在回調(diào)函數(shù)體內(nèi),你可以獲取各種各樣的VM級信息,注冊感興趣的VM事件,甚至控制VM的行為。

JVMTI提供的接口中包含了一個加載class之前調(diào)用的回調(diào)接口,內(nèi)容如下:

typedef void (JNICALL *jvmtiEventClassFileLoadHook)

(jvmtiEnv *jvmti_env,

JNIEnv* jni_env,

jclass class_being_redefined,

jobject loader,

const char* name,

jobject protection_domain,

jint class_data_len,

const unsigned char* class_data,

jint* new_class_data_len,

unsigned char** new_class_data);

在Java虛擬機(jī)裝載一個類之前會調(diào)用該接口,接口參數(shù)中包含了加載到Java虛擬機(jī)的原始的class文件數(shù)據(jù),以及接口調(diào)用完畢之后新的class文件數(shù)據(jù)。當(dāng)接口調(diào)用完后Java虛擬機(jī)會加載新的class數(shù)據(jù)并且運(yùn)行。這就為防止反編譯提供了新的思路。如果我們將class文件加密后交付給用戶,然后實現(xiàn)一個解密動態(tài)模塊,該動態(tài)模塊實現(xiàn)了對class文件的解密。這樣,當(dāng)Java虛擬機(jī)加載加密的class文件之前會調(diào)用解密動態(tài)模塊,解密模塊將class文件數(shù)據(jù)在內(nèi)存中進(jìn)行解密,然后Java虛擬機(jī)會加載揭秘過后的原始的class文件數(shù)據(jù)并且運(yùn)行。通過這種方式,用戶系統(tǒng)中沒有任何未加密的class文件,并且所有的應(yīng)用邏輯仍然是以Java寫成,應(yīng)用開發(fā)者只需要編寫一個通用的解密動態(tài)模塊,然后將應(yīng)用程序包含的所有class文件加密,將加密的應(yīng)用程序和解密動態(tài)模塊一起交付給用戶,解密動態(tài)模塊由C/C++編寫而成,是二進(jìn)制機(jī)器碼,無法反編譯,因而class文件也無法反編譯,從而實現(xiàn)了防反編譯。

[1]李林蔚.Java字節(jié)碼文件保護(hù)分析與研究[J].內(nèi)江職業(yè)技術(shù)學(xué)院學(xué)報,2014(3):51-52.

[2]林漢玲,方穎玨,王曉峰.密碼技術(shù)在Java類文件保護(hù)技術(shù)中的新應(yīng)用[J].現(xiàn)代電子技術(shù),2013,36(3):102-103.

Research on Anti - Compiler Technology of JAVA

Jiao Yong Lai Na

Twenty-eighth Research Institute of China Electronic Science and technology group, Nanjing 210000, Jiangsu, China

with the rise of Internet technology, JAVA programming language is playing a more and more important role, more and more Internet applications using JAVA programming language. However, due to the open nature of the JAVA language and platform independent characteristics, JAVA code is not directly compiled into binary executable code, but compiled into class files. Class files can be easily compiled source code, so that the use of JAVA into the program is very easy to be cracked, the leak of the application logic or illegal use. This paper first from the most general anti compiler technology, analysis of the current popular anti compiler technology in the market, and finally put forward a new anti compilation technology, can effectively prevent the JAVA program is anti compiler.

JAVA anti - Anti - compiler technology; research

TP312.2

A

1009-6434(2016)10-0012-02

猜你喜歡
源碼解密代碼
面向數(shù)據(jù)可靠傳輸?shù)母咦g碼率帶反饋的LT碼
炫詞解密
國內(nèi)一站式工程設(shè)備租賃平臺眾能聯(lián)合完成C2、C3兩輪融資
淺談開源操作系統(tǒng)的歷史
解密“一包三改”
企業(yè)如何保護(hù)源碼
炫詞解密
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
西平县| 房山区| 东丽区| 无为县| 西城区| 蕲春县| 司法| 滕州市| 卢龙县| 龙川县| 阿克苏市| 金门县| 陆丰市| 娄烦县| 高邮市| 遂平县| 弥勒县| 隆安县| 永州市| 通山县| 资溪县| 遂平县| 丰城市| 双鸭山市| 浮梁县| 兴安盟| 昭苏县| 佛坪县| 红河县| 周宁县| 合山市| 平陆县| 云安县| 明水县| 义马市| 西贡区| 石城县| 新蔡县| 长葛市| 沂源县| 双城市|