-
Notifications
You must be signed in to change notification settings - Fork 73
3. Creating your own Transformer
EpicPlayerA10 edited this page Sep 5, 2025
·
3 revisions
The whole deobfuscation process is based on transformers. Transformers are smaller pieces that are responsible for deobfuscating specific obfuscation techniques. In simple words - transformers are transforming obfuscated code into a more readable form.
Create a new class in deobfuscator-transformers module. The most basic transformer can look like this:
import uwu.narumi.deobfuscator.api.asm.ClassWrapper;
import uwu.narumi.deobfuscator.api.context.Context;
import uwu.narumi.deobfuscator.api.transformer.Transformer;
public class SomeTransformer extends Transformer {
@Override
protected void transform() throws Exception {
scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
// Code here
}));
}
}For example, this transformer replaces every "Hello, World!" string with "Bye, World!":
import org.objectweb.asm.tree.LdcInsnNode;
import uwu.narumi.deobfuscator.api.asm.ClassWrapper;
import uwu.narumi.deobfuscator.api.context.Context;
import uwu.narumi.deobfuscator.api.transformer.Transformer;
import java.util.Arrays;
public class SomeTransformer extends Transformer {
@Override
protected void transform() throws Exception {
scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
// Iterate over all LDC instructions in the method
Arrays.stream(methodNode.instructions.toArray())
.filter(insn -> insn.getOpcode() == LDC) // Check if opcode is LDC
.map(LdcInsnNode.class::cast) // Cast to LdcInsnNode so we can access the constant value (ldcInsn.cst)
.forEach(ldcInsn -> {
// Replace all "Hello, World!" strings with "Bye, World!"
if (ldcInsn.cst.equals("Hello, World!")) {
ldcInsn.cst = "Bye, World!";
}
});
}));
}
}