以前一直在win32匯編里打滾,對于修改一個exe文件是件很容易的事情,但到了java下發現想修改一個
沒源碼的.class文件還真是個問題,上網看了一大堆資料,有ASM和Javassist可以做這事情,ASM看上去
很專業,但看了文檔好象要在op code的級別下寫代碼,頭暈。Javassist簡單些,看完幾個sample心里基本
有數了,隨手找來一個有日期限制的Taglib,關鍵的代碼猜都不用猜在License.class里,反編譯后:
??
public static LicDate d()
{??
? String s = Dec("^%$&^%&*%&");
? return new LicDate.newInstance(Dec("%&&(*(&$%%"), s);
}
s里放著用Dec解碼的日期,自己寫個小程序:
import javassist.*;
public class Crack {
?public static void main(String args[])
?{
??try
??{
??? ClassPool pool = ClassPool.getDefault();
??? pool.insertClassPath("./taglib");
??? CtClass License = pool.get("License");
???
??? CtMethod a = License.getDeclaredMethod("d");
??? a.insertBefore("{return LicDate.newInstance(\"MM-dd-yyyy HH:mm:ss\",\"21-30-2088 01:01:01\");}"
??? License.writeFile();
??}
??catch (Exception e)
??{
???e.printStackTrace();
??}
?}
}
反編譯新的License.class發現文件改好了。