`
flashing
  • 浏览: 356951 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

使用javassist处理字节码混淆过的class文件

F# 
阅读更多
java程序员,有时候为了某种特定目的比如调试或者增强代码,不得不反编译一下代码,然后把内容修改成自己想要的,再从新打包回jar文件里面。
当然,很多时候为了防止这种事情发生,于是代码混淆工具诞生了。一般代码级别的混淆,反编译之后基本无法获得原有的逻辑,不过仍然可以直接修改代码然后再编译打包回去;比较厉害的情况是字节码直接混淆,这种情况有可能反编译出来比较奇特的代码,我最近就遇到这样的问题,反编译出来竟然是这样的结构(忽略了函数体):
private static String a(String[] as);
public static void a();
private static String a();
private static String a(String as);
private static void a(Date paramDate1, Date paramDate2);


这样的代码没法修改,因为根本不可能编译通过,所以只能在字节码级别做文章,尽量简单的解决混淆带来的麻烦。
好在javassist就可以处理这样的问题,除了动态增强之外,javassist也可以把增强过的类,从新写入到文件中。
import java.io.File;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;

public class Pathcer {
	static String tempDir = "c:\\output1";
	static String className = "com.company.fQ";

	public static void main(String[] args) throws Exception {
		ClassPool pool = ClassPool.getDefault();
		CtClass cc = pool.get(className);

		File f = new File(tempDir);
		if (!f.exists())
			f.mkdirs();

		CtMethod targetM = null;

		CtMethod[] methos = cc.getDeclaredMethods();
//找到private staitc void a();
		for (CtMethod m : methos) {
			if (!m.getName().equals("a"))
				continue;
			if (m.getReturnType().getName().equals("void"))
				continue;
			CtClass arg[] = m.getParameterTypes();
			if (arg != null && arg.length > 0) 
				continue;
			
			targetM = m;
			break;
		}

		if (targetM == null) {
			System.out.println("not found the target mehtod!exit now.");
			System.exit(1);
		}
//直接写java代码,可以动态编译进去;好消息是setBody函数里面可以写任何东西。
		targetM.setBody("{return \"This is my code.\";}");

//注意因为class已经加载过了,所以必须从新加载一次。
		ClassPool.getDefault().get(className).writeFile(f.getAbsolutePath());
	}

}




javassist可以增强任何东西,比如给一个类添加接口,添加父类,添加函数,删除函数,总之几乎无所不能。

分享到:
评论

相关推荐

    Javassist 修改class字节码

    Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...

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

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

    使用javassist修改class文件.pdf

    使用javassist修改class文件.pdf

    javassist,Java字节码工程工具包.zip

    Java字节码工程工具包,通常被称为Javassist,是一个开源项目,专为Java开发者提供了一种方便的方式来处理和操作字节码。Javassist在Java应用开发中扮演着重要的角色,尤其是在动态代理、AOP(面向切面编程)以及...

    Javassist如何操作Java 字节码

    总结,Javassist提供了一种高级的接口来处理Java字节码,使得开发者能够轻松地进行动态类生成和修改,而无需深入了解字节码底层细节。对于需要实现AOP、代码生成或运行时修改类的场景,Javassist是一个非常实用的...

    使用Javassist对.class文件进行修改.doc

    在给定的例子中,展示了如何使用 Javassist 修改已有的 `.class` 文件中的方法。以下是一些关键知识点: 1. **ClassPool**: `ClassPool` 类是 Javassist 的核心组件,它管理着一系列的 `CtClass` 对象,这些对象...

    javassist, Java字节码工程工具包.zip

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

    修改字节码 jclasslib

    尽管jclasslib主要用于查看和分析字节码,但通过与其他工具(如ASM、BCEL或Javassist)结合,可以实现字节码的修改。例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,...

    javassist试图简化Java字节码的编辑

    `javassist`库正是这样一个工具,它为Java字节码操作提供了一个简洁的API,试图降低这个过程的复杂性。在Java世界中,字节码编辑通常用于动态代理、AOP(面向切面编程)、性能优化以及调试等场景。 `javassist`库是...

    javassist官方手册(中文)

    Javassist 官方手册中文版...Javassist 是一个功能强大且灵活的字节码操作框架,提供了一种灵活的方式来操作 Java 类文件。通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。

    JAVA字节码操作库 BCEL

    3. **写回字节码**:生成的字节码可以通过`ClassGen`写回为`.class`文件。 ```java OutputStream out = new FileOutputStream("NewMyClass.class"); classGen.getJavaClass().dump(out); out.close(); ``` **四、...

    Javassistjar包

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javassist-3.14.0-GA

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javaagent+javassist

    // 使用javassist处理字节码 CtClass ctClass = null; try { ctClass = ClassPool.getDefault().get(className); // 添加或修改方法、字段等 } catch (Exception e) { e.printStackTrace(); } finally { if...

    javassist反射工具

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...

    javassist-3.12.1.GA.jar

    开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

    jboss-javassist和JByteMode整合包

    3. **字节码重新生成**:使用Javassist将修改后的源代码重新编译为字节码,并替换原有的.class文件。 4. **加载到JVM**:最后,将修改后的字节码加载到Java虚拟机,使修改生效。 **注意事项** 虽然这种动态字节码...

    java解析class文件

    Java解析Class文件是Java开发中的一个重要环节,它涉及到对字节码的理解和处理。Class文件是Java编译器将源代码编译后的结果,包含了类的结构信息、方法定义、常量池等关键数据。理解并能解析Class文件,对于进行JVM...

    字节码编程和操作系统等知识文档

    字节码编程是Java技术领域中的一个重要组成部分,它涉及到Java类文件的二进制表示形式,即Java字节码。Java虚拟机(JVM)在运行Java程序时,实际上是在解释和执行这种字节码。字节码编程允许开发者在类加载到JVM之前...

Global site tag (gtag.js) - Google Analytics