推薦使用ModelGoon! *ModelGoon是什么? 它是一個(gè)Eclipse插件,用于基于UML圖的模型設(shè)計(jì),以及逆向工程(即從已有源代碼生成類圖等,以作為代碼分析或者文檔使用)。 *適用條件 ModelGoon目前最新的版本是3.0.0,
創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元金城江做網(wǎng)站,已為上家服務(wù),為金城江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
需要插件,不過myeclipse 里是自帶的吧.
File ----- New -------- UML Model Repository
然后轉(zhuǎn)到MyEclipse UML 視圖,然后菜單上點(diǎn)擊UML——〉Reverse Engineer UML form java.... 然后把要轉(zhuǎn)換為UML的JAVA文件前面打鉤 就可以了。
1)在代碼編輯窗口中,點(diǎn)鼠標(biāo)右鍵,調(diào)出右鍵菜單,然后點(diǎn)“生成序列圖...”
2)在“生成序列圖”對話框中,選擇“最大調(diào)用深度"(默認(rèn)值為3)
3)選擇“調(diào)用包括”。這個(gè)選項(xiàng)設(shè)定序列圖中對象范圍
如上圖,選擇“當(dāng)前解決方案”,表示在序列圖上出現(xiàn)的對象只包括在解決方案中的對象,不包括解決方案以外的對象。
4)點(diǎn)“確定”, 既可以生成序列圖
Java是一種跨平臺的、解釋型語言。Java 源代碼編譯中間“字節(jié)碼”存儲于class文件中。Class文件是一種字節(jié)碼形式的中間代碼,該字節(jié)碼中包括了很多源代碼的信息,例如變量名、方法名等。因此,Java中間代碼的反編譯就變得非常輕易。目前市場上有許多免費(fèi)的、商用的反編譯軟件,都能夠生成高質(zhì)量的反編譯后的源代碼。所以,對開發(fā)人員來說,如何保護(hù)Java程序就變成了一個(gè)非常重要的挑戰(zhàn)。本文首先討論了保護(hù)Java程序的基本方法,然后對代碼混淆問題進(jìn)行深入研究,最后結(jié)合一個(gè)實(shí)際的應(yīng)用程序,分析如何在實(shí)踐中保護(hù)Java程序。
反編譯成為保護(hù)Java程序的最大挑戰(zhàn)通常C、C++等編程語言開發(fā)的程序都被編譯成目標(biāo)代碼,這些目標(biāo)代碼都是本機(jī)器的二進(jìn)制可執(zhí)行代碼。通常所有的源文件被編譯、鏈接成一個(gè)可執(zhí)行文件。在這些可執(zhí)行文件中,編譯器刪除了程序中的變量名稱、方法名稱等信息,這些信息往往是由內(nèi)存地址表示,例如假如需要使用一個(gè)變量,往往是通過這個(gè)變量的地址來訪問的。因此,反編譯這些本地的目標(biāo)代碼就是非常困難的。
Java語言的出現(xiàn),使得反編譯變得非常輕易而有效。原因如下:1.由于跨平臺的需求,Java的指令集比較簡單而通用,較輕易得出程序的語義信息;2.Java編譯器將每一個(gè)類編譯成一個(gè)單獨(dú)的文件,這也簡化了反編譯的工作;3.Java 的Class文件中,仍然保留所有的方法名稱、變量名稱,并且通過這些名稱來訪問變量和方法,這些符號往往帶有許多語義信息。由于Java程序自身的特點(diǎn),對于不經(jīng)過處理的Java程序反編譯的效果非常好。
目前,市場上有許多Java的反編譯工具,有免費(fèi)的,也有商業(yè)使用的,還有的是開放源代碼的。這些工具的反編譯速度和效果都非常不錯(cuò)。好的反編譯軟件,能夠反編譯出非常接近源代碼的程序。因此,通過反編譯器,黑客能夠?qū)@些程序進(jìn)行更改,或者復(fù)用其中的程序。因此,如何保護(hù)Java程序不被反編譯,是非常重要的一個(gè)問題。
常用的保護(hù)技術(shù)由于Java字節(jié)碼的抽象級別較高,因此它們較輕易被反編譯。本節(jié)介紹了幾種常用的方法,用于保護(hù)Java字節(jié)碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因?yàn)檫@些方法都有自己的使用環(huán)境和弱點(diǎn)。
隔離Java程序最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實(shí)現(xiàn)有多種方式。例如,開發(fā)人員可以將要害的Java Class放在服務(wù)器端,客戶端通過訪問服務(wù)器的相關(guān)接口來獲得服務(wù),而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過接口提供服務(wù)的標(biāo)準(zhǔn)和協(xié)議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應(yīng)用都不適合這種保護(hù)方式,例如對于單機(jī)運(yùn)行的程序就無法隔離Java程序。這種保護(hù)方式見圖1所示。
圖1隔離Java程序示意圖對Class文件進(jìn)行加密為了防止Class文件被直接反編譯,許多開發(fā)人員將一些要害的Class文件進(jìn)行加密,例如對注冊碼、序列號治理相關(guān)的類等。在使用這些被加密的類之前,程序首先需要對這些類進(jìn)行解密,而后再將這些類裝載到JVM當(dāng)中。這些類的解密可以由硬件完成,也可以使用軟件完成。
在實(shí)現(xiàn)時(shí),開發(fā)人員往往通過自定義ClassLoader類來完成加密類的裝載(注重由于安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而后進(jìn)行解密,最后將解密后的類裝載到JVM當(dāng)中。在這種保護(hù)方式中,自定義的ClassLoader是非常要害的類。由于它本身不是被加密的,因此它可能成為黑客最先攻擊的目標(biāo)。假如相關(guān)的解密密鑰和算法被攻克,那么被加密的類也很輕易被解密。這種保護(hù)方式示意圖見圖2。
圖2 對Class文件進(jìn)行加密示意圖轉(zhuǎn)換成本地代碼將程序轉(zhuǎn)換成本地代碼也是一種防止反編譯的有效方法。因?yàn)楸镜卮a往往難以被反編譯。開發(fā)人員可以選擇將整個(gè)應(yīng)用程序轉(zhuǎn)換成本地代碼,也可以選擇要害模塊轉(zhuǎn)換。假如僅僅轉(zhuǎn)換要害部分模塊,Java程序在使用這些模塊時(shí),需要使用JNI技術(shù)進(jìn)行調(diào)用。
當(dāng)然,在使用這種技術(shù)保護(hù)Java程序的同時(shí),也犧牲了Java的跨平臺特性。對于不同的平臺,我們需要維護(hù)不同版本的本地代碼,這將加重軟件支持和維護(hù)的工作。不過對于一些要害的模塊,有時(shí)這種方案往往是必要的。
為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進(jìn)行數(shù)字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進(jìn)行認(rèn)證,確保這些代碼沒有被黑客更改。假如簽名檢查通過,則調(diào)用相關(guān)JNI方法。這種保護(hù)方式示意圖見圖3。
代碼混淆 圖3 轉(zhuǎn)換成本地代碼示意圖代碼混淆是對Class文件進(jìn)行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能(語義)。但是混淆后的代碼很難被反編譯,即反編譯后得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客假如有足夠的時(shí)間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是從實(shí)際情況來看,由于混淆技術(shù)的多元化發(fā)展,混淆理論的成熟,經(jīng)過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會具體介紹混淆技術(shù),因?yàn)榛煜且环N保護(hù)Java程序的重要技術(shù)。圖4是代碼混淆的示意圖。
圖4 代碼混淆示意圖幾種技術(shù)的總結(jié)以上幾種技術(shù)都有不同的應(yīng)用環(huán)境,各自都有自己的弱點(diǎn),表1是相關(guān)特點(diǎn)的比較。
混淆技術(shù)介紹表1 不同保護(hù)技術(shù)比較表 到目前為止,對于Java程序的保護(hù),混淆技術(shù)還是最基本的保護(hù)方法。Java混淆工具也非常多,包括商業(yè)的、免費(fèi)的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對Class文件進(jìn)行混淆處理,也有少量工具首先對源代碼進(jìn)行處理,然后再對Class進(jìn)行處理,這樣加大了混淆處理的力度。目前,商業(yè)上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和
4thpass.com
的SourceGuard等。主要的混淆技術(shù)按照混淆目標(biāo)可以進(jìn)行如下分類,它們分別為符號混淆(Lexical Obfuscation)、數(shù)據(jù)混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、預(yù)防性混淆(Prevent Transformation)。
符號混淆在Class中存在許多與程序執(zhí)行本身無關(guān)的信息,例如方法名稱、變量名稱,這些符號的名稱往往帶有一定的含義。例如某個(gè)方法名為getKeyLength(),那么這個(gè)方法很可能就是用來返回Key的長度。符號混淆就是將這些信息打亂,把這些信息變成無任何意義的表示,例如將所有的變量從vairant_001開始編號;對于所有的方法從method_001開始編號。這將對反編譯帶來一定的困難。對于私有函數(shù)、局部變量,通??梢愿淖兯鼈兊姆?,而不影響程序的運(yùn)行。但是對于一些接口名稱、公有函數(shù)、成員變量,假如有其它外部模塊需要引用這些符號,我們往往需要保留這些名稱,否則外部模塊找不到這些名稱的方法和變量。因此,多數(shù)的混淆工具對于符號混淆,都提供了豐富的選項(xiàng),讓用戶選擇是否、如何進(jìn)行符號混淆。
數(shù)據(jù)混淆 圖5 改變數(shù)據(jù)訪問數(shù)據(jù)混淆是對程序使用的數(shù)據(jù)進(jìn)行混淆。混淆的方法也有多種,主要可以分為改變數(shù)據(jù)存儲及編碼(Store and Encode Transform)、改變數(shù)據(jù)訪問(Access Transform)。
改變數(shù)據(jù)存儲和編碼可以打亂程序使用的數(shù)據(jù)存儲方式。例如將一個(gè)有10個(gè)成員的數(shù)組,拆開為10個(gè)變量,并且打亂這些變量的名字;將一個(gè)兩維數(shù)組轉(zhuǎn)化為一個(gè)一維數(shù)組等。對于一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),我們將打亂它的數(shù)據(jù)結(jié)構(gòu),例如用多個(gè)類代替一個(gè)復(fù)雜的類等。
另外一種方式是改變數(shù)據(jù)訪問。例如訪問數(shù)組的下標(biāo)時(shí),我們可以進(jìn)行一定的計(jì)算,圖5就是一個(gè)例子。
在實(shí)踐混淆處理中,這兩種方法通常是綜合使用的,在打亂數(shù)據(jù)存儲的同時(shí),也打亂數(shù)據(jù)訪問的方式。經(jīng)過對數(shù)據(jù)混淆,程序的語義變得復(fù)雜了,這樣增大了反編譯的難度。
控制混淆控制混淆就是對程序的控制流進(jìn)行混淆,使得程序的控制流更加難以反編譯,通常控制流的改變需要增加一些額外的計(jì)算和控制流,因此在性能上會給程序帶來一定的負(fù)面影響。有時(shí),需要在程序的性能和混淆程度之間進(jìn)行權(quán)衡??刂苹煜募夹g(shù)最為復(fù)雜,技巧也最多。這些技術(shù)可以分為如下幾類:增加混淆控制 通過增加額外的、復(fù)雜的控制流,可以將程序原來的語義隱藏起來。例如,對于按次序執(zhí)行的兩個(gè)語句A、B,我們可以增加一個(gè)控制條件,以決定B的執(zhí)行。通過這種方式加大反匯編的難度。但是所有的干擾控制都不應(yīng)該影響B(tài)的執(zhí)行。圖6就給出三種方式,為這個(gè)例子增加混淆控制。
圖6 增加混淆控制的三種方式控制流重組 重組控制流也是重要的混淆方法。例如,程序調(diào)用一個(gè)方法,在混淆后,可以將該方法代碼嵌入到調(diào)用程序當(dāng)中。反過來,程
名稱欄目:Java代碼序列圖生成 java 序列號生成
鏈接URL:http://jinyejixie.com/article46/hpchhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、軟件開發(fā)、虛擬主機(jī)、網(wǎng)站改版、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)