为什么需要这个,因为在之前的博文中提到,为了增加逆向的难度,部分软件会对部分关键方法和类进行隐藏,所以我们需要把这个类从内存中拿出来。

本文介绍使用javaagent的方法,下一篇介绍dumpclass,两种方法各有利弊。

本文需要用到第三方jar为:javassist-3.20.0-GA.jar,不过我们需要的是它的源码javassist-3.20.0-GA-sources.jar

新建名为DumpClassAgent的项目,项目结构如下

Java逆向基础之导出内存中的类一_第1张图片

将下载到的源码复制到src目录下

DumpClassAgent.java文件内容

package com.vvvtimes.demo.agent;

import java.lang.instrument.Instrumentation;

public class DumpClassAgent {

	public static void premain(String agentOps, Instrumentation inst) {
		try {
			inst.addTransformer(new DumpClassTransformer());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

DumpClassTransformer.java文件内容

package com.vvvtimes.demo.agent;

import java.io.ByteArrayInputStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

import javassist.ClassPool;
import javassist.CtClass;

public class DumpClassTransformer implements ClassFileTransformer {
	private static ClassPool pool;
	
	static {
		pool = ClassPool.getDefault();
	}

	@Override
	public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
			ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
		System.out.println(className);
		try {
			if ("com/vvvtimes/bean/Employee".equals(className)) {
				CtClass ctClass = pool.makeClass(new ByteArrayInputStream(classfileBuffer), false);
				ctClass.writeFile("E:\\");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

MANIFEST.MF文件内容

Manifest-Version: 1.0
Premain-Class: com.vvvtimes.demo.agent.DumpClassAgent
Can-Redefine-Classes: true

打包文件成DumpClassAgent.jar

将动态生成类的博文中的代码导出可运行jar,命名为DynamicGenerateClass.jar

放到同一目录执行命令

java -javaagent:DumpClassAgent.jar -jar DynamicGenerateClass.jar

E盘会生成对应的class

Java逆向基础之导出内存中的类一_第2张图片

用jd-gui反编译可以得到源码。