![JAVA反編譯和源代碼保護(hù)_第1頁(yè)](http://file4.renrendoc.com/view/7d8e6ae798aaecfa195724b16c2a3f33/7d8e6ae798aaecfa195724b16c2a3f331.gif)
![JAVA反編譯和源代碼保護(hù)_第2頁(yè)](http://file4.renrendoc.com/view/7d8e6ae798aaecfa195724b16c2a3f33/7d8e6ae798aaecfa195724b16c2a3f332.gif)
![JAVA反編譯和源代碼保護(hù)_第3頁(yè)](http://file4.renrendoc.com/view/7d8e6ae798aaecfa195724b16c2a3f33/7d8e6ae798aaecfa195724b16c2a3f333.gif)
![JAVA反編譯和源代碼保護(hù)_第4頁(yè)](http://file4.renrendoc.com/view/7d8e6ae798aaecfa195724b16c2a3f33/7d8e6ae798aaecfa195724b16c2a3f334.gif)
![JAVA反編譯和源代碼保護(hù)_第5頁(yè)](http://file4.renrendoc.com/view/7d8e6ae798aaecfa195724b16c2a3f33/7d8e6ae798aaecfa195724b16c2a3f335.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2.10Java反編譯和源代碼保護(hù)一、反編譯反編譯是一個(gè)將目標(biāo)代碼轉(zhuǎn)換成源代碼的過(guò)程。目標(biāo)代碼是一種用機(jī)器語(yǔ)言表示的代碼,這種語(yǔ)言能通過(guò)實(shí)機(jī)或虛擬機(jī)直接執(zhí)行。當(dāng)C編譯器編譯生成一個(gè)對(duì)象的目標(biāo)代碼時(shí),該目標(biāo)代碼是為某一特定硬件平臺(tái)運(yùn)行而產(chǎn)生的,在編譯過(guò)程中,編譯程序通過(guò)查表將所有符號(hào)的引用轉(zhuǎn)換為特定的內(nèi)存偏移量。目標(biāo)代碼只能在特定的CPU上運(yùn)行。而Java編譯器為了保證目標(biāo)代碼的可移植性,并不將對(duì)變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過(guò)程中的內(nèi)存布局,而是將這些符號(hào)引用信息保留在字節(jié)碼中,由Java虛擬機(jī)在運(yùn)行過(guò)程中創(chuàng)立內(nèi)存布局,然后再通過(guò)查表來(lái)確定一個(gè)方法所在的地址。由于其相對(duì)簡(jiǎn)單的Java虛擬機(jī)(與真實(shí)的微處理器相比)和規(guī)范的字節(jié)碼格式,由Java字節(jié)碼(Bytecode)反編譯成源代碼的過(guò)程相對(duì)于C語(yǔ)言來(lái)說(shuō)要簡(jiǎn)單許多,因此,當(dāng)前反編譯Java程序頗為盛行。在介紹Java反編譯器之前,要提及JDK自帶的一個(gè)工具javap,它是一個(gè)Java代碼反匯編器。反匯編器和反編譯器是不同的,使用javap反匯編的Java類(lèi)文件可得到數(shù)據(jù)區(qū)定義、方法和類(lèi)的引用等信息。例如,下面是對(duì)HelloWorld.class反匯編后的部分信息:C:\JExamples>javap-cHelloWorldCompiledfrom"helloworld.java"publicclassHelloWorldextendsjava.lang.Object{publicHelloWorld();Code:0: aload_01: invokespecial#1;//Methodjava/lang/Object."<init>":()V4: return由此可見(jiàn)在Java字節(jié)碼中蘊(yùn)藏了大量的信息。Java反編譯器就是利用類(lèi)文件中的潛在信息和語(yǔ)言規(guī)范等猜測(cè)出源代碼的。沒(méi)有一個(gè)反編譯器能夠保證準(zhǔn)確無(wú)誤地翻譯出源代碼,而且每個(gè)反編譯器自身也存在各種不同的漏洞。但是我們不可輕視反編譯器的威力,它還是能比較準(zhǔn)確地翻譯出部分甚至全部的源代碼。下面是一個(gè)具體的例子(圖1所示),利用Java反編譯器Jode(Jode的下載位置:/download.html)成功地反編譯了HelloWorld.class:Ill4Jode[c]1993^2901JochenHoenicke<juchen^gnu.oig>FilmOptions□HellcM/oridpnhlicdasEHelloYarlipullicaticvoidniai^.Ill4Jode[c]1993^2901JochenHoenicke<juchen^gnu.oig>FilmOptions□HellcM/oridpnhlicdasEHelloYarlipullicaticvoidniai^.(SttriiiE[-呂t『ings){S^steTi.out.jriiitlrLCMeLloWorld!rt);HelleWorld-DecampiledlyJUDE*Visittittp://jode.sourceforge,net/圖1Jode反編譯HelloWorld.class反編譯對(duì)安全構(gòu)成的威脅是顯而易見(jiàn)的,因此源碼保護(hù)也就必不可少。其實(shí),反編譯和代碼保護(hù)是一場(chǎng)無(wú)休止的斗爭(zhēng),雙方都在爭(zhēng)斗中得以發(fā)展。目前保護(hù)源碼的方法大致可以歸為三類(lèi):加密、模糊和定制Java的類(lèi)裝載器。所謂加密,就是在Java應(yīng)用程序分發(fā)之前,使用加密工具進(jìn)行加密。流行的加密工具有PGP(PrettyGoodPrivacy)和GPG(GnuPrivacyGuard)等。但最終用戶(hù)在運(yùn)行應(yīng)用之前必須先進(jìn)行解密,解密之后最終用戶(hù)就有了一份不加密的類(lèi)文件,所以加密只能對(duì)軟件分發(fā)的中間環(huán)節(jié)進(jìn)行有效保護(hù),其實(shí)際效用大大減弱。二、模糊技術(shù)模糊技術(shù)(Obfuscator)就是對(duì)源代碼進(jìn)行模糊化處理的行為。經(jīng)過(guò)模糊處理后的代碼,將失去了一此可讀性,程序員很難識(shí)別代碼的用意。舉例來(lái)說(shuō),有如下的源代碼:publicclassHillSort{publicstaticString[]sort(String[]stringArray){Stringtmp;booleanexchange;for(inti=0;i<stringArray.length-1;i++){exchange=false;for(intj=stringArray.length-2;j>=i;j--){if(stringArray[j+1].compareTo(stringArray[j])<0){tmp=stringArray[j+1];stringArray[j+1]=stringArray[j];stringArray[j]=tmp;exchange=true;}}if(!exchange){break;}}returnstringArray;}???}利用模糊處理器Smokescreen(Smokescreen是一個(gè)Java模糊器軟件,其下載位置:/smokescreen/licensedownload.html,對(duì)HillSort.class進(jìn)行模糊處理得到A.class,然后,再利用Jode對(duì)A.class反編譯,得到的源代碼如下:publicclassA{publicstaticString[]A(String[]strings){inti=0;GOTOflow_2_32_flow_2_32_:inti;IF(i>=strings.length-1)GOTOflow_72_33_String[]strings_0_=strings;booleanbool=false;inti_1_=strings_0_.length-2;for(;;){IF(i_1_<i)GOTOflow_75_34_if(strings[i_1_+1].compareTo(strings[i_1_])<0){booleanbool_2_=true;Stringstring=strings[i_1_+1];strings[i_1_+1]=strings[i_1_];strings[i_1_]=string;bool=bool_2_;}i_1_--;}flow_70_35_:String[]strings_3_=null;GOTOflow_71_36_static{???}}模糊處理器把可讀的有意義的變量名、方法名,有時(shí)甚至是類(lèi)名、包名轉(zhuǎn)換成沒(méi)有意義的字符串,讓人難以閱讀程序,但對(duì)于JVM來(lái)說(shuō),其在本質(zhì)上和原來(lái)的程序是一樣的。在上例中類(lèi)名HillSort變?yōu)锳,方法名sort變?yōu)锳,變量名stringArray變?yōu)閟trings,我們已經(jīng)不可能簡(jiǎn)單地從這些名稱(chēng)了解這段代碼的功能。有的模糊處理器更進(jìn)一步,甚至采用非法的字符串來(lái)替代類(lèi)文件中的標(biāo)記,有意地違反了Java的規(guī)范。這些古怪的用法也可能造成Java虛擬機(jī)不能作出合法的反應(yīng)(尤其在瀏覽器中)。例如,一個(gè)像“=”這樣的變量與Java的規(guī)范是相反的;一些虛擬機(jī)可以忽略它,而另一些不可以這樣。模糊處理器除了對(duì)符號(hào)名進(jìn)行轉(zhuǎn)換,還可能修改字節(jié)碼值指令,以模糊方法中的指令控制流,使得反編譯的工作更難。上例中就被加入大量的GOTO語(yǔ)句。模糊處理器還會(huì)在字節(jié)碼中添加一些俗稱(chēng)“炸彈”的代碼,反編譯器如果不能忽略或告警,常??赡軐?dǎo)致自身崩潰。例如一些模糊處理器會(huì)在return語(yǔ)句后面插入無(wú)意義的代碼,確保Java虛擬機(jī)不會(huì)被執(zhí)行它,反編譯器卻可能沒(méi)有識(shí)別這個(gè)障礙。模糊處理器也有一些不足之處,main方法不會(huì)被模糊處理,這是既定的類(lèi)入口函數(shù),否則Java虛擬機(jī)無(wú)法運(yùn)行該類(lèi),本地方法不會(huì)被模糊處理。另外,調(diào)用Class.forName()時(shí)指定的類(lèi)名字符串,不會(huì)被模糊處理,模糊處理會(huì)提供模糊轉(zhuǎn)換前后的名稱(chēng)映射表,手工修改此處的類(lèi)名字符串為轉(zhuǎn)換后的名稱(chēng),即可解決該問(wèn)題。反編譯和模糊處理的技術(shù)都在發(fā)展,越來(lái)越復(fù)雜。這方面的工具也越來(lái)越多,大多既支持命令行,也支持圖形界面。三、類(lèi)裝載器在介紹如何定制類(lèi)裝載器(ClassLoader)前,先要了解Java的運(yùn)行機(jī)制。Java應(yīng)用程序啟動(dòng)時(shí),在運(yùn)行指定類(lèi)的main方法前,虛擬機(jī)首先要裝載該類(lèi)的字節(jié)碼,然后還要執(zhí)行鏈接和初始化的準(zhǔn)備工作。例如運(yùn)行HelloWorld時(shí),Java虛擬機(jī)試圖執(zhí)行類(lèi)HelloWorld的main方法,但發(fā)現(xiàn)該類(lèi)并沒(méi)有被裝載,于是虛擬機(jī)使用ClassLoader尋找并裝載HelloWorld的字節(jié)碼。如果這個(gè)裝載過(guò)程失敗,則拋出一個(gè)異常;如果HelloWorld被成功裝載,HelloWorld的main方法才會(huì)進(jìn)一步被調(diào)用。Java運(yùn)行時(shí)裝入字節(jié)碼的機(jī)制意味著可以對(duì)字節(jié)碼和裝載過(guò)程進(jìn)行修改。一個(gè)稱(chēng)為ClassLoader的對(duì)象負(fù)責(zé)為JVM裝載類(lèi)的字節(jié)碼。JVM給ClassLoader一個(gè)待裝入類(lèi)的名字(比如HelloWorld),然后由ClassLoader負(fù)責(zé)找到類(lèi)文件,裝入原始數(shù)據(jù),并把它轉(zhuǎn)換成一個(gè)Class對(duì)象。我們可以對(duì)類(lèi)文件進(jìn)行加密,當(dāng)其通過(guò)定制ClassLoader裝載時(shí)再進(jìn)行解密,解密后的字節(jié)碼保存在內(nèi)存中,這樣竊密者很難得到解密后的代碼。定制ClassLoader既要完成原來(lái)所承擔(dān)的工作,又要完成即時(shí)解密的任務(wù)。類(lèi)裝載器實(shí)現(xiàn)的核心代碼如下:importjava.io.*;importjava.security.*;importjava.lang.reflect.*;importjavax.crypto.*;importjavax.crypto.spec.*;publicclassXClassLoaderextendsClassLoader{privatefinalStringCRYPT_ALGORITHM="DES";privateCiphercipher=null;publicXClassLoader(StringkeyFile)throwsIOException,GeneralSecurityException{bytekeyData[]=Util.readFile(keyFile);SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(CRYPT_ALGORITHM);SecretKeysecretKey=keyFactory.generateSecret(newDESKeySpec(keyData));cipher=Cipher.getInstance(CRYPT_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE,secretKey,newSecureRandom());}publicClassloadClass(Stringname,booleanresolve)throwsClassNotFoundException{Classclasz=null;//檢查類(lèi)是否已被裝載if(null!=(clasz=findLoadedClass(name))){returnclasz;}//定制裝載處理try{//讀取加密的類(lèi)文件byteencodedClass[]=Util.readFile(name+".class");if(null!=encodedClass&&null!=cipher){//解密bytedecodedClass[]=cipher.doFinal(encodedClass);//創(chuàng)建類(lèi)實(shí)例if(decodedClass!=null){clasz=defineClass(name,decodedClass,0,decodedClass.length);}}}catch(Exceptione){}//如果上面沒(méi)有成功,用默認(rèn)的ClassLoader裝入它if(clasz==null){clasz=findSystemClass(name);//裝入相關(guān)的類(lèi)if(resolve&&clasz!=null){resolveClass(clasz);}if(clasz==null){thrownewClassNotFoundException();}returnclasz;}staticpublicvoidmain(Stringargs[])throwsException{if(args.length<2){System.out.println("Usage:javaXClassLoaderkeyFileApplication[args0][args1]...");return;}StringkeyFile=args[0];//密匙文件StringappName=args[1];//應(yīng)用實(shí)例類(lèi)名StringappArgs[]=null;//應(yīng)用實(shí)例的命令行參數(shù)if(args.length>2){appArgs=newString[args.length-2];System.arraycopy(args,2,appArgs,0,args.length-2);}//創(chuàng)建解密的ClassLoaderXClassLoaderxClassLoader=newXClassLoader(keyFile);//裝載應(yīng)用實(shí)例的字節(jié)碼,并創(chuàng)建一個(gè)類(lèi)實(shí)例ClassappClass=xClassLoader.loadClass(appName);//通過(guò)ReflectionAPI,獲取應(yīng)用實(shí)例的main()方法引用Methodmain=appClass.getMethod("main",newClass[]{(newString[1]).getClass()});//調(diào)用main()main.invoke(null,newObject[]{appArgs});}}publicclassUtil{//把文件讀入byte數(shù)組staticpublicbyte[]readFile(Stringfilename)throwsIOException{Filefile=newFile(filename);bytedata[]=newbyte[(int)file.length()];FileInputStreamfin=newFileInputStream(file);intr=fin.read(data);if(r!=data.length)thrownewIOException("Notcompletereadingfile:"+file);fin.close();returndata;}//把byte數(shù)組寫(xiě)出到文件staticpublicvoidwriteFile(Stringfilename,bytedata[])throwsIOException{FileOutputStreamfout=newFileOutputStream(filename);fout.write(data);fout.close();}}類(lèi)加密器實(shí)現(xiàn)的核心代碼如下:importjava.io.*;importjava.security.*;importjavax.crypto.*;publicclassXClassEncode{staticprivatefinalStringCRYPT_ALGORITHM="DES";staticpublicStringkeyFile="key.data";//生成密匙,并把密匙保存到文件staticprivateSecretKeygenerateKey()throwsIOException,GeneralSecurityException{KeyGeneratorkg=KeyGenerator.getInstance(CRYPT_ALGORITHM);kg.init(newSecureRandom());SecretKeykey=kg.generateKey();Util.writeFile(keyFile,key.getEncoded());returnkey;}staticpublicvoidmain(Stringargs[])throwsException{if(args.length<1){System.out.println("Usage:javaXClassEncode[class1][clsss2]...");System.out.println("Output:key.data
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 季節(jié)性主題活動(dòng)設(shè)置方案計(jì)劃
- 錨桿轉(zhuǎn)載機(jī)組、掘錨機(jī)、錨桿鉆車(chē)擴(kuò)建技術(shù)改造建設(shè)項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-拿地備案
- 十年回顧:2010年以來(lái)那些重大的網(wǎng)絡(luò)安全事件盤(pán)點(diǎn)
- 2025-2030全球車(chē)用拉力缸行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球生物過(guò)程深層流過(guò)濾行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球模擬拉線(xiàn)延長(zhǎng)位置探頭行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球LPWAN物聯(lián)網(wǎng)模塊行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)電動(dòng)汽車(chē)轉(zhuǎn)子鐵芯行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)翻新電池行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球汽車(chē)MIMO智能天線(xiàn)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年公安機(jī)關(guān)理論考試題庫(kù)附答案【考試直接用】
- 課題申報(bào)參考:共同富裕進(jìn)程中基本生活保障的內(nèi)涵及標(biāo)準(zhǔn)研究
- 2025中國(guó)聯(lián)通北京市分公司春季校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 康復(fù)醫(yī)學(xué)科患者隱私保護(hù)制度
- 環(huán)保工程信息化施工方案
- 紅色中國(guó)風(fēng)2025蛇年介紹
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 高中學(xué)校開(kāi)學(xué)典禮方案
- 2024年度中國(guó)郵政集團(tuán)公司縣分公司工作總結(jié)
- DL∕T 1844-2018 濕式靜電除塵器用導(dǎo)電玻璃鋼陽(yáng)極檢驗(yàn)規(guī)范
- JTG D62-2004 公路鋼筋混凝土及預(yù)應(yīng)力混凝土橋涵設(shè)計(jì)規(guī)范
評(píng)論
0/150
提交評(píng)論