Dank Vader   11-30-2015, 06:14 PM
#1
Here is the code snippet I am using to rename classes
PHP Code:
import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.commons.RemappingClassAdapter; import org.objectweb.asm.commons.SimpleRemapper; import org.objectweb.asm.tree.ClassNode; //Imports showing which ASM (5.0.4) classes I'm using private static void doStuff() throws IOException { File jar = new File("Input.jar"); //Get's the ClassNodes for each class in a jar ArrayList<ClassNode> nodes = BCU.loadClasses(jar); //Appends '_Test' to each class except for the main class. Remapper mapper = new SimpleRemapper(getRename(nodes)); //Loop through the ClassNodes updating references to renamed classes for (ClassNode cn : nodes) { ClassReader cr = new ClassReader(BCU.getNodeBytes(cn)); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); RemappingClassAdapter rca = new RemappingClassAdapter(cw, mapper); cr.accept(rca, ClassReader.EXPAND_FRAMES); cr = new ClassReader(cw.toByteArray()); cr.accept(cn,ClassReader.EXPAND_FRAMES); } //Export the nodes as a new jar file and copy over the META-INF folder BCU.saveAsJar(nodes, "Output.jar"); }

When run on any jar file, fields in the exported jar are duplicated. The ones at the bottom have updated references to the renamed classes.

Example Output:
PHP Code:
public static String VERSION; public static final ConfigFile config; public static String VERSION; public static final ConfigFile_Test config;

Edit: I have a temporary fix by extending ClassNode and removing the duplicates post-rename. But I'd like something more efficient. This will do for now though.

Edit 2: I've run into a problem when exporting classes [Edit in regards to Edit 2: Found the problem. Edit 1 still applies. I would like to improve this]

Edit 3: My currently working approach:
Code:
@Override public void handle(ActionEvent event) { try { Timer t = new Timer(); File jar = Main.getTargetJar(); MappingGen.setLast(jar); Map<String, ClassNode> nodes = JarUtil.loadClasses(jar); System.out.println("Generating new names for " + nodes.size() + " classes... "); Map<String, MappedClass> renamed = MappingGen.getRename(tab.getObfuscation(), nodes); Map<String, byte[]> out = new HashMap<String, byte[]>(); System.out.println("Renaming " + renamed.size() + " classes... "); int workIndex = 1; SkidMapper mapper = new SkidMapper(renamed); for (ClassNode cn : nodes.values()) { ClassReader cr = new ClassReader(ASMUtil.getNodeBytes(cn)); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor remapper = new RemappingClassAdapter(cw, mapper); cr.accept(remapper, ClassReader.EXPAND_FRAMES); cr = new ClassReader(cw.toByteArray()); cw = new ClassWriter(0); cr.accept(cw, ClassReader.SKIP_DEBUG); out.put(renamed.get(cn.name).getRenamed(), cw.toByteArray()); // String percentStr = "" + ((workIndex + 0.000000001f) / (renamed.size() - 0.00001f)) * 100; percentStr = percentStr.substring(0, percentStr.length() > 5 ? 5 : percentStr.length()); System.out.println(" " + workIndex + "/" + renamed.size() + " [" + percentStr + "%]"); workIndex++; } System.out.println("Saving classes..."); JarUtil.saveAsJar(out, tab.getExportedName(), tab.yes()); System.out.println("Done! Completion time: " + (t.getTime()) + " Milliseconds"); } catch (Exception e) { e.printStackTrace(); } }
  
Users browsing this thread: 1 Guest(s)
Konloch Software - Bytecode Viewer - Hack Log - Reverse Engineering Forum
Copyright © 2014-2026 The Bytecode Club. Powered By MyBB.
CC0 Unless Specified Otherwise.