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主要用于查看和分析字节码,但通过与其他工具(如ASM、BCEL或Javassist)结合,可以实现字节码的修改。例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,...
3. **写回字节码**:生成的字节码可以通过`ClassGen`写回为`.class`文件。 ```java OutputStream out = new FileOutputStream("NewMyClass.class"); classGen.getJavaClass().dump(out); out.close(); ``` **四、...
在移动开发领域,特别是安卓开发,由于Android应用是基于Dalvik虚拟机的字节码(DEX文件),jclasslib虽然不能直接处理DEX,但可以用于理解转换前的Java Class文件,辅助逆向工程和性能优化。 在使用jclasslib时,...
总的来说,"javassist-3.9.0.GA.jar.zip"提供的Javaassist库是一个强大的字节码操作工具,对于理解Java字节码以及在运行时修改代码有着重要的作用。开发者可以利用这个库轻松地实现复杂的编程任务,提高代码的可扩展...
1. **字节码生成**:展示如何使用Java反射API或其他工具生成自定义字节码,例如使用ASM、BCEL或Javassist库。 2. **字节码分析**:包含用于查看和理解字节码的工具,如javap命令,它能反汇编.class文件,展示方法的...
Java反编译是将Java字节码(.class文件)转换回接近源代码形式的过程。这一过程对于理解已编译的Java程序结构和功能至关重要,尤其是在没有源代码的情况下进行代码分析或调试。书中深入介绍了各种反编译工具,如JD-...
Javassist是一个开源的字节码编辑框架,它允许开发者在运行时动态修改类文件。这种能力可以用来实现在运行时动态解密和加载类文件,从而达到加壳的效果。 - **Javassist的特点**: - 支持类文件的动态修改。 - ...
在Java-ByteCode-Generator项目中,它首先会通过Java编译器(如javac)将源代码编译成字节码文件(.class)。然后,项目会使用Java的反射API或第三方库(如ASM、BCEL、Javassist等)来读取这些字节码,解析其结构,...
ASM提供了ClassReader和ClassWriter两个核心类,前者用于读取和解析.class文件,后者则负责生成新的字节码。中间过程可以通过ClassAdapter进行自定义的处理。主要API包括: - `ClassReader`:读取并解析.class文件...