`
flashing
  • 浏览: 350336 次
  • 性别: 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代码层,...

    使用javassist修改class文件.pdf

    使用javassist修改class文件.pdf

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

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

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

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

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

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

    Javassist如何操作Java 字节码

    主要介绍了Javassist如何操作Java 字节码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

    javassist-3.14.0-GA

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

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

    Java字节码工程工具包

    Javassistjar包

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

    javassist反射工具

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

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

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

    javassist-3.18.0-ga.jar

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru ...它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

    javassist-3.12.1.GA.jar

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

    javassist:Java字节码工程工具包

    Java字节码工程工具包 ... 如果用户使用源代码级API,则他们可以在不了解Java字节码规范的情况下编辑类文件。 整个API仅使用Java语言的词汇表进行设计。 您甚至可以以源文本的形式指定插入的字节码。 Javassist

    Javassist-3.12

    它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法...

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

    如果用户使用源代码级API,他们可以在不了解Java字节码规范的情况下编辑类文件。整个API仅使用Java语言的词汇进行设计。您甚至可以以源文本的形式指定插入的字节码;Javassist 即时编译它。另一方面,字节码级API...

    DroidAssist:基于Javassist的轻量级Android Studio gradle插件,用于在Android中编辑字节码

    DroidAssist DroidAssist 是一个轻量级的 Android 字节码编辑插件,基于 Javassist 对字节码操作,根据 xml 配置处理 class 文件,以达到对 class 文件进行动态修改的效果。和其他 AOP 方案不同,DroidAssist 提供了...

    javassist.jar

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru ...它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

    javassist.zip

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

Global site tag (gtag.js) - Google Analytics