隨筆-16  評(píng)論-54  文章-0  trackbacks-0
          ?????? 上面說(shuō)到代碼混淆方法之混淆器使用,主要針對(duì)proguard進(jìn)行了說(shuō)明。其實(shí),只要我們的類被其他地方的類調(diào)用到的話,那么代碼混淆器就似乎沒(méi)有辦法了,因?yàn)榇a混淆如果把代碼的簽名一起改了的話,其他地方是肯定調(diào)用不到,并會(huì)出錯(cuò)。而且,針對(duì)代碼調(diào)用,有幾點(diǎn)是我們肯定不能避免的:一是jsp頁(yè)面,如果在jsp頁(yè)面調(diào)用了某個(gè)類,那么如果類被混淆了的話,jsp頁(yè)面肯定會(huì)出錯(cuò);二是xml配置文件,比如在hibernate開(kāi)發(fā)中,對(duì)于hbm.xml文件,就沒(méi)辦法了。不過(guò),很慶幸的是,proguard的功能很強(qiáng),可以通過(guò)配置,只針對(duì)私有方法、私有變量做混淆。但是,這種混淆效果肯定是不如所愿。下面將說(shuō)明代碼混淆方法之二(tomcat下面代碼加密)

          ?????? 應(yīng)用服務(wù)器加密的方法不外就是通過(guò)修改該應(yīng)用服務(wù)器的類轉(zhuǎn)載器,來(lái)載入我們的類。首先我們通過(guò)一定算法,將我們的class文件加密,并部署到應(yīng)用服務(wù)器。然后修改修改該應(yīng)用服務(wù)器的類轉(zhuǎn)載器,通過(guò)解密算法將class文件反編譯并加載。從而達(dá)到class文件的加密。下面主要針對(duì)tomcat下面的加密、解密說(shuō)明。

          ???? 首先得研究一下tomcat的類裝載機(jī)制:tomcat的類裝載機(jī)制主要分為下面幾種:

          ???1、Bootstrap: 由虛擬機(jī)提供
          ???2、System:類路徑等相關(guān)
          ?? 3、Common:tomcat下面的公共包
          ?? 4、Catalina:tomcat自己的包,比如server目錄下面
          ?? 5、Shared:各個(gè)war包的共享包
          ?? 6、Webapp:各個(gè)war包自己的相關(guān)類包

          ???由于一般的典型情況是,我們是要加密自己的應(yīng)用程序,那么,我們就要覆蓋上面所說(shuō)的Webapp類裝載器。tomcat的Webapp類裝載器位于${tomcat.home}\server\lib\catalina.jar下面的類org.apache.catalina.loader.WebappClassLoader。我們從tomcat的網(wǎng)站下面下載tomcat的源代碼,WebappClassLoader的源代碼位于目錄\jakarta-tomcat-catalina\catalina\src\share\org\apache\catalina\loader下面,打開(kāi)源代碼,可以看到里面的調(diào)用機(jī)制是這樣的:
          ??? ?該類里面提供了很多諸如addRepository、addJar之類的方法,這是tomcat給類路徑添加相應(yīng)的目錄和包,比如在啟動(dòng)時(shí),tomcat會(huì)將我們的應(yīng)用程序下面的WEB-INF/lib/*.jar和WEB-INF/classes/**.class添加到資源路徑下面。
          ????
          ????首先,在加載類的時(shí)候,會(huì)調(diào)用loadClass方法。我們先定位到下面這個(gè)方法???
          ???? public Class loadClass(String name, boolean resolve)
          ??????? throws ClassNotFoundException?

          ???? 仔細(xì)觀察該方法,可以發(fā)現(xiàn),tomcat提供了很多緩存機(jī)制,首先分別從各個(gè)級(jí)別的緩存加載類,如果加載到類,就直接返回,否則會(huì)調(diào)用下面的方法: clazz = findClass(name);

          ???? 繼續(xù)定位到方法 public Class findClass(String name) throws ClassNotFoundException?
          ???? 該方法里面有一句調(diào)用 clazz = findClassInternal(name); 這個(gè)很關(guān)鍵,也就是我們最需要關(guān)心的一個(gè)方法了。再仔細(xì)閱讀一下,就能發(fā)現(xiàn),tomcat從本地的資源庫(kù)里面找,并先查找資源緩存,如果找到的話,直接返回緩存類。若找不到,就會(huì)讀取類文件的byte[]數(shù)組,并最后調(diào)用defineClass方法。defineClass文件是類裝載的最后一個(gè)類定義方法。下面就是findClassInternal方法的代碼小段

          ?????????? if (entry.loadedClass == null) {
          ??????????? synchronized (this) {
          ??????????????? if (entry.loadedClass == null) {
          ?????????????????
          ??????????????????clazz = defineClass(name, entry.binaryContent, 0,
          ??????????????????????????????????????? entry.binaryContent.length,
          ??????????????????????????????????????? codeSource);???????????????
          ?????????????????}
          ??????????????????? entry.loadedClass = clazz;
          ??????????????????? entry.binaryContent = null;
          ??????????????????? entry.source = null;
          ??????????????????? entry.codeBase = null;
          ??????????????????? entry.manifest = null;
          ??????????????????? entry.certificates = null;
          ??????????????? } else {
          ??????????????????? clazz = entry.loadedClass;
          ??????????????? }
          ??????????? }
          ??????? } else {
          ??????????? clazz = entry.loadedClass;
          ??????? }

          ??????entry是一個(gè)存放類屬性的bean,其中類的數(shù)組流存放在binaryContent,那么我們的加密解密就從這里入手。為了方便起見(jiàn),我們用base64算法加密,加密方法很簡(jiǎn)單。通過(guò)調(diào)用base64加密方法,把原有的class文件加密;推薦的base64加密方法是commons包的codec工程。可以從apache上面下載。把加密后的class文件替換tomcat下面的部署類文件。 那么在類裝載時(shí)就可以解密,并加載了。例如,為了測(cè)試,個(gè)人只對(duì)OrganizationServiceImp.class進(jìn)行加密,那么通過(guò)修改以上的裝載方法,就可以實(shí)現(xiàn)解密,修改后的代碼為如下,其中黑體為修改的

          ??????? if (entry.loadedClass == null) {
          ??????????? synchronized (this) {
          ??????????????? if (entry.loadedClass == null) {
          ??????????????? ?
          ??????????????? ?if(name.indexOf("OrganizationServiceImp") >=0)
          ??????????????? ?{
          ????????????????????byte[] base64Array = entry.binaryContent;
          ????????????????????byte[] orginByteArray = Base64.decodeBase64(base64Array);
          ????????????????????clazz = defineClass(name, orginByteArray, 0,
          ??????????????????????orginByteArray.length,?
          ???????????????????????????????codeSource);
          ?????????????????}
          ??????????????? ?else
          ??????????????? ?{
          ??????????????? ??clazz = defineClass(name, entry.binaryContent, 0,
          ??????????????????????????????????????? entry.binaryContent.length,
          ??????????????????????????????????????? codeSource);
          ???????????????????????????????????????
          ??????????????? ?}

          ??????????????????? entry.loadedClass = clazz;
          ??????????????????? entry.binaryContent = null;
          ??????????????????? entry.source = null;
          ??????????????????? entry.codeBase = null;
          ??????????????????? entry.manifest = null;
          ??????????????????? entry.certificates = null;
          ??????????????? } else {
          ??????????????????? clazz = entry.loadedClass;
          ??????????????? }
          ??????????? }
          ??????? } else {
          ??????????? clazz = entry.loadedClass;
          ??????? }
          ??????
          ??????
          運(yùn)行服務(wù)器,一切正常,說(shuō)明解密、加密成功,到此完成tomcat服務(wù)器下面的解密、加密。可以看出,tomcat下面的類裝載機(jī)制其實(shí)挺簡(jiǎn)單,不像其他服務(wù)器,比如weblogic、websphere服務(wù)器那么復(fù)雜。若能在這些服務(wù)器下面實(shí)現(xiàn)類似的效果,將是一個(gè)多么爽的事。個(gè)人在近幾天將對(duì)weblogic服務(wù)器下面的部署應(yīng)用進(jìn)行類似的研究

          posted on 2006-07-25 12:25 jspark 閱讀(9086) 評(píng)論(13)  編輯  收藏

          評(píng)論:
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-07-26 14:11 | 膠水
          你上面修改的文件如何不被反編譯呢?如果被反編譯了那個(gè)文件,其他加密的classes也可以被解密了。直接將解密后的結(jié)果寫(xiě)入到一個(gè)新的文件,然后在反編譯。這個(gè)感覺(jué)只能防君子不能防小人啊。。。

          if(name.indexOf("OrganizationServiceImp") >=0)
          {
          byte[] base64Array = entry.binaryContent;
          byte[] orginByteArray = Base64.decodeBase64(base64Array);
          //將解密后的byte寫(xiě)入到一個(gè)文件里,然后就可以反編譯咯
          clazz = defineClass(name, orginByteArray, 0,
          orginByteArray.length,
          codeSource);
          }  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-07-26 19:18 | jspark
          呵呵,是的,說(shuō)得沒(méi)錯(cuò),只能防君子不能防小人。

          可以先用代碼混淆、然戶再通過(guò)上面辦法加密。  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-08-31 14:48 | qy
          知道jboss下怎么做嗎  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-12-03 18:21 | 小孫
          重新打包時(shí)提示 找不到BASE64等定義,我已經(jīng)在WebappClassLoader中import 了相關(guān)類??
          我不知道該將下載的commons-codec.jar放到tomcat源文件哪個(gè)目錄下,在生成tomcat的過(guò)程中才會(huì)讀取到!!
          急用!!!
          謝謝!!!  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-12-03 18:50 | 小孫
          現(xiàn)在已經(jīng)重新生成tomcat了,運(yùn)行web應(yīng)用時(shí),
          提示:
          javax.servlet.ServletException: Illegal UTF8 string in constant pool in class file web/login/LoginService
          org.apache.jasper.servlet.JspServlet.service(JspServlet.java:272)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
          ---
          其中,web.login.LoginService.class是我用commons-codec,加密生成的文件,好像UTF8錯(cuò)誤,請(qǐng)問(wèn)怎么解決這個(gè)問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2006-12-14 14:53 | terry[匿名]
          請(qǐng)問(wèn)怎么再重新打包c(diǎn)atalina.jar,平時(shí)用JBuilder的,不了解。  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2008-03-22 16:39 | fenixshadow
          沒(méi)有萬(wàn)全的辦法,能防君子就不錯(cuò)了。

          "可以先用代碼混淆、然戶再通過(guò)上面辦法加密。"

          一樣可以先解密得到代碼,然后用IDE進(jìn)行重構(gòu)。

            回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2009-03-26 09:28 | 黃祥飛
          其實(shí)是可以很完美的加密的。把你解密那部分代碼用JNI調(diào)用SO庫(kù)返回一個(gè)jclass對(duì)象就可以實(shí)現(xiàn)完美加密了。  回復(fù)  更多評(píng)論
            
          # Web虎-tomcat,resin,jboss,websphere加密軟件保護(hù) 2009-11-13 16:30 | jsp加密
          可看看易用的產(chǎn)品:通過(guò)windows文件系統(tǒng)驅(qū)動(dòng)對(duì)需要保護(hù)的文件進(jìn)行<b>實(shí)時(shí)加解密</b>來(lái)實(shí)現(xiàn)對(duì)軟件源碼/版權(quán)的綜合保護(hù)

          驅(qū)動(dòng)層保護(hù),操作簡(jiǎn)便,保護(hù)可靠,性能優(yōu)異;成功案例有北京文化在線/哈爾濱聯(lián)得軟件股份公司,廣州knowtel等多家tomcat/websphere環(huán)境下的客戶  回復(fù)  更多評(píng)論
            
          # Web虎-tomcat,resin,jboss,websphere加密軟件保護(hù) 2009-11-13 16:46 | tomcat加密
          忘了說(shuō):1.現(xiàn)在要用,可免費(fèi)贈(zèng)送1套硬件碼版的 2.是騾子是馬,拉出來(lái)溜溜  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2010-03-02 17:15 | 硬件碼版改為機(jī)器碼版了
          @tomcat加密

          沒(méi)有改變的是 免費(fèi)送您繼續(xù)免費(fèi)贈(zèng)送 全功能、無(wú)任何限制的 機(jī)器碼版;

          除此之外,還為您提供 加密狗版、打包加密版的免費(fèi)試用,歡迎通過(guò)標(biāo)題連接來(lái)訪  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2010-03-14 21:21 | yi guangping
          ujiw yfjm k; j3ujfk  回復(fù)  更多評(píng)論
            
          # re: 代碼混淆方法之二(tomcat下面代碼加密) 2011-07-21 21:59 | 青青園中葵
          @黃祥飛
          能說(shuō)一下怎樣從so庫(kù)返回jclass對(duì)象嗎?是java class對(duì)象嗎?  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 中西区| 柳州市| 龙口市| 神木县| 承德市| 华池县| 临汾市| 涟源市| 广西| 辽阳县| 海安县| 云安县| 仁化县| 大冶市| 老河口市| 神木县| 南充市| 西峡县| 上犹县| 铁岭市| 怀柔区| 阿坝县| 武城县| 双江| 荣昌县| 江山市| 洱源县| 慈溪市| 喜德县| 新疆| 芦山县| 开原市| 宜章县| 万源市| 阿克| 望奎县| 泰安市| 昌乐县| 兴宁市| 宣汉县| 清远市|