版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
java反編譯常用的保護技術(shù)Java作為解釋型的語言,其高度抽象的特性意味其很容易被反編譯,容易被反編譯,自然有防止反編譯措施存在。今天就拜讀了一篇相關(guān)的文章,受益匪淺,知彼知己嘛??!之所以會對java的反編譯感興趣,那是因為自己在學(xué)習(xí)的過程中,常常需要借鑒一下別人的成果(你懂的...)?;蛟S反編譯別人的代碼不怎么道德,這個嘛......廢話不多說,正文如下:常用的保護技術(shù)由于Java字節(jié)碼的抽象級別較高,因此它們較容易被反編譯。本節(jié)介紹了幾種常用的方法,用于保護Java字節(jié)碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環(huán)境和弱點。1.隔離Java程序最簡單的方法就是讓用戶不能夠訪問到JavaClass程序,這種方法是最根本的方法,具體實現(xiàn)有多種方式。例如,開發(fā)人員可以將關(guān)鍵的JavaClass放在服務(wù)器端,客戶端通過訪問服務(wù)器的相關(guān)接口來獲得服務(wù),而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過接口提供服務(wù)的標準和協(xié)議也越來越多,例如HTTP、WebService、RPC等。但是有很多應(yīng)用都不適合這種保護方式,例如對于單機運行的程序就無法隔離Java程序。這種保護方式見圖1所示。圖1隔離Java程序示意圖2.對Class文件進行加密為了防止Class文件被直接反編譯,許多開發(fā)人員將一些關(guān)鍵的Class文件進行加密,例如對注冊碼、序列號管理相關(guān)的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而后再將這些類裝載到JVM當中。這些類的解密可以由硬件完成,也可以使用軟件完成。在實現(xiàn)時,開發(fā)人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由于安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而后進行解密,最后將解密后的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常關(guān)鍵的類。由于它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。如果相關(guān)的解密密鑰和算法被攻克,那么被加密的類也很容易被解密。這種保護方式示意圖見圖2。圖2對Class文件進行加密示意圖3.轉(zhuǎn)換成本地代碼將程序轉(zhuǎn)換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發(fā)人員可以選擇將整個應(yīng)用程序轉(zhuǎn)換成本地代碼,也可以選擇關(guān)鍵模塊轉(zhuǎn)換。如果僅僅轉(zhuǎn)換關(guān)鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術(shù)進行調(diào)用。當然,在使用這種技術(shù)保護Java程序的同時,也犧牲了Java的跨平臺特性。對于不同的平臺,我們需要維護不同版本的本地代碼,這將加重軟件支持和維護的工作。不過對于一些關(guān)鍵的模塊,有時這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數(shù)字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調(diào)用相關(guān)JNI方法。這種保護方式示意圖見圖3。圖3轉(zhuǎn)換成本地代碼示意圖4.代碼混淆代碼混淆是對Class文件進行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能(語義)。但是混淆后的代碼很難被反編譯,即反編譯后得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是從實際情況來看,由于混淆技術(shù)的多元化發(fā)展,混淆理論的成熟,經(jīng)過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術(shù),因為混淆是一種保護Java程序的重要技術(shù)。圖4是代碼混淆的示圖。圖4代碼混淆示意圖幾種技術(shù)的總結(jié)以上幾種技術(shù)都有不同的應(yīng)用環(huán)境,各自都有自己的弱點,表1是相關(guān)特點的比較?;煜夹g(shù)介紹表1不同保護技術(shù)比較表到目前為止,對于Java程序的保護,混淆技術(shù)還是最基本的保護方法。Java混淆工具也非常多,包括商業(yè)的、免費的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對Class文件進行混淆處理,也有少量工具首先對源代碼進行處理,然后再對Class進行處理,這樣加大了混淆處理的力度。目前,商業(yè)上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和4的SourceGuard等。主要的混淆技術(shù)按照混淆目標可以進行如下分類,它們分別為符號混淆(LexicalObfuscation)、數(shù)據(jù)混淆(DataObfuscation)、控制混淆(ControlObfuscation)、預(yù)防性混淆(PreventTransformation)。符號混淆在Class中存在許多與程序執(zhí)行本身無關(guān)的信息,例如方法名稱、變量名稱,這些符號的名稱往往帶有一定的含義。例如某個方法名為getKeyLength(),那么這個方法很可能就是用來返回Key的長度。符號混淆就是將這些信息打亂,把這些信息變成無任何意義的表示,例如將所有的變量從vairant_001開始編號;對于所有的方法從method_001開始編號。這將對反編譯帶來一定的困難。對于私有函數(shù)、局部變量,通??梢愿淖兯鼈兊姆枺挥绊懗绦虻倪\行。但是對于一些接口名稱、公有函數(shù)、成員變量,如果有其它外部模塊需要引用這些符號,我們往往需要保留這些名稱,否則外部模塊找不到這些名稱的方法和變量。因此,多數(shù)的混淆工具對于符號混淆,都提供了豐富的選項,讓用戶選擇是否、如何進行符號混淆。數(shù)據(jù)混淆圖5改變數(shù)據(jù)訪問數(shù)據(jù)混淆是對程序使用的數(shù)據(jù)進行混淆。混淆的方法也有多種,主要可以分為改變數(shù)據(jù)存儲及編碼(StoreandEncodeTransform)、改變數(shù)據(jù)訪問(AccessTransform)。改變數(shù)據(jù)存儲和編碼可以打亂程序使用的數(shù)據(jù)存儲方式。例如將一個有10個成員的數(shù)組,拆開為10個變量,并且打亂這些變量的名字;將一個兩維數(shù)組轉(zhuǎn)化為一個一維數(shù)組等。對于一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),我們將打亂它的數(shù)據(jù)結(jié)構(gòu),例如用多個類代替一個復(fù)雜的類等。另外一種方式是改變數(shù)據(jù)訪問。例如訪問數(shù)組的下標時,我們可以進行一定的計算,圖5就是一個例子。在實踐混淆處理中,這兩種方法通常是綜合使用的,在打亂數(shù)據(jù)存儲的同時,也打亂數(shù)據(jù)訪問的方式。經(jīng)過對數(shù)據(jù)混淆,程序的語義變得復(fù)雜了,這樣增大了反編譯的難度??刂苹煜刂苹煜褪菍Τ绦虻目刂屏鬟M行混淆,使得程序的控制流更加難以反編譯,通常控制流的改變需要增加一些額外的計算和控制流,因此在性能上會給程序帶來一定的負面影響。有時,需要在程序的性能和混淆程度之間進行權(quán)衡。控制混淆的技術(shù)最為復(fù)雜,技巧也最多。這些技術(shù)可以分為如下幾類:增加混淆控制通過增加額外的、復(fù)雜的控制流,可以將程序原來的語義隱藏起來。例如,對于按次序執(zhí)行的兩個語句A、B,我們可以增加一個控制條件,以決定B的執(zhí)行。通過這種方式加大反匯編的難度。但是所有的干擾控制都不應(yīng)該影響B(tài)的執(zhí)行。圖6就給出三種方式,為這個例子增加混淆控制。圖6增加混淆控制的三種方式控制流重組重組控制流也是重要的混淆方法。例如,程序調(diào)用一個方法,在混淆后,可以將該方法代碼嵌入到調(diào)用程序當中。反過來,程序中的一段代碼也可以轉(zhuǎn)變?yōu)橐粋€函數(shù)調(diào)用。另外,對于一個循環(huán)的控制流,可以拆分為多個循環(huán)的控制流,或者將循環(huán)轉(zhuǎn)化成一個遞歸過程。這種方法最為復(fù)雜,研究的人員也非常多。預(yù)防性混淆這種混淆通常是針對一些專用的反編譯器而設(shè)計的,一般來說,這些技術(shù)利用反編譯器的弱點或者Bug來設(shè)計混淆方案。例如,有些反編譯器對于Return后面的指令不進行反編譯,而有些混淆方案恰恰將代碼放在Return語句后面。這種混淆的有效性對于不同反編譯器的作用也不太相同的。一個好的混淆工具,通常會綜合使用這些混淆技術(shù)。案例分析在實踐當中,保護一個大型Java程序經(jīng)常需要綜合使用這些方法,而不是單一使用某一種方法。這是因為每種方法都有其弱點和應(yīng)用環(huán)境。綜合使用這些方法使得Java程序的保護更加有效。另外,我們經(jīng)常還需要使用其它的相關(guān)安全技術(shù),例如安全認證、數(shù)字簽名、PKI等。本文給出的例子是一個Java應(yīng)用程序,它是一個SCJP(SunCertificateJavaProgrammer)的模擬考試軟件。該應(yīng)用程序帶有大量的模擬題目,所有的題目都被加密后存儲在文件中。由于它所帶的題庫是該軟件的核心部分,所以關(guān)于題庫的存取和訪問就成為非常核心的類。一旦這些相關(guān)的類被反編譯,則所有的題庫將被破解?,F(xiàn)在,我們來考慮如何保護這些題庫及相關(guān)的類。在這個例子中,我們考慮使用綜合保護技術(shù),其中包括本地代碼和混淆技術(shù)。因為該軟件主要發(fā)布在Windows上,因此轉(zhuǎn)換成本地代碼后,僅僅需要維護一個版本的本地代碼。另外,混淆對Java程序也是非常有效的,適用于這種獨立發(fā)布的應(yīng)用系統(tǒng)。在具體的方案中,我們將程序分為兩個部分,一個是由本地代碼編寫的題庫訪問的模塊,另外一個是由Java開發(fā)的其它模塊。這樣可以更高程度地保護題目管理模塊不被反編譯。對于Java開發(fā)的模塊,我們?nèi)匀灰褂没煜夹g(shù)。該方案的示意圖參見圖7。圖7SCJP保護技術(shù)方案圖對于題目管理模塊,由于程序主要在Windows下使用,所以使用C++開發(fā)題庫訪問模塊,并且提供了一定的訪問接口。為了保護題庫訪問的接口,我們還增加了一個初始化接口,用于每次使用題庫訪問接口之前的初始化工作。它的接口主要分為兩類:1.初始化接口在使用題庫模塊之前,我們必須先調(diào)用初始化接口。在調(diào)用該接口時,客戶端需要提供一個隨機數(shù)作為參數(shù)。題庫管理模塊和客戶端通過這個隨機數(shù),按一定的算法同時生成相同的SessionKey,用于加密以后輸入和輸出的所有數(shù)據(jù)。通過這種方式,只有授權(quán)(有效)的客戶端才能夠連接正確的連接,生成正確的SessionKey,用于訪問題庫信息。非法的客戶很難生成正確的SessionKey,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海關(guān)出口報關(guān)合同
- 合同采用fidic條文
- 幼兒園《哈哈小孩》教學(xué)課件設(shè)計
- 煤礦工會管理相關(guān)制度匯編
- 農(nóng)村臨時救助申請書3篇
- 路演活動策劃方案(共6篇)
- 2024勞動合同保密協(xié)議
- 2024車輛汽車買賣合同
- 生物谷解決方案
- 深圳大學(xué)《音樂剪輯與制作》2023-2024學(xué)年第一學(xué)期期末試卷
- 《耳穴療法治療失眠》課件
- 詢盤分析及回復(fù)
- 氯化工藝安全培訓(xùn)課件
- 指導(dǎo)巡察工作精細科學(xué)
- 企業(yè)法律知識培訓(xùn)消費者權(quán)益保護實務(wù)
- 快樂讀書吧-讀后分享課:《十萬個為什么》教學(xué)案列
- 2024年 貴州茅臺酒股份有限公司招聘筆試參考題庫含答案解析
- 河上建壩糾紛可行性方案
- 第五單元學(xué)雷鋒在行動(教案)全國通用五年級下冊綜合實踐活動
- 2024年華融實業(yè)投資管理有限公司招聘筆試參考題庫含答案解析
- 2024年1月普通高等學(xué)校招生全國統(tǒng)一考試適應(yīng)性測試(九省聯(lián)考)歷史試題(適用地區(qū):貴州)含解析
評論
0/150
提交評論