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 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...
### 借助jclasslib与javassist修改Java class字节码 #### 一、引言 在软件开发过程中,有时我们可能面临一种情况:即需要对已经编译好的`.class`文件进行修改,但手中并没有对应的源代码。这种情况下,我们可以...
使用javassist修改class文件.pdf
Java字节码工程工具包,通常被称为Javassist,是一个开源项目,专为Java开发者提供了一种方便的方式来处理和操作字节码。Javassist在Java应用开发中扮演着重要的角色,尤其是在动态代理、AOP(面向切面编程)以及...
总结,Javassist提供了一种高级的接口来处理Java字节码,使得开发者能够轻松地进行动态类生成和修改,而无需深入了解字节码底层细节。对于需要实现AOP、代码生成或运行时修改类的场景,Javassist是一个非常实用的...
在给定的例子中,展示了如何使用 Javassist 修改已有的 `.class` 文件中的方法。以下是一些关键知识点: 1. **ClassPool**: `ClassPool` 类是 Javassist 的核心组件,它管理着一系列的 `CtClass` 对象,这些对象...
javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码
尽管jclasslib主要用于查看和分析字节码,但通过与其他工具(如ASM、BCEL或Javassist)结合,可以实现字节码的修改。例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,...
`javassist`库正是这样一个工具,它为Java字节码操作提供了一个简洁的API,试图降低这个过程的复杂性。在Java世界中,字节码编辑通常用于动态代理、AOP(面向切面编程)、性能优化以及调试等场景。 `javassist`库是...
Javassist 官方手册中文版...Javassist 是一个功能强大且灵活的字节码操作框架,提供了一种灵活的方式来操作 Java 类文件。通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。
3. **写回字节码**:生成的字节码可以通过`ClassGen`写回为`.class`文件。 ```java OutputStream out = new FileOutputStream("NewMyClass.class"); classGen.getJavaClass().dump(out); out.close(); ``` **四、...
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...
// 使用javassist处理字节码 CtClass ctClass = null; try { ctClass = ClassPool.getDefault().get(className); // 添加或修改方法、字段等 } catch (Exception e) { e.printStackTrace(); } finally { if...
它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解...
开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。
3. **字节码重新生成**:使用Javassist将修改后的源代码重新编译为字节码,并替换原有的.class文件。 4. **加载到JVM**:最后,将修改后的字节码加载到Java虚拟机,使修改生效。 **注意事项** 虽然这种动态字节码...
Java解析Class文件是Java开发中的一个重要环节,它涉及到对字节码的理解和处理。Class文件是Java编译器将源代码编译后的结果,包含了类的结构信息、方法定义、常量池等关键数据。理解并能解析Class文件,对于进行JVM...
字节码编程是Java技术领域中的一个重要组成部分,它涉及到Java类文件的二进制表示形式,即Java字节码。Java虚拟机(JVM)在运行Java程序时,实际上是在解释和执行这种字节码。字节码编程允许开发者在类加载到JVM之前...