作者:佚名 | 来源:网络 | 添加时间:2006-02-22 11:57:47 | 人气:2214
如果要操作局部变量,目前我所知的方法只能在该类里重建该方法,如果那位有其它的好办法,也请指点我一下。
addMethod方法在是类中增加一个新的方法,增加的方式有两种,这里就不做具体介绍。
其它方法也就不一一解释了,有兴趣的朋友可以研究一下javassist,相信你会写出功能更强大的修改class文件的类库。
四、class的修改
在破解过程中经常会看到rsa非对称加密算法,公钥往往以十六进制存放在class文件中,(当然,也有对公钥加密后存放在配置文件中的程序)以便解密已经加密过的信息。前不久破解的一个J2EE的开发平台就是这样的,license用RSA加密,在搞懂了它的算法后,自己构件license明文,自己再生成一对rsa的公私密钥,用自己的私钥对license文明进行RSA加密,再用十六进制编辑器替换程序中所有的公钥,(当然是用你的公钥替换他的公钥,不然也没法解密)一切就搞定。当然,我所说的只是一个方面,有时暴破时可能还得用到一些JVM的指命,比如你想让一个 return false 的方法 return ture
那你就得把相应位置的03 AC改为04 AC,位置怎么确定就不用我说了吧!
五、读JVM指令
没有什么可以多说的,如果要从jvm指令看懂成程,必须像熟汇编一样熟悉jvm指令集,还得有一个工具把class翻译成jvm指令代码,总不能用十六进制编辑器读代码吗?如果真是,那你就太牛了。我这里介绍 bcel 这个工具,它可以把class解释为jvm指令集并存为html文件,结果就像下面:
0 getstatic System.out Ljava/io/PrintStream;
3 ldc "is one"
5 invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V(String):void
8 getstatic System.out Ljava/io/PrintStream;
11 ldc "is two"
13 invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V(String):void
16 getstatic System.out Ljava/io/PrintStream;
19 ldc "is three"
21 invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V(String):void
24 getstatic System.out Ljava/io/PrintStream;
27 ldc "is four"
29 invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V(String):void
32 return
这是一个方法的全部指令,熟悉jvm指令集的话就已经能读懂它在做什么了
发现有关JAVA程序破解的文章不是很多,所以本人粗浅的谈论了一下JAVA程序破解时所用到的一些方法,当然,还有很多
凭经验才能找到的灵感,无法一一列举,本文质在抛砖引玉,望高手能写一些技术含量更高的文章供我们这些菜鸟学习。