一、 混淆器
目前,開發人員使用的比較多的保護代碼的方法是用混淆器。混淆器是采用一些方法將類,變量,方法,包的名字改為無意義的字符串;使用非法的字符代替符號;貼加一些代碼使反編譯軟件崩潰;貼加一些無關的指令或永遠執行不到的指令等使反編譯無法成功或所得的代碼可讀性很差。這樣就實現了反反編譯的目的。我們來做個演示。原始代碼如下:
import java.io.*;
import java.security.*;
public class sKey_kb{
public static void main(String args[]) throws Exception{
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject();
byte[] kb=k.getEncoded();
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
for(int i=0;i
System.out.print(kb[i]+",");
} } }
使用混淆器后,再用jad反編譯得代碼如下:
import java.io.*;
import java.security.Key;
public class sKey_kb{
public skey() {}
public static void main(String args[]) {
FileInputStream fileinputstream=new FileInputStream(ma);
ObjectInputStream objectinputstream=new ObjectInputStream(fileinputstream);
Key key=(Key)b.readObject();
byte abyte0[]=key.getEncoded();
FileOutputStream fileoutputstream=new FileOutputStream(na);
fileoutputstream.write(abyte0);
for(int i=0;i
System.out.print(abyte0[i]+oa);
}
private static String a(String s){
int i=s.length();
char ac[]=new char[i];
for(int j=0;j
return new String(ac);
}
private static String ma="u5AA1u5AAFu5AF3u5AFBu5AE4u5AAEu5AABu5ABE";
private static String na="u5AA1u5AAFu5AB3u5AA1u5AA8u5AFBu5AE4u5AAEu5AABu5ABE";
private static String oa="u5AE6";
public static{
ma=a(ma);
na=a(ma)
oa=a(oa);
} }
混淆后,再反編譯所仍然能得到源代碼,但顯然,所得代碼與原始代碼比,變得難以讀懂,代碼中多了其他的方法,文件名等信息也被打亂了。并且,把以上代碼寫進sKey_kb.java中,無法通過編譯。
但是,如果在編寫軟件時,在軟件中寫入某些注冊信息,或一些簡單的算法,通過反編譯,還是有可能得到這些信息的,從而未能達到保護軟件的目的。反編譯器與混淆器之間的斗爭是永無止盡的。所以從其他角度去保護java的源代碼是很有必要。
二、 網絡加載重要類
在java中提供了一個ClassLoader類,這個類可以讓我們使用類加載器將所需要的java字節碼文件加載到jvm中。我們通過重寫這個類,可以實現從網絡通過url加載java字節碼文件。這樣,我們就可以把一些重要的,隱秘的class放在網絡服務器上,通過口令去檢驗是否有權限下載該類。從而實現java代碼保護的目的。其次在java中正好提供了URLClassLoader這個類,通過此類,正好可以實現我們的目的。URLClassLoader類的基本使用方法是通過一個URL類型的數組告訴URLClassLoader類的對象是從什么地方加載類,然后使用loadclass()方法,從給定的URL中加載字節碼文件,獲得它的方法,然后再執行。
具體步驟如下:
1.創建URL
URL url[]={
new URL("file:///c:/classloader/web"),
new URL("
}; 2.創建URLClassLoader對象 URLClassLoader cl=new URLClassLoader(url); 3.使用URLClassLoader對象加載字節碼文件 Class class=cl.loadClass("class1"); 4.執行靜態方法 Class getarg[]={ (new String [1]).getClass() }; Method m=class.getMethod("main",getarg); String[] myl={"arg1 passed","arg2 passed"); Object myarg[]={myl}; m.invole(null,myarg); 使用網絡加載重要類的方法固然有一定的用處,但是,在遇到無網絡的情況時,還是無法解決我們的問題。對于這種情況,我們只能把所有文件放在本地計算機上。那么,對此我們該怎么做才能保護好java代碼呢? 其實,要實現這一點,并不難,只需要對一些重要的類實行加密就可以了。當然,在裝載時,加密的類是需要解密才能被ClassLoader識別的。所以,我們必須自己創建ClassLoader類。在標準java api中ClassLoader有幾個重要的方法。創建定制ClassLoader時,我們只需覆蓋其中的一個,即loadClass,添加獲取原始類文件數據的代碼。這個方法有兩個參數:類的名字,以及一個表示JVM是否要求解析類名字的標記(即是否同時裝入有依賴關系的類)。如果這個標記為true,我們只需在返回JVM之前調用resolveClass。 原代碼如下: public Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { try { Class clasz = null; //步驟1:如果類已經在系統緩沖之中,我們就不需要再次裝入它 clasz = findLoadedClass( name ); if (clasz != null) return clasz; byte classData[] = /* 通過某種方法獲取字節碼數據 */; if (classData != null) { clasz = defineClass( name, classData, 0, classData.length ); } //步驟2:如果上面沒有成功, if (clasz == null) clasz = findSystemClass( name ); //步驟3:如有必要,則裝入相關的類 if (resolve && clasz != null) resolveClass( clasz ); return clasz; } catch( IOException ie ) { throw new ClassNotFoundException( ie.toString() ); } catch( GeneralSecurityException gse ) { throw new ClassNotFoundException( gse.toString() ); } } 代碼中的大部分對所有ClassLoader對象來說都一樣,但有一小部分是特有的。在處理過程中,ClassLoader對象要用到其他幾個輔助方法:findLoadedClass:用來進行檢查,以便確認被請求的類當前是否存在,loadClass方法應該首先調用它。defineClass:獲得原始類文件字節碼數據之后,調用defineClass把它轉換成對象,任何loadClass實現都必須調用這個方法。findSystemClass:提供默認ClassLoader的支持。如果用來尋找類的定制方法不能找到指定的類,則可以調用該方法嘗試默認的裝入方式。resolveClass:當JVM想要裝入的不僅包括指定的類,而且還包括該類引用的所有其他類時,它會把loadClass的resolve參數設置成true。這時,我們必須在返回剛剛裝入的Class對象給調用者之前調用resolveClass。 接下來就是加密解密部分。Java加密擴展即Java Cryptography Extension,簡稱JCE,是Sun的加密服務軟件,包含了加密和密匙生成功能。我們可以用DES算法加密和解密字節碼。用JCE加密和解密數據是要遵循一些基本步驟的(可以參考<>,這里就不祥述了)。 加密完成后,就是通過解密來獲取原始類的java字節碼。可以通過一個DecryptStart程序運行經過加密的應用。 具體方法如下: public class DecryptStart extends ClassLoader { private SecretKey key; private Cipher cipher; public DecryptStart( SecretKey key ) throws GeneralSecurityException,IOException { this.key = key; String algorithm = "DES"; SecureRandom sr = new SecureRandom(); System.err.println( "[DecryptStart: creating cipher]" ); cipher = Cipher.getInstance( algorithm ); cipher.init( Cipher.DECRYPT_MODE, key, sr ); } // main過程:我們要在這里讀入密匙,創建DecryptStart的 static public void main( String args[] ) throws Exception { String keyFilename = args[0]; String appName = args[1]; String realArgs[] = new String[args.length-2]; System.arraycopy( args, 2, realArgs, 0, args.length-2 ); System.err.println( "[DecryptStart: reading key]" ); byte rawKey[] = Util.readFile( keyFilename ); DESKeySpec dks = new DESKeySpec( rawKey ); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" ); SecretKey key = keyFactory.generateSecret( dks ); DecryptStart dr = new DecryptStart( key ); System.err.println( "[DecryptStart: loading "+appName+"]" ); Class clasz = dr.loadClass( appName ); String proto[] = new String[1]; Class mainArgs[] = { (new String[1]).getClass() }; Method main = clasz.getMethod( "main", mainArgs ); Object argsArray[] = { realArgs }; System.err.println( "[DecryptStart: running "+appName+".main()]" ); main.invoke( null, argsArray ); } 雖然應用本身經過了加密,但啟動程序DecryptStart沒有加密。攻擊者可以反編譯啟動程序并修改它,把解密后的類文件保存到磁盤。降低這種風險的辦法之一是對啟動程序進行高質量的模糊處理。或者,啟動程序也可以采用直接編譯成機器語言的代碼,使得啟動程序具有傳統執行文件格式的安全性.比如使用java的jini技術,來實現解密部分,就可以作到。當然,這是需要付出一定的代價的,就是喪失了java的最大特點--平臺無關性。不過,jni技術可以用c語言在多種平臺實現,我們可以在不同的平臺編寫不同的啟動程序。 基 本 功:應該扎實
三、 加密重要類
本來我都是使用JBuilderX當主力IDE、但使用了Eclipse后發現...Eclipse原來也這么好用...漸漸的就愛上了它......
開此篇討論串的目的,是希望能將Eclipse的一些使用技巧集合起來...歡迎大家繼續補充下去...由于Eclipse的版本眾多,希望補充的先進們能順便說明一下您所使用的版本~
Eclipse網站:http://www.eclipse.org/ ;
Eclipse中文化教學:JavaWorld站內文章參考
(使用版本:Eclipse 2.1.2 Release + 中文化)
熱鍵篇:
1.Template:Alt + /
修改處:窗口->喜好設定->工作臺->按鍵->編輯->內容輔助。
個人習慣:Shift+SPACE(空白)。
簡易說明:編輯程序代碼時,打sysout +Template啟動鍵,就會自動出現:System.out.println(); 。
設定Template的格式:窗口->喜好設定->Java->編輯器->模板。
2.程序代碼自動排版:Ctrl+Shift+F
修改處:窗口->喜好設定->工作臺->按鍵->程序代碼->格式。
個人習慣:Alt+Z。
自動排版設定:窗口->喜好設定->Java->程序代碼格式制作程序。樣式頁面->將插入tab(而非空格鍵)以內縮,該選項取消勾選,下面空格數目填4,這樣在自動編排時會以空格4作縮排。
3.快速執行程序:Ctrl + F11
個人習慣:ALT+X
修改處:窗口->喜好設定->工作臺->按鍵->執行->啟動前一次的啟動作業。
簡易說明:第一次執行時,它會詢問您執行模式,設置好后,以后只要按這個熱鍵,它就會快速執行。
4.自動匯入所需要的類別:Ctrl+Shift+O
簡易說明:假設我們沒有Import任何類別時,當我們在程序里打入:
BufferedReader buf =new BufferedReader(new InputStreamReader(System.in));
此時Eclipse會警示說沒有匯入類別,這時我們只要按下Ctrl+Shift+O,它就會自動幫我們Import類別。
5.查看使用類別的原始碼:Ctrl+鼠標左鍵點擊
簡易說明:可以看到您所使用類別的原始碼。
6.將選取的文字批注起來:Ctrl+/
簡易說明:Debug時很方便。
修改處:窗口->喜好設定->工作臺->按鍵->程序代碼->批注
7.視景切換:Ctrl+F8
個人習慣:Alt+S。
修改處:窗口->喜好設定->工作臺->按鍵->窗口->下一個視景。
簡易說明:可以方便我們快速切換編輯、除錯等視景。
密技篇:
1.一套Eclipse可同時切換,英文、繁體、簡體顯示:
首先要先安裝完中文化包。
在桌面的快捷方式后面加上參數即可,
英文-> -nl "zh_US"
繁體-> -nl "zh_TW"
簡體-> -nl "zh_CN"。
(其它語系以此類推)
像我2.1.2中文化后,我在我桌面的Eclipse快捷方式加入參數-n1 "zh_US"。
"C:\Program Files\eclipse\eclipse.exe" -n "zh_US"
接口就會變回英文語系嚕。
2.利用Eclipse,在Word編輯文書時可不必將程序代碼重新編排:
將Eclipse程序編輯區的程序代碼整個復制下來(Ctrl+C),直接貼(Ctrl+V)到Word或WordPad上,您將會發現在Word里的程序代碼格式,跟Eclipse所設定的完全一樣,包括字型、縮排、關鍵詞顏色。我曾試過JBuilder、GEL、NetBeans...使用復制貼上時,只有縮排格式一樣,字型、顏色等都不會改變。
外掛安裝:將外掛包下載回來后,將其解壓縮后,您會發現features、plugins這2個數據夾,將里面的東西都復制或移動到Eclipse的features、plugins數據夾內后,重新啟動Eclipse即可。
讓Eclipse可以像JBuilderX一樣使用拖拉方式建構GUI的外掛:
1.Jigloo SWT/Swing GUI Builder :
http://cloudgarden.com/jigloo/index.html ;
下載此版本:Jigloo plugin for Eclipse (using Java 1.4 or 1.5)
安裝后即可由檔案->新建->其它->GUI Form選取要建構的GUI類型。
2.Eclipse Visual Editor Project:
http://www.eclipse.org/vep/ ;
點選下方Download Page,再點選Latest Release 0.5.0進入下載。
除了VE-runtime-0.5.0.zip要下載外,以下這2個也要:
EMF build 1.1.1: (build page) (download zip)
GEF Build 2.1.2: (build page) (download zip)
3.0 M8版本,請下載:
EMF build I200403250631
GEF Build I20040330
VE-runtime-1.0M1
安裝成功后,便可由File->New->Visual Class開始UI設計。
安裝成功后,即可由新建->Java->AWT與Swing里選擇所要建構的GUI類型開始進行設計。VE必須配合著對應版本,才能正常使用,否則即使安裝成功,使用上仍會有問題。
使用Eclipse來開發JSP程序:
外掛名稱:lomboz(下載頁面)
http://forge.objectweb.org/project/showfiles.php?group_id=97 ;
請選擇適合自己版本的lomboz下載,lomboz.212.p1.zip表示2.1.2版,lomboz.3m7.zip表示M7版本....以此類推。
lomboz安裝以及設置教學:
Eclipse開發JSP-教學文件
Java轉exe篇:
實現方式:Eclipse搭配JSmooth(免費)。
1.先由Eclipse制作包含Manifest的JAR。
制作教學
2.使用JSmooth將做好的JAR包裝成EXE。
JSmooth下載頁面:
http://jsmooth.sourceforge.net/index.php ;
3.制作完成的exe文件,可在有裝置JRE的Windows上執行。
Eclipse-Java編輯器最佳設定:
編輯器字型設定:工作臺->字型->Java編輯器文字字型。
(建議設定Courier New -regular 10)
編輯器相關設定:窗口->喜好設定->Java->編輯器
外觀:顯示行號、強調對稱顯示的方括號、強調顯示現行行、顯示打印邊距,將其勾選,Tab寬度設4,打印編距字段設80。
程序代碼協助:采預設即可。
語法:可設定關鍵詞、字符串等等的顯示顏色。
附注:采預設即可。
輸入:全部字段都勾選。
浮動說明:采預設即可。
導覽:采預設即可。
使自動排版排出來的效果,最符合Java設計慣例的設定:
自動排版設定:窗口->喜好設定->Java->程序代碼制作格式。
換行:全部不勾選。
分行:行長度上限設:80。
樣式:只將強制轉型后插入空白勾選。
內縮空格數目:設為4。
Eclipse的教學文件:
Eclipse 3.0系列熱鍵表 - 中英對照解說版 (by sungo) ~New~
Window+GCC+CDT用Eclipse開發C、C++ (by sungo) ~New~
其它:
擴充Eclipse的Java 開發工具(中文)
使用Eclipse開發J2EE 應用程序(中文)
使用Eclipse平臺進行除錯(中文)
用Eclipse進行XML 開發(中文)
開發Eclipse外掛程序(中文)
國際化您的Eclipse外掛程序(英文)
將Swing編輯器加入Eclipse(英文)
如何測試你的Eclipse plug-in符合國際市場需求(英文)
Eclipse的相關網站:
http://eclipse-plugins.2y.net/eclipse/index.jsp ;
http://www.eclipseplugincentral.com/ ;
Eclipse相關教學[簡體]
寫程序寫到很累了,想休息一下??玩玩小Game是不錯的選擇,下面介紹使用Eclipse玩Game的Plug-in。
轉載:http://www.5i58.net/news/html/3955.htm
心理狀態:不應該專牛角尖