Firestorm是一个用JAVA写的代码生成工具,可以替你节省很多的代码量,可以说同类软件中功能最强的一个。 Firestorm是一个用JAVA写的代码生成工具,可以替你节省很多的代码量,可以说同类软件中功能最强的一个。 你可以在网上下载到最新的2.3试用版本,同时网站会发给你一个试用的license文件。既然是试用, 那么在使用上肯定有一定的限制。主要限制有3个: 1.只能最多生成5张表的DAO; 2.有时间限制; 3.不能自己定制代码生成; 为了能够更好的试用这个软件,我得改改它,去掉这些限制。将firestorm.jar打开后,可以看到它使用了 混淆器进行代码保护,不同于大多数的混淆器生成的文件,它的class和package大部分都是以关键字来命名, 所以如果你用JAD之类的工具把它反编译后是不能再把它编译成功,编译器会提示出错误。 反编译后,找到几个有关注册的关键文件,发现它使用的是数字签名技术来做的保护,所以想逆向找出 注册码的计算方法是不可行的了,只能通过修改文件的方法来破解。通常我们是先反编译,然后再修改 反编译后生成的原文件,最后再重新编译。但是由于文件名和包名的关系我们无法进行编译,除非把它的 这些'非法'的文件名和包名全部改成符合java语言规范的名称,由于类,包众多,互相调用也很 频繁,所以这种方法几乎不可能的。 另外一种方法就是使用softice之类的调试软件来破解,不过这个脱离JAVA的范畴,这里不做讨论。 还有一种方法可能很少有人用,就是先反编译得到原文件,然后找到关键的方法后修改它的字节码, 也就是class文件,这中方法往往需要你知道一些有关CLASS文件格式方面的知识(如果没有也不用担心), 有许多的处理字节码的工具可以帮助你,比较流行的这类工具主要有:apache.org的BCEL; jboss.com的javassist;objectweb.org的asm。都是出身名门哈。这3个工具各有特点, 这次我选用javassist,因为它修改class文件最方便,甚至不需要懂得字节码和class文件格式。 让我们来看看具体步骤: step1: 下载并安装FIRESTORM。 step2: 反编译jar文件,阅读代码,找到关键的方法。当然,我这里写出来,你就不用再麻烦了。(其实这步是最 麻烦的)。 找到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文件.这里我们需要写一个小程序来完成实现: import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; public class Test { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); //设置目标类的路径,确保能够找到需要修改的类,这里我指向firestorm.jar //解包后的路径 pool.insertClassPath("d:/work/firestorm/firestorm") ; //获得要修改的类 CtClass cc = pool.get("com.codefutures.if.if"); //设置方法需要的参数 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即可。 直接修改class文件内容即使是文本会导致App异常,正确方式是修改java再用生成的class替换掉原有的class前几天来了个小任务,把某项目中某人的邮件地址改了下。 由于对项目不熟悉,于是采用find方式找出app中所有包含某人邮件地址的文件都找出来了。 xml,properties大约三四个,还有两个class。 当时也没想太多,把class像xml一样用VI改了,心想改的是可见文本,应该问题不大,然后重启tomcat。也没测试一下。 今天打开发布在tomcat上的url,发现打不开了,心想应该是修改class导致的。到tomcat_home的logs文件夹下一看,还真是那两个类出错了,而且当时没留下备份,当时那刻还是挺慌的。 于马上翻文档,终于从SVN上下载了当时代码,三年前的,当年的工具也没有,还好Java代码是全的,于是用MyEclipse新作工程,再导入需要的包,修改文本值,还好,class顺利编写出来了。 再FTP登录,用新class替换老class,重启TOMCAT,项目如愿跑起来了,这下子真正清楚,为啥很多文章反复强调一定要把配置信息写到xml或是properties文件里面了。对开发团队来说,也许修改XML和JAVA是同样的工作量,但是对运维团队就大不一样了。 有应急预案,冷静沉着应对问题是今天没出岔子的关键。 这件小事得到两个教训:1.修改文件前必须先备份好;2.class文件必须是编译的版本,不能是修改的。如果大不幸没有源码,只要反编译,修改得到的Java,再编译回去。 于是记之,希望对遇到同样问题的人有所帮助。 |
|