隨筆-3  評(píng)論-0  文章-0  trackbacks-0
            2005年12月9日

          一、 混淆器

            目前,開發(fā)人員使用的比較多的保護(hù)代碼的方法是用混淆器。混淆器是采用一些方法將類,變量,方法,包的名字改為無(wú)意義的字符串;使用非法的字符代替符號(hào);貼加一些代碼使反編譯軟件崩潰;貼加一些無(wú)關(guān)的指令或永遠(yuǎn)執(zhí)行不到的指令等使反編譯無(wú)法成功或所得的代碼可讀性很差。這樣就實(shí)現(xiàn)了反反編譯的目的。我們來(lái)做個(gè)演示。原始代碼如下:

           

          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);

          } }


           混淆后,再反編譯所仍然能得到源代碼,但顯然,所得代碼與原始代碼比,變得難以讀懂,代碼中多了其他的方法,文件名等信息也被打亂了。并且,把以上代碼寫進(jìn)sKey_kb.java中,無(wú)法通過(guò)編譯。

            但是,如果在編寫軟件時(shí),在軟件中寫入某些注冊(cè)信息,或一些簡(jiǎn)單的算法,通過(guò)反編譯,還是有可能得到這些信息的,從而未能達(dá)到保護(hù)軟件的目的。反編譯器與混淆器之間的斗爭(zhēng)是永無(wú)止盡的。所以從其他角度去保護(hù)java的源代碼是很有必要。


          二、 網(wǎng)絡(luò)加載重要類

            在java中提供了一個(gè)ClassLoader類,這個(gè)類可以讓我們使用類加載器將所需要的java字節(jié)碼文件加載到j(luò)vm中。我們通過(guò)重寫這個(gè)類,可以實(shí)現(xiàn)從網(wǎng)絡(luò)通過(guò)url加載java字節(jié)碼文件。這樣,我們就可以把一些重要的,隱秘的class放在網(wǎng)絡(luò)服務(wù)器上,通過(guò)口令去檢驗(yàn)是否有權(quán)限下載該類。從而實(shí)現(xiàn)java代碼保護(hù)的目的。其次在java中正好提供了URLClassLoader這個(gè)類,通過(guò)此類,正好可以實(shí)現(xiàn)我們的目的。URLClassLoader類的基本使用方法是通過(guò)一個(gè)URL類型的數(shù)組告訴URLClassLoader類的對(duì)象是從什么地方加載類,然后使用loadclass()方法,從給定的URL中加載字節(jié)碼文件,獲得它的方法,然后再執(zhí)行。

            具體步驟如下:

            1.創(chuàng)建URL

          URL url[]={

          new URL("file:///c:/classloader/web"),

          new URL("

          };

           

            2.創(chuàng)建URLClassLoader對(duì)象

          URLClassLoader cl=new URLClassLoader(url);

           

            3.使用URLClassLoader對(duì)象加載字節(jié)碼文件

          Class class=cl.loadClass("class1");

           

            4.執(zhí)行靜態(tài)方法

          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);

           


          三、 加密重要類

            使用網(wǎng)絡(luò)加載重要類的方法固然有一定的用處,但是,在遇到無(wú)網(wǎng)絡(luò)的情況時(shí),還是無(wú)法解決我們的問(wèn)題。對(duì)于這種情況,我們只能把所有文件放在本地計(jì)算機(jī)上。那么,對(duì)此我們?cè)撛趺醋霾拍鼙Wo(hù)好java代碼呢?

            其實(shí),要實(shí)現(xiàn)這一點(diǎn),并不難,只需要對(duì)一些重要的類實(shí)行加密就可以了。當(dāng)然,在裝載時(shí),加密的類是需要解密才能被ClassLoader識(shí)別的。所以,我們必須自己創(chuàng)建ClassLoader類。在標(biāo)準(zhǔn)java api中ClassLoader有幾個(gè)重要的方法。創(chuàng)建定制ClassLoader時(shí),我們只需覆蓋其中的一個(gè),即loadClass,添加獲取原始類文件數(shù)據(jù)的代碼。這個(gè)方法有兩個(gè)參數(shù):類的名字,以及一個(gè)表示JVM是否要求解析類名字的標(biāo)記(即是否同時(shí)裝入有依賴關(guān)系的類)。如果這個(gè)標(biāo)記為true,我們只需在返回JVM之前調(diào)用resolveClass。

           原代碼如下:

          public Class loadClass( String name, boolean resolve )

          throws ClassNotFoundException {

          try {

          Class clasz = null;

          //步驟1:如果類已經(jīng)在系統(tǒng)緩沖之中,我們就不需要再次裝入它

          clasz = findLoadedClass( name );

          if (clasz != null)

          return clasz;

          byte classData[] = /* 通過(guò)某種方法獲取字節(jié)碼數(shù)據(jù) */;

          if (classData != null) {

          clasz = defineClass( name, classData, 0, classData.length );

          }

          //步驟2:如果上面沒(méi)有成功,

          if (clasz == null)

          clasz = findSystemClass( name );

          //步驟3:如有必要,則裝入相關(guān)的類

          if (resolve && clasz != null)

          resolveClass( clasz );

          return clasz;

          } catch( IOException ie ) {

          throw new ClassNotFoundException( ie.toString() );

          } catch( GeneralSecurityException gse ) {

          throw new ClassNotFoundException( gse.toString() );

          } }

           

            代碼中的大部分對(duì)所有ClassLoader對(duì)象來(lái)說(shuō)都一樣,但有一小部分是特有的。在處理過(guò)程中,ClassLoader對(duì)象要用到其他幾個(gè)輔助方法:findLoadedClass:用來(lái)進(jìn)行檢查,以便確認(rèn)被請(qǐng)求的類當(dāng)前是否存在,loadClass方法應(yīng)該首先調(diào)用它。defineClass:獲得原始類文件字節(jié)碼數(shù)據(jù)之后,調(diào)用defineClass把它轉(zhuǎn)換成對(duì)象,任何loadClass實(shí)現(xiàn)都必須調(diào)用這個(gè)方法。findSystemClass:提供默認(rèn)ClassLoader的支持。如果用來(lái)尋找類的定制方法不能找到指定的類,則可以調(diào)用該方法嘗試默認(rèn)的裝入方式。resolveClass:當(dāng)JVM想要裝入的不僅包括指定的類,而且還包括該類引用的所有其他類時(shí),它會(huì)把loadClass的resolve參數(shù)設(shè)置成true。這時(shí),我們必須在返回剛剛裝入的Class對(duì)象給調(diào)用者之前調(diào)用resolveClass。

            接下來(lái)就是加密解密部分。Java加密擴(kuò)展即Java Cryptography Extension,簡(jiǎn)稱JCE,是Sun的加密服務(wù)軟件,包含了加密和密匙生成功能。我們可以用DES算法加密和解密字節(jié)碼。用JCE加密和解密數(shù)據(jù)是要遵循一些基本步驟的(可以參考<>,這里就不祥述了)。

            加密完成后,就是通過(guò)解密來(lái)獲取原始類的java字節(jié)碼。可以通過(guò)一個(gè)DecryptStart程序運(yùn)行經(jīng)過(guò)加密的應(yīng)用。

            具體方法如下:

          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過(guò)程:我們要在這里讀入密匙,創(chuàng)建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 );

          }

           

            雖然應(yīng)用本身經(jīng)過(guò)了加密,但啟動(dòng)程序DecryptStart沒(méi)有加密。攻擊者可以反編譯啟動(dòng)程序并修改它,把解密后的類文件保存到磁盤。降低這種風(fēng)險(xiǎn)的辦法之一是對(duì)啟動(dòng)程序進(jìn)行高質(zhì)量的模糊處理。或者,啟動(dòng)程序也可以采用直接編譯成機(jī)器語(yǔ)言的代碼,使得啟動(dòng)程序具有傳統(tǒng)執(zhí)行文件格式的安全性.比如使用java的jini技術(shù),來(lái)實(shí)現(xiàn)解密部分,就可以作到。當(dāng)然,這是需要付出一定的代價(jià)的,就是喪失了java的最大特點(diǎn)--平臺(tái)無(wú)關(guān)性。不過(guò),jni技術(shù)可以用c語(yǔ)言在多種平臺(tái)實(shí)現(xiàn),我們可以在不同的平臺(tái)編寫不同的啟動(dòng)程序。

            2005年12月8日
          前言:
            本來(lái)我都是使用JBuilderX當(dāng)主力IDE、但使用了Eclipse后發(fā)現(xiàn)...Eclipse原來(lái)也這么好用...漸漸的就愛(ài)上了它......
           
           Eclipse優(yōu)點(diǎn):免費(fèi)、程序代碼排版功能、有中文化包、可增設(shè)許多功能強(qiáng)大的外掛、支持多種操作系統(tǒng)(Windows、Linux、Solaris、Mac OSX)..等等。

            開此篇討論串的目的,是希望能將Eclipse的一些使用技巧集合起來(lái)...歡迎大家繼續(xù)補(bǔ)充下去...由于Eclipse的版本眾多,希望補(bǔ)充的先進(jìn)們能順便說(shuō)明一下您所使用的版本~

            Eclipse網(wǎng)站:http://www.eclipse.org/ ;
            Eclipse中文化教學(xué):JavaWorld站內(nèi)文章參考

            (使用版本:Eclipse 2.1.2 Release + 中文化)


          熱鍵篇:
            1.Template:Alt + /
            修改處:窗口->喜好設(shè)定->工作臺(tái)->按鍵->編輯->內(nèi)容輔助。
            個(gè)人習(xí)慣:Shift+SPACE(空白)。
            簡(jiǎn)易說(shuō)明:編輯程序代碼時(shí),打sysout +Template啟動(dòng)鍵,就會(huì)自動(dòng)出現(xiàn):System.out.println(); 。
            設(shè)定Template的格式:窗口->喜好設(shè)定->Java->編輯器->模板。

            2.程序代碼自動(dòng)排版:Ctrl+Shift+F
            修改處:窗口->喜好設(shè)定->工作臺(tái)->按鍵->程序代碼->格式。
            個(gè)人習(xí)慣:Alt+Z。
            自動(dòng)排版設(shè)定:窗口->喜好設(shè)定->Java->程序代碼格式制作程序。樣式頁(yè)面->將插入tab(而非空格鍵)以內(nèi)縮,該選項(xiàng)取消勾選,下面空格數(shù)目填4,這樣在自動(dòng)編排時(shí)會(huì)以空格4作縮排。
            
            3.快速執(zhí)行程序:Ctrl + F11
            個(gè)人習(xí)慣:ALT+X
            修改處:窗口->喜好設(shè)定->工作臺(tái)->按鍵->執(zhí)行->啟動(dòng)前一次的啟動(dòng)作業(yè)。
            簡(jiǎn)易說(shuō)明:第一次執(zhí)行時(shí),它會(huì)詢問(wèn)您執(zhí)行模式,設(shè)置好后,以后只要按這個(gè)熱鍵,它就會(huì)快速執(zhí)行。..我覺(jué)得很順手^___^

            4.自動(dòng)匯入所需要的類別:Ctrl+Shift+O
            簡(jiǎn)易說(shuō)明:假設(shè)我們沒(méi)有Import任何類別時(shí),當(dāng)我們?cè)诔绦蚶锎蛉耄?
            BufferedReader buf =new BufferedReader(new InputStreamReader(System.in));
            此時(shí)Eclipse會(huì)警示說(shuō)沒(méi)有匯入類別,這時(shí)我們只要按下Ctrl+Shift+O,它就會(huì)自動(dòng)幫我們Import類別。

            5.查看使用類別的原始碼:Ctrl+鼠標(biāo)左鍵點(diǎn)擊
            簡(jiǎn)易說(shuō)明:可以看到您所使用類別的原始碼。

            6.將選取的文字批注起來(lái):Ctrl+/
            簡(jiǎn)易說(shuō)明:Debug時(shí)很方便。
            修改處:窗口->喜好設(shè)定->工作臺(tái)->按鍵->程序代碼->批注

            7.視景切換:Ctrl+F8
            個(gè)人習(xí)慣:Alt+S。
            修改處:窗口->喜好設(shè)定->工作臺(tái)->按鍵->窗口->下一個(gè)視景。
            簡(jiǎn)易說(shuō)明:可以方便我們快速切換編輯、除錯(cuò)等視景。


          密技篇:
            1.一套Eclipse可同時(shí)切換,英文、繁體、簡(jiǎn)體顯示:
            首先要先安裝完中文化包。
            在桌面的快捷方式后面加上參數(shù)即可,
            英文-> -nl "zh_US"
            繁體-> -nl "zh_TW"
            簡(jiǎn)體-> -nl "zh_CN"。
            (其它語(yǔ)系以此類推)
            像我2.1.2中文化后,我在我桌面的Eclipse快捷方式加入?yún)?shù)-n1 "zh_US"。
            "C:\Program Files\eclipse\eclipse.exe" -n "zh_US"
            接口就會(huì)變回英文語(yǔ)系嚕。

            2.利用Eclipse,在Word編輯文書時(shí)可不必將程序代碼重新編排:
            將Eclipse程序編輯區(qū)的程序代碼整個(gè)復(fù)制下來(lái)(Ctrl+C),直接貼(Ctrl+V)到Word或WordPad上,您將會(huì)發(fā)現(xiàn)在Word里的程序代碼格式,跟Eclipse所設(shè)定的完全一樣,包括字型、縮排、關(guān)鍵詞顏色。我曾試過(guò)JBuilder、GEL、NetBeans...使用復(fù)制貼上時(shí),只有縮排格式一樣,字型、顏色等都不會(huì)改變。
          外掛篇:
            外掛安裝:將外掛包下載回來(lái)后,將其解壓縮后,您會(huì)發(fā)現(xiàn)features、plugins這2個(gè)數(shù)據(jù)夾,將里面的東西都復(fù)制或移動(dòng)到Eclipse的features、plugins數(shù)據(jù)夾內(nèi)后,重新啟動(dòng)Eclipse即可。

            讓Eclipse可以像JBuilderX一樣使用拖拉方式建構(gòu)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選取要建構(gòu)的GUI類型。

            2.Eclipse Visual Editor Project:
            http://www.eclipse.org/vep/ ;
            點(diǎn)選下方Download Page,再點(diǎn)選Latest Release 0.5.0進(jìn)入下載。
            除了VE-runtime-0.5.0.zip要下載外,以下這2個(gè)也要:
            EMF build 1.1.1: (build page) (download zip)
            GEF Build 2.1.2: (build page) (download zip)

            3.0 M8版本,請(qǐng)下載:
            EMF build I200403250631
            GEF Build I20040330
            VE-runtime-1.0M1

            安裝成功后,便可由File->New->Visual Class開始UI設(shè)計(jì)。
            安裝成功后,即可由新建->Java->AWT與Swing里選擇所要建構(gòu)的GUI類型開始進(jìn)行設(shè)計(jì)。VE必須配合著對(duì)應(yīng)版本,才能正常使用,否則即使安裝成功,使用上仍會(huì)有問(wèn)題。

            使用Eclipse來(lái)開發(fā)JSP程序:
            外掛名稱:lomboz(下載頁(yè)面)
            http://forge.objectweb.org/project/showfiles.php?group_id=97 ;
            請(qǐng)選擇適合自己版本的lomboz下載,lomboz.212.p1.zip表示2.1.2版,lomboz.3m7.zip表示M7版本....以此類推。
            lomboz安裝以及設(shè)置教學(xué):
            Eclipse開發(fā)JSP-教學(xué)文件


          Java轉(zhuǎn)exe篇:
            實(shí)現(xiàn)方式:Eclipse搭配JSmooth(免費(fèi))。
            1.先由Eclipse制作包含Manifest的JAR。
            制作教學(xué)

            2.使用JSmooth將做好的JAR包裝成EXE。
            JSmooth下載頁(yè)面:
            http://jsmooth.sourceforge.net/index.php ;

            3.制作完成的exe文件,可在有裝置JRE的Windows上執(zhí)行。

            Eclipse-Java編輯器最佳設(shè)定:
            編輯器字型設(shè)定:工作臺(tái)->字型->Java編輯器文字字型。
            (建議設(shè)定Courier New -regular 10)

            編輯器相關(guān)設(shè)定:窗口->喜好設(shè)定->Java->編輯器

            外觀:顯示行號(hào)、強(qiáng)調(diào)對(duì)稱顯示的方括號(hào)、強(qiáng)調(diào)顯示現(xiàn)行行、顯示打印邊距,將其勾選,Tab寬度設(shè)4,打印編距字段設(shè)80。
            程序代碼協(xié)助:采預(yù)設(shè)即可。
            語(yǔ)法:可設(shè)定關(guān)鍵詞、字符串等等的顯示顏色。
            附注:采預(yù)設(shè)即可。
            輸入:全部字段都勾選。
            浮動(dòng)說(shuō)明:采預(yù)設(shè)即可。
            導(dǎo)覽:采預(yù)設(shè)即可。

            使自動(dòng)排版排出來(lái)的效果,最符合Java設(shè)計(jì)慣例的設(shè)定:
            自動(dòng)排版設(shè)定:窗口->喜好設(shè)定->Java->程序代碼制作格式。

            換行:全部不勾選。
            分行:行長(zhǎng)度上限設(shè):80。
            樣式:只將強(qiáng)制轉(zhuǎn)型后插入空白勾選。
            內(nèi)縮空格數(shù)目:設(shè)為4。

            Eclipse的教學(xué)文件:
            Eclipse 3.0系列熱鍵表 - 中英對(duì)照解說(shuō)版 (by sungo) ~New~
            Window+GCC+CDT用Eclipse開發(fā)C、C++ (by sungo) ~New~

            其它:
            擴(kuò)充Eclipse的Java 開發(fā)工具(中文)
            使用Eclipse開發(fā)J2EE 應(yīng)用程序(中文)
            使用Eclipse平臺(tái)進(jìn)行除錯(cuò)(中文)
            用Eclipse進(jìn)行XML 開發(fā)(中文)
            開發(fā)Eclipse外掛程序(中文)
            國(guó)際化您的Eclipse外掛程序(英文)
            將Swing編輯器加入Eclipse(英文)
            如何測(cè)試你的Eclipse plug-in符合國(guó)際市場(chǎng)需求(英文)

            Eclipse的相關(guān)網(wǎng)站:
            http://eclipse-plugins.2y.net/eclipse/index.jsp ;
            http://www.eclipseplugincentral.com/ ;
            Eclipse相關(guān)教學(xué)[簡(jiǎn)體]
            寫程序?qū)懙胶芾哿耍胄菹⒁幌拢浚客嫱嫘ame是不錯(cuò)的選擇,下面介紹使用Eclipse玩Game的Plug-in。


          轉(zhuǎn)載:http://www.5i58.net/news/html/3955.htm
          posted @ 2005-12-08 12:06 (^_^)楊嘉 閱讀(295) | 評(píng)論 (0)編輯 收藏
            2005年11月17日

          基 本 功:應(yīng)該扎實(shí)
                             
          心理狀態(tài):不應(yīng)該專牛角尖

          posted @ 2005-11-17 12:50 (^_^)楊嘉| 編輯 收藏
          僅列出標(biāo)題  
          主站蜘蛛池模板: 临武县| 大化| 丹凤县| 永城市| 关岭| 建德市| 肃南| 清远市| 沙坪坝区| 定安县| 铜鼓县| 宕昌县| 文登市| 合作市| 新邵县| 阳江市| 闻喜县| 内乡县| 沽源县| 宝坻区| 广德县| 潞城市| 马关县| 汝阳县| 武夷山市| 灌云县| 东港市| 赤峰市| 墨玉县| 洪洞县| 克拉玛依市| 民权县| 稷山县| 遵义市| 孝义市| 西华县| 麻栗坡县| 翼城县| 郎溪县| 汕尾市| 石屏县|