1. 程式人生 > >Java逆向基礎之導出內存中的類一

Java逆向基礎之導出內存中的類一

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逆向基礎之導出內存中的類一