`
BurningFlame
  • 浏览: 5469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

用javassist破解java软件

阅读更多
破解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文件即可.
分享到:
评论
15 楼 simlee 2010-05-13  
chandler 写道
    如果中国没有盗版,每个人都为他们使用的软件付钱。那么我们程序员的工资至少提高一倍。但是我们每天都在叫嚣自己工作多么不值。但是我去肆无忌惮的无视着别人的劳动。


14 楼 zhaomingzm_23 2010-05-13  
zhaomingzm_23 写道
1.Javassist 小日本的东西,先鄙视一下
如果用yGroud 加密过的,你基本就没办法,你无法writeFile覆盖它长文件名的class,你可能都不知道要覆盖哪个。

2.没有什么软件是破解不了的(包括联网验证,我可以根本不让它联网,自己模拟一个response)
引用看雪的Tutorial:
软件的破解技术与保护技术这两者之间本身就是矛与盾的关系,它们是在互相斗争中发展进化的。这种技术上的较量归根到底是一种利益的冲突。

3.当然在只有class的前提下
想去掉原来讨厌的name, logo , not registered infomations 或者什么你不喜欢的东西,知道有个javassist你可以用,总比直接修改class byte[] 强点。


另:了解到jclasslib  也可以做这些事情,结合自带的Bytecode viewer 可以直接查看字节码

public class Name
{
	public static void main(String... mike) {
		System.out.println("测试");
	}
}


package com.mike.jclasslib.demo;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

/**
 * @since 2010-5-13上午09:12:28
 */
public class ConstantPoolChanger {
	
	private static String filePath = "C:/com/Name.class";
	
    private static final String suffix = ".jclasslib";
    
	public static void main(String[] args) throws Exception {
		
          FileInputStream fis = new FileInputStream(filePath);
          DataInput di = new DataInputStream(fis);
          ClassFile cf = new ClassFile();
          cf.read(di);
          CPInfo[] infos = cf.getConstantPool();

          int count = infos.length;
          for (int i = 0; i < count; i++) {
              if (infos != null) {
                  System.out.print(i);
                  if(i == 18){
                        //这里的18就是在Bytecode viewer 中查看得到的。
                        ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i];
                        System.out.println(
                        		uInfo.getString()
                        );
                        uInfo.setString("mike");
                  }                      
              }
          }
          cf.setConstantPool(infos);
          fis.close();
          
          //写到文件
          File f = new File(filePath + suffix);
          ClassFileWriter.writeToFile(f, cf);
    }
	
	
}





13 楼 liusha0007 2010-05-09  
收拾收拾实施
12 楼 zhaomingzm_23 2010-05-09  
1.Javassist 小日本的东西,先鄙视一下
如果用yGroud 加密过的,你基本就没办法,你无法writeFile覆盖它长文件名的class,你可能都不知道要覆盖哪个。

2.没有什么软件是破解不了的(包括联网验证,我可以根本不让它联网,自己模拟一个response)
引用看雪的Tutorial:
软件的破解技术与保护技术这两者之间本身就是矛与盾的关系,它们是在互相斗争中发展进化的。这种技术上的较量归根到底是一种利益的冲突。

3.当然在只有class的前提下
想去掉原来讨厌的name, logo , not registered infomations 或者什么你不喜欢的东西,知道有个javassist你可以用,总比直接修改class byte[] 强点。
11 楼 jnduan 2010-05-08  
楼主的方法只能对付一些简单的加密验证。

如果程序通过修改后的ClassLoader在运行时动态加载验证器,同时对一些重点的class文件进行检查,再破解难度就很大了。
10 楼 hellojinjie 2010-05-08  
这个不错,,
貌似可以拿来用来修改 opera mini 中代理服务器的地址..
====================
顺便借贵地问个问题:
我用jd发汇编opera mini 的代码后,修改了代理服务器的地址重新编译的时候,怎么会出错的?  一般的来说在给那些手机软件汉化用的都是些什么方法...

用LZ说的javassist修改field是一种方法,,是不是还有其他的方法?
9 楼 chandler 2010-05-08  
    如果中国没有盗版,每个人都为他们使用的软件付钱。那么我们程序员的工资至少提高一倍。但是我们每天都在叫嚣自己工作多么不值。但是我去肆无忌惮的无视着别人的劳动。
8 楼 kswy521 2010-05-08  
有那么麻烦吗?现在的反编译软件很多,如:jak,jd之类的,直接拖进去不就ok?想看什么都可以喽,不过对已经混淆的代码,还是需要时间去研究的。
7 楼 sw1982 2010-05-08  
java大多部署互联网服务。。。联网认证我觉得才是王道啊,哈哈
6 楼 BurningFlame 2010-05-08  
嗯, 看来仅仅是想当然的东西, 实用价值不大.
一般需要破解的也就是收费的商用软件吧, 而他们反反编译一般会做得非常好.
5 楼 fishkey 2010-05-08  
只能反编译.看源代码.找出加密部分.然后..再找出解密部分.或者自己解密.经验啊,,,不要鄙视我.呵呵
4 楼 yuanliyin 2010-05-08  
是啊,比如对java字节码做一个简单的移位加密处理等等,那如何破解呢还
3 楼 freish 2010-05-08  
谁做验证的程序会用一个方法来返回true和false,也太。。。。闻所未闻
2 楼 BurningFlame 2010-05-07  
whoamiwangwb 写道
如果是破解其他java程序,你怎么得到验证器的类名和方法名?

反编译主程序.
不过如果主程序使用了反反编译的招术, 那么, 视采用的是哪种反反编译技术, 会加大反编译难度, 或者从反编译后得出来的代码中很难找到我们需要的信息. 呵呵, 复杂了.
1 楼 whoamiwangwb 2010-05-07  
如果是破解其他java程序,你怎么得到验证器的类名和方法名?

相关推荐

    javaagent+javassist

    Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...

    借助jclasslib与javassist修改java class字节码

    ### 借助jclasslib与javassist修改Java class字节码 #### 一、引言 在软件开发过程中,有时我们可能面临一种情况:即需要对已经编译好的`.class`文件进行修改,但手中并没有对应的源代码。这种情况下,我们可以...

    java 反编译工具 jboss-javassist

    通过这个工具,开发者无需重新编译源代码就能对Java类进行修改和增强,这对于理解和调试已部署的软件或者创建元编程应用非常有用。 Javassist主要提供了以下功能: 1. **字节码生成**:Javassist可以动态生成类的...

    agent+javassist例子

    在IT行业中,`Java Agent`和`javassist`是两个非常关键的技术,它们在软件开发、测试和性能优化中发挥着重要作用。`Java Agent`允许我们对Java应用程序进行预处理,比如字节码注入,而`javassist`库则提供了一个方便...

    Thinking in Java Jar.rar_Thing In Java_fruity88_in_javassist-3.9

    在学习这部分内容时,读者可能需要创建一个名为`fruity88`的项目,并使用`javassist-3.9.0.jar`来实现某些动态类生成或字节码操作的功能。 总的来说,这个压缩包包含的资源是学习《Thinking in Java》第四版中关于...

    javassist3.9GA

    使用这个版本,开发者可以将Javaassist集成到他们的项目中,通过引入相应的jar包(javassist.jar)来利用其提供的功能。 在实际应用中,Javaassist的工作流程通常包括以下步骤: 1. 加载类:首先,你需要使用`...

    jboss-javassist和JByteMode整合包

    《深入理解Java动态代理:jbosss-javassist与JByteMode整合》 在Java开发中,有时我们需要在运行时动态地修改或增强类的行为,这时动态代理技术就显得尤为重要。Javassist和JByteMode是两个强大的工具,分别在不同...

    javassist.zip

    Javassist(JAVA编程助手)进行JAVA字节码操作 易于理解的它是一个用于在Java中编辑字节码的类库;它支持Java 程序在运行时定义一个新类,并在 JVM加载它。与其他类似的字节码编辑器不同,Javassist提供了 API的...

    javassist-3.7.ga.jar

    `javassist-3.7.ga.jar` 文件是 Javaassist 库的一个版本,版本号为 3.7 GA(General Availability),意味着这是一个公开可用的稳定版本。 Javaassist 提供了一系列的 API,使得开发者可以方便地读取、修改和创建 ...

    Javassist代码注入

    总之,Javassist通过其灵活的API使得在运行时对Java代码进行修改变得简单,它在代码热更新、插件系统等领域有着广泛的应用。`HotPatchDemo`是一个很好的实例,帮助我们理解如何实际操作这一过程。通过熟练掌握...

    javassist-3.18.2-GA.jar

    7. **TypeConverter**:Javaassist 提供了转换机制,将 Java 对象与字节码表达式之间进行转换,使得你可以方便地在字节码操作中使用 Java 对象。 8. **ClassFile** 和 **ConstPool**:这两个类分别代表 Class 文件...

    免费开源!!Java字节码工程工具包

    Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是Java中用于编辑字节码的类库;它使 Java 程序能够在运行时定义新类,并在 JVM 加载时修改类文件。与其他类似的字节码编辑器不同,Javassist 提供两个...

    基于 javaagent 对 java 原生类的 方法进行字节码动态修改, 以此引发的一些关于 绕过 Java 软件.zip

    在实际操作中,我们可能会使用如 ASM、ByteBuddy 或 Javassist 这样的字节码库来帮助创建和应用 ClassFileTransformer。这些库提供了友好的 API,让我们能够方便地读取、修改和生成字节码。 然而,这种方法并不总是...

    Java字节码工程工具包.zip

    Java字节码工程工具包Javassist 版本 3版权所有 (C) 1999-2023 Shigeru Chiba,保留所有权利。Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是一个用于编辑 Java 字节码的类库它使 Java 程序能够在运行...

    java-agent演示项目,修改Java源代码_java-agent-demo.zip

    Java Agent技术是Java平台提供的...通过研究和运行这样的演示项目,开发者可以学习如何创建自己的Java Agent,掌握使用字节码操作库来动态修改Java应用程序的能力,以及如何在实际的软件开发和系统维护中应用这一技术。

    javassist3150gajar_jb51

    这个 "javassist-3.15.0-GA.jar" 文件就是一个 JAR 包,包含了 Javaassist 库的所有类和方法,使得开发者可以直接在他们的项目中引用和使用。 Javaassist 提供了一套API,可以方便地对字节码进行操作。这些操作包括...

    java加壳的问题

    2. **使用加壳技术**:理论上讲,Java可以使用类似于C语言的加壳技术,但在实际操作中存在诸多限制。例如,Java虚拟机(JVM)本身并不支持动态加载加密后的类文件。 #### 三、Java加壳的可能性与实践 传统观点认为,...

    Javassist.jar

    4. **字节码表达式**:Javaassist支持一个类似于Java语法的表达式API,可以用它来生成字节码。这种表达式可以被转换为对应的字节码序列,进而添加到类的方法中。 5. **与反射的结合**:虽然Java的反射API已经足够...

    最新版Alibaba_Java_Coding_Guidelines-2.1.1.zip离线包

    阿里巴巴作为全球知名的技术公司,其对软件开发有着严格的规范和标准,尤其是对于Java编程语言。最新发布的《Alibaba Java Coding Guidelines 2.1.1》是对Java开发人员的一份重要指南,旨在提升代码质量,保证项目...

    基于Java Reflection自动逆向生成类间方法关系图的解析器.pdf

    通过上述知识点的详细解读,可以看出,论文所探讨的解析器对于处理大型Java软件系统的错误定位和故障分析具有重要实践价值。借助Java反射机制和Javassist等工具,可以有效地建立类方法关系图,并进一步扩展为软件...

Global site tag (gtag.js) - Google Analytics