论坛首页 Java企业应用论坛

用javassist破解java软件

浏览 12687 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-07   最后修改:2010-05-09
破解Java软件,这里提供两种思路, 1)修改主程序,使主程序不调用验证器; 2)修改验证器, 使验证器始终返回true.
用javassist可以实现这两种方式, 本质上一样的, 都是修改class文件达到目的. 很明显, 第一种烦琐, 第二种简单.
以下以第二种为例, 简单模拟一下.

这是主程序:
package trial.crack;

public class App {
	public static void main(String[] args){
		System.out.println(Checker.check());
	}
}


这是验证器:
package trial.crack;

public class Checker {
	public static boolean check(){
		return false;
	}
	
}

验证器的check方法负责验证工作, 该方法始终返回false.


这是Cracker:
package trial.crack;

import java.lang.reflect.Method;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class Cracker {
	public static void main(String[] args) throws Exception {
		String classname = "trial.crack.Checker";
		String methodname = "check";
		ClassPool pool = ClassPool.getDefault();

		CtClass cc = pool.get(classname);

		printClass(classname);

		try {
			CtMethod fMethod = cc.getDeclaredMethod(methodname, null);
			fMethod.setBody("return true;");

			cc.writeFile("D:/Program Files/workspace_myeclipse/javassist-sample/bin");
		} catch (NotFoundException e) {

			System.out.println(methodname + " not found!");
		}
	}

	public static void printClass(String classname) {
		try {
			System.out.println("Methods of Class " + classname + ":");
			Class c = Class.forName(classname);
			Method[] method = c.getDeclaredMethods();
			for (int i = 0; i < method.length; i++) {
				System.out.println(method[i]);
			}
			System.out.println();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


Cracker的原理:
修改Checker的check方法的函数体, 使其始终返回true. 然后将修改写到硬盘上(这里使用的是项目的bin目录,即class文件存放地),也就是生成字节码(.class文件), 来覆盖原来的class文件.


演示:
1)编译运行App
2)编译运行Cracker
3)运行APP
可以看到, 对于步骤1)和步骤3),控制台上会先后打印出:
false
true

硬解成功.

实战破解时, 采用类似的方式修改验证器,然后生成class文件到任意指定的目录, 然后将class文件覆盖软件原来的class文件即可.
   发表时间:2010-05-07  
如果是破解其他java程序,你怎么得到验证器的类名和方法名?
0 请登录后投票
   发表时间:2010-05-07  
whoamiwangwb 写道
如果是破解其他java程序,你怎么得到验证器的类名和方法名?

反编译主程序.
不过如果主程序使用了反反编译的招术, 那么, 视采用的是哪种反反编译技术, 会加大反编译难度, 或者从反编译后得出来的代码中很难找到我们需要的信息. 呵呵, 复杂了.
0 请登录后投票
   发表时间:2010-05-08  
谁做验证的程序会用一个方法来返回true和false,也太。。。。闻所未闻
0 请登录后投票
   发表时间:2010-05-08  
是啊,比如对java字节码做一个简单的移位加密处理等等,那如何破解呢还
0 请登录后投票
   发表时间:2010-05-08  
只能反编译.看源代码.找出加密部分.然后..再找出解密部分.或者自己解密.经验啊,,,不要鄙视我.呵呵
0 请登录后投票
   发表时间:2010-05-08   最后修改:2010-05-08
嗯, 看来仅仅是想当然的东西, 实用价值不大.
一般需要破解的也就是收费的商用软件吧, 而他们反反编译一般会做得非常好.
0 请登录后投票
   发表时间:2010-05-08  
java大多部署互联网服务。。。联网认证我觉得才是王道啊,哈哈
0 请登录后投票
   发表时间:2010-05-08  
有那么麻烦吗?现在的反编译软件很多,如:jak,jd之类的,直接拖进去不就ok?想看什么都可以喽,不过对已经混淆的代码,还是需要时间去研究的。
0 请登录后投票
   发表时间:2010-05-08  
    如果中国没有盗版,每个人都为他们使用的软件付钱。那么我们程序员的工资至少提高一倍。但是我们每天都在叫嚣自己工作多么不值。但是我去肆无忌惮的无视着别人的劳动。
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics