Java逆向基础之导出内存中的类一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java逆向基础之导出内存中的类一相关的知识,希望对你有一定的参考价值。

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

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

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

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

技术分享图片

将下载到的源码复制到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

技术分享图片

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

以上是关于Java逆向基础之导出内存中的类一的主要内容,如果未能解决你的问题,请参考以下文章

Java逆向基础之动态生成类

Java逆向基础之初识javaagent

Java逆向基础之打印所有类名

(易忘篇)java基础编程难点3

(易忘篇)java基础编程难点3

Android 逆向启动 DEX 字节码中的 Activity 组件 ( 替换 LoadedApk 中的类加载器 | 加载 DEX 文件中的 Activity 类并启动成功 )