`
flashing
  • 浏览: 359170 次
  • 性别: 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可以增强任何东西,比如给一个类添加接口,添加父类,添加函数,删除函数,总之几乎无所不能。

分享到:
评论

相关推荐

    修改字节码 jclasslib

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

    JAVA字节码操作库 BCEL

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

    jclasslib反编译工具包,修改class文件

    在移动开发领域,特别是安卓开发,由于Android应用是基于Dalvik虚拟机的字节码(DEX文件),jclasslib虽然不能直接处理DEX,但可以用于理解转换前的Java Class文件,辅助逆向工程和性能优化。 在使用jclasslib时,...

    javassist-3.9.0.GA.jar.zip

    总的来说,"javassist-3.9.0.GA.jar.zip"提供的Javaassist库是一个强大的字节码操作工具,对于理解Java字节码以及在运行时修改代码有着重要的作用。开发者可以利用这个库轻松地实现复杂的编程任务,提高代码的可扩展...

    bytecode-basics:“JVM 字节码简介”会话的源代码

    1. **字节码生成**:展示如何使用Java反射API或其他工具生成自定义字节码,例如使用ASM、BCEL或Javassist库。 2. **字节码分析**:包含用于查看和理解字节码的工具,如javap命令,它能反汇编.class文件,展示方法的...

    透视Java-反编译、修补和逆向工程技术].Alex.Kalinovsky.扫描版.pdf

    Java反编译是将Java字节码(.class文件)转换回接近源代码形式的过程。这一过程对于理解已编译的Java程序结构和功能至关重要,尤其是在没有源代码的情况下进行代码分析或调试。书中深入介绍了各种反编译工具,如JD-...

    java加壳的问题

    Javassist是一个开源的字节码编辑框架,它允许开发者在运行时动态修改类文件。这种能力可以用来实现在运行时动态解密和加载类文件,从而达到加壳的效果。 - **Javassist的特点**: - 支持类文件的动态修改。 - ...

    Java-ByteCode-Generator:该项目将解析java的源代码-java project source code

    在Java-ByteCode-Generator项目中,它首先会通过Java编译器(如javac)将源代码编译成字节码文件(.class)。然后,项目会使用Java的反射API或第三方库(如ASM、BCEL、Javassist等)来读取这些字节码,解析其结构,...

    asm_reborn

    ASM提供了ClassReader和ClassWriter两个核心类,前者用于读取和解析.class文件,后者则负责生成新的字节码。中间过程可以通过ClassAdapter进行自定义的处理。主要API包括: - `ClassReader`:读取并解析.class文件...

Global site tag (gtag.js) - Google Analytics