The Bytecode Club
Log inJoin the club
Programming

ASM Save ArrayList ClassNode as Zip File

Started by Konloch · Oct 11, 2014

8 replies224,557 views
Oct 11, 2014#1
	public static void saveAsJar(ArrayList<ClassNode> nodeList, String fileName) {
		try {
			JarOutputStream out = new JarOutputStream(new FileOutputStream(fileName));
			for (ClassNode cn : nodeList) {
				ClassWriter cw = new ClassWriter(0);
				cn.accept(cw);
				
				out.putNextEntry(new ZipEntry(cn.name + ".class"));
				out.write(cw.toByteArray());
				out.closeEntry();
			}
			
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
Oct 11, 2014#4

konloch wrote:

Bibl wrote:

https://bitbucket.org/0xJAVA/byte-engineer/src

Looks sexy, I'll have to take a better look at this later.

Is there any documentation on it?

not really its not even done but when I need stuff I just add

Oct 12, 2014#5

Bibl wrote:

konloch wrote:

Bibl wrote:

https://bitbucket.org/0xJAVA/byte-engineer/src

Looks sexy, I'll have to take a better look at this later.

Is there any documentation on it?

not really its not even done but when I need stuff I just add

Interesting project non-the-less, favorited it for later.

What tools does it feature atm?

Oct 12, 2014#6

load jars from file or url 

JarDownloader dl = new JarDownloader(new JarInfo(new File("jar.jar")));
boolean worked = dl.parse();
Map<String, ClassNode> nodes = dl.getContents();
JarDumper dumper = new JarDumper(contents);
dumper.dump(new File("out.jar"));

Add Analysers, store class, field and method data into HookMaps
A lot of filters

https://bitbucket.org/0xJAVA/byte-engineer/src/e18021ae51bd52f5ad742bcde4d8aac135f78b69/byteanalysis/src/main/java/eu/bibl/banalysis/asm/desc/?at=master

Refactorer refactorer = new Refactorer(hookMap, contents);
refactorer.run();

changes whole jars class, method and field names based on mapping data.

InstructionPrinter.consolePrint(methodName); 

pretty prints

InstructionSearcher searcher = new InstructionSearcher(m.instructions, pattern);
boolean match = searcher.search();
List<AbstractInsnNode[]> matchedInsns = searched.getMatches();

find opcode/instruction patterns in code.

Oct 12, 2014#7

load jars from file or url 

JarDownloader dl = new JarDownloader(new JarInfo(new File("jar.jar")));
boolean worked = dl.parse();
Map<String, ClassNode> nodes = dl.getContents();
JarDumper dumper = new JarDumper(contents);
dumper.dump(new File("out.jar"));

Add Analysers, store class, field and method data into HookMaps
A lot of filters

https://bitbucket.org/0xJAVA/byte-engineer/src/e18021ae51bd52f5ad742bcde4d8aac135f78b69/byteanalysis/src/main/java/eu/bibl/banalysis/asm/desc/?at=master

Refactorer refactorer = new Refactorer(hookMap, contents);
refactorer.run();

changes whole jars class, method and field names based on mapping data.

InstructionPrinter.consolePrint(methodName); 

pretty prints

InstructionSearcher searcher = new InstructionSearcher(m.instructions, pattern);
boolean match = searcher.search();
List<AbstractInsnNode[]> matchedInsns = searched.getMatches();

find opcode/instruction patterns in code.

Sexy as fuck, I might start contributing to this once I'm done with Bytecode Viewer.

Jan 20, 2015#8

Nice, mine differs slightly:

public static void dumpJar(List<ClassNode> classes, Manifest manifest, String absolutePath) {
    try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(new File(absolutePath)), manifest)) {
        for (ClassNode cn : classes) {
            ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);

            jos.putNextEntry(new JarEntry(cn.name + ".class"));
            cn.accept(writer);
            jos.write(writer.toByteArray());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Gotta have a manifest to make it runnable xD

Jan 20, 2015#9

Nice, mine differs slightly:

public static void dumpJar(List<ClassNode> classes, Manifest manifest, String absolutePath) {
    try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(new File(absolutePath)), manifest)) {
        for (ClassNode cn : classes) {
            ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);

            jos.putNextEntry(new JarEntry(cn.name + ".class"));
            cn.accept(writer);
            jos.write(writer.toByteArray());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Gotta have a manifest to make it runnable xD

Very true! Haha

Got something to add?

Log in to post a reply.

Join the conversation