Firestorm是一個用JAVA寫的代碼生成工具,可以替你節(jié)省很多的代碼量,可以說同類軟件中功能最強的一個。
Firestorm是一個用JAVA寫的代碼生成工具,可以替你節(jié)省很多的代碼量,可以說同類軟件中功能最強的一個。
你可以在網(wǎng)上下載到最新的2.3試用版本,同時網(wǎng)站會發(fā)給你一個試用的license文件。既然是試用,
那么在使用上肯定有一定的限制。主要限制有3個:
1.只能最多生成5張表的DAO;
2.有時間限制;
3.不能自己定制代碼生成;
為了能夠更好的試用這個軟件,我得改改它,去掉這些限制。將firestorm.jar打開后,可以看到它使用了
混淆器進行代碼保護,不同于大多數(shù)的混淆器生成的文件,它的class和package大部分都是以關(guān)鍵字來命名,
所以如果你用JAD之類的工具把它反編譯后是不能再把它編譯成功,編譯器會提示出錯誤。
反編譯后,找到幾個有關(guān)注冊的關(guān)鍵文件,發(fā)現(xiàn)它使用的是數(shù)字簽名技術(shù)來做的保護,所以想逆向找出
注冊碼的計算方法是不可行的了,只能通過修改文件的方法來破解。通常我們是先反編譯,然后再修改
反編譯后生成的原文件,最后再重新編譯。但是由于文件名和包名的關(guān)系我們無法進行編譯,除非把它的
這些‘非法'的文件名和包名全部改成符合java語言規(guī)范的名稱,由于類,包眾多,互相調(diào)用也很
頻繁,所以這種方法幾乎不可能的。
另外一種方法就是使用softice之類的調(diào)試軟件來破解,不過這個脫離JAVA的范疇,這里不做討論。
還有一種方法可能很少有人用,就是先反編譯得到原文件,然后找到關(guān)鍵的方法后修改它的字節(jié)碼,
也就是class文件,這中方法往往需要你知道一些有關(guān)CLASS文件格式方面的知識(如果沒有也不用擔心),
有許多的處理字節(jié)碼的工具可以幫助你,比較流行的這類工具主要有:apache.org的BCEL;
jboss.com的javassist;objectweb.org的asm。都是出身名門哈。這3個工具各有特點,
這次我選用javassist,因為它修改class文件最方便,甚至不需要懂得字節(jié)碼和class文件格式。
讓我們來看看具體步驟:
step1:
下載并安裝FIRESTORM。
step2:
反編譯jar文件,閱讀代碼,找到關(guān)鍵的方法。當然,我這里寫出來,你就不用再麻煩了。(其實這步是最
麻煩的)。
找到com.codefutures.if.if文件中的方法
public static boolean a(java.security.PublicKey publickey,
byte abyte0[], byte abyte1[])
throws java.security.NoSuchAlgorithmException,
java.security.NoSuchProviderException,
java.security.InvalidKeyException,
java.security.SignatureException {
java.security.Signature signature =
java.security.Signature.getInstance("SHA1withDSA", "SUN");
signature.initVerify(publickey);
signature.update(abyte0);
return signature.verify(abyte1);
}
這個方法是對公鑰進行檢驗,修改的思路就是直接讓他返回一個true.
step2:
收到firestorm.license文件后不要急著安裝,先修改如下:
<custom-codegen>no</custom-codegen>
改為
<custom-codegen>yes</custom-codegen>
<restriction>5</restriction>
改為
<restriction>none</restriction>
<expiry-date>[日期]</expiry-date>
改為
<expiry-date>never</expiry-date>
修改后放到firestorm的安裝路徑的license目錄。
step3:
修改com.codefutures.if.if的class文件.這里我們需要寫一個小程序來完成實現(xiàn):
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Test {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
//設(shè)置目標類的路徑,確保能夠找到需要修改的類,這里我指向firestorm.jar
//解包后的路徑
pool.insertClassPath("d:/work/firestorm/firestorm") ;
//獲得要修改的類
CtClass cc = pool.get("com.codefutures.if.if");
//設(shè)置方法需要的參數(shù)
CtClass[] param = new CtClass[3] ;
param[0] = pool.get("java.security.PublicKey") ;
param[1] = pool.get("byte[]") ;
param[2] = pool.get("byte[]") ;
//得到方法
CtMethod m = cc.getDeclaredMethod("a", param);
//插入新的代碼
m.insertBefore("{return true ;}") ;
//保存到文件里
cc.writeFile() ;
}
}
修改完后,你可以反編譯修改過的的class文件,看看代碼是否加入成功。
step4:
將所有的class文件重新打包成firestorm.jar,然后替換
[firestorm安裝路徑]/lib/firestorm.jar,再啟動firestorm即可。
posted on 2008-09-18 15:26
藍劍 閱讀(7699)
評論(0) 編輯 收藏