• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Гайд Делаем свой обфускатор для ваших паст

  • Автор темы Автор темы r3z
  • Дата начала Дата начала
aka wqzxqz
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
671
Реакции
11
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

1. настроим проект
Добавим зависимость ASM

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
Expand Collapse Copy
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>

p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
       
        // чтение байткода классов/класса
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
       
        // трансформация
        // (здесь позже добавим трансформеры)
       
        // записывание модифицированного класса
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
}

2. Добавляем систему трансформаций
Создаем интерфейс и сервис

Добавляем внутрь класса JavaObfuscator:
Java:
Expand Collapse Copy
// сервис для управления трансформерами
static class TransformerService {
    private List<Transformer> transformers = new ArrayList<>();
   
    void addTransformer(Transformer t) {
        transformers.add(t);
    }
   
    void applyTransformations(ClassNode classNode) {
        // применение трансформации к всему классу
        transformers.forEach(t -> t.transformClass(classNode));
       
        // применение трансформации к каждому методу
        classNode.methods.forEach(method ->
            transformers.forEach(t -> t.transformMethod(method))
        );
    }
}

// небольшой интерфейс для трансформеров
interface Transformer {
    default void transformClass(ClassNode cn) {}
    default void transformMethod(MethodNode mn) {}
}

3. Пишем шифрование строк
Делаем трансформер для строк

Добавляем класс-трансформер:
Java:
Expand Collapse Copy
static class StringEncryptor implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                // заменим строку на вызов decrypt("super_puper_obf")
                String original = (String) ldcNode.cst;
                String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
               
                InsnList newInstructions = new InsnList();
                newInstructions.add(new LdcInsnNode(encrypted));
                newInstructions.add(new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "JavaObfuscator",
                    "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;"
                ));
               
                method.instructions.insertBefore(insn, newInstructions);
                method.instructions.remove(insn);
            }
        }
    }
}

// метод для дешифровки (обычный base64)
public static String decrypt(String input) {
    return new String(Base64.getDecoder().decode(input));
}

Пример работы
До:
Java:
Expand Collapse Copy
System.out.println("Hello World");
После:
Java:
Expand Collapse Copy
System.out.println(decrypt("SGVsbG8gV29ybGQ="));

4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
Expand Collapse Copy
static class ControlFlowObfuscator implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn.getOpcode() == Opcodes.ILOAD) { // загрузка int
                // бессмысленная проверка
                InsnList garbage = new InsnList();
                garbage.add(new InsnNode(Opcodes.ICONST_1));
                garbage.add(new JumpInsnNode(
                    Opcodes.IFNE,
                    new LabelNode() // всегда выполняется
                ));
               
                method.instructions.insertBefore(insn, garbage);
            }
        }
    }
}

Как это выглядит в коде:
До:
Java:
Expand Collapse Copy
int x = 5;
После (фейк-код):
Java:
Expand Collapse Copy
if (1 != 0) { // всегда true
    int x = 5;
}

5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
Expand Collapse Copy
public static void main(String[] args) throws Exception {
    // ... (чтение класса)
   
    TransformerService service = new TransformerService();
    service.addTransformer(new StringEncryptor());
    service.addTransformer(new ControlFlowObfuscator());
   
    service.applyTransformations(classNode);
   
    // ... (запись класса)
}

6. Запускаем обфускатор
Компилируем наш обфускатор

Делаем это через запуск из интелиджи

Обфусцируем тестовый класс
Bash:
Expand Collapse Copy
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class

Запускаем результат
Bash:
Expand Collapse Copy
java -noverify TestObf

Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)

Полный код обфускатора:

порно:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;
import java.util.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
       
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
       
        TransformerService service = new TransformerService();
        service.addTransformer(new StringEncryptor());
        service.addTransformer(new ControlFlowObfuscator());
       
        service.applyTransformations(classNode);
       
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
   
    // метод для дешифровки (обычный base64)
    public static String decrypt(String input) {
        return new String(Base64.getDecoder().decode(input));
    }
   
    static class TransformerService {
        private List<Transformer> transformers = new ArrayList<>();
       
        void addTransformer(Transformer t) {
            transformers.add(t);
        }
       
        void applyTransformations(ClassNode classNode) {
            transformers.forEach(t -> t.transformClass(classNode));
            classNode.methods.forEach(method ->
                transformers.forEach(t -> t.transformMethod(method))
            );
        }
    }
   
    interface Transformer {
        default void transformClass(ClassNode cn) {}
        default void transformMethod(MethodNode mn) {}
    }
   
    static class StringEncryptor implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                    String original = (String) ldcNode.cst;
                    String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
                   
                    InsnList newInstructions = new InsnList();
                    newInstructions.add(new LdcInsnNode(encrypted));
                    newInstructions.add(new MethodInsnNode(
                        Opcodes.INVOKESTATIC,
                        "JavaObfuscator",
                        "decrypt",
                        "(Ljava/lang/String;)Ljava/lang/String;"
                    ));
                   
                    method.instructions.insertBefore(insn, newInstructions);
                    method.instructions.remove(insn);
                }
            }
        }
    }
   
    static class ControlFlowObfuscator implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn.getOpcode() == Opcodes.ILOAD) {
                    InsnList garbage = new InsnList();
                    garbage.add(new InsnNode(Opcodes.ICONST_1));
                    garbage.add(new JumpInsnNode(
                        Opcodes.IFNE,
                        new LabelNode()
                    ));
                    method.instructions.insertBefore(insn, garbage);
                }
            }
        }
    }
}

Всем пока. ??
 
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

1. настроим проект
Добавим зависимость ASM

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
Expand Collapse Copy
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>

p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        // чтение байткода классов/класса
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        // трансформация
        // (здесь позже добавим трансформеры)
      
        // записывание модифицированного класса
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
}

2. Добавляем систему трансформаций
Создаем интерфейс и сервис

Добавляем внутрь класса JavaObfuscator:
Java:
Expand Collapse Copy
// сервис для управления трансформерами
static class TransformerService {
    private List<Transformer> transformers = new ArrayList<>();
  
    void addTransformer(Transformer t) {
        transformers.add(t);
    }
  
    void applyTransformations(ClassNode classNode) {
        // применение трансформации к всему классу
        transformers.forEach(t -> t.transformClass(classNode));
      
        // применение трансформации к каждому методу
        classNode.methods.forEach(method ->
            transformers.forEach(t -> t.transformMethod(method))
        );
    }
}

// небольшой интерфейс для трансформеров
interface Transformer {
    default void transformClass(ClassNode cn) {}
    default void transformMethod(MethodNode mn) {}
}

3. Пишем шифрование строк
Делаем трансформер для строк

Добавляем класс-трансформер:
Java:
Expand Collapse Copy
static class StringEncryptor implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                // заменим строку на вызов decrypt("super_puper_obf")
                String original = (String) ldcNode.cst;
                String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
              
                InsnList newInstructions = new InsnList();
                newInstructions.add(new LdcInsnNode(encrypted));
                newInstructions.add(new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "JavaObfuscator",
                    "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;"
                ));
              
                method.instructions.insertBefore(insn, newInstructions);
                method.instructions.remove(insn);
            }
        }
    }
}

// метод для дешифровки (обычный base64)
public static String decrypt(String input) {
    return new String(Base64.getDecoder().decode(input));
}

Пример работы
До:
Java:
Expand Collapse Copy
System.out.println("Hello World");
После:
Java:
Expand Collapse Copy
System.out.println(decrypt("SGVsbG8gV29ybGQ="));

4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
Expand Collapse Copy
static class ControlFlowObfuscator implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn.getOpcode() == Opcodes.ILOAD) { // загрузка int
                // бессмысленная проверка
                InsnList garbage = new InsnList();
                garbage.add(new InsnNode(Opcodes.ICONST_1));
                garbage.add(new JumpInsnNode(
                    Opcodes.IFNE,
                    new LabelNode() // всегда выполняется
                ));
              
                method.instructions.insertBefore(insn, garbage);
            }
        }
    }
}

Как это выглядит в коде:
До:
Java:
Expand Collapse Copy
int x = 5;
После (фейк-код):
Java:
Expand Collapse Copy
if (1 != 0) { // всегда true
    int x = 5;
}

5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
Expand Collapse Copy
public static void main(String[] args) throws Exception {
    // ... (чтение класса)
  
    TransformerService service = new TransformerService();
    service.addTransformer(new StringEncryptor());
    service.addTransformer(new ControlFlowObfuscator());
  
    service.applyTransformations(classNode);
  
    // ... (запись класса)
}

6. Запускаем обфускатор
Компилируем наш обфускатор

Делаем это через запуск из интелиджи

Обфусцируем тестовый класс
Bash:
Expand Collapse Copy
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class

Запускаем результат
Bash:
Expand Collapse Copy
java -noverify TestObf

Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)

Полный код обфускатора:

порно:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;
import java.util.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        TransformerService service = new TransformerService();
        service.addTransformer(new StringEncryptor());
        service.addTransformer(new ControlFlowObfuscator());
      
        service.applyTransformations(classNode);
      
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
  
    // метод для дешифровки (обычный base64)
    public static String decrypt(String input) {
        return new String(Base64.getDecoder().decode(input));
    }
  
    static class TransformerService {
        private List<Transformer> transformers = new ArrayList<>();
      
        void addTransformer(Transformer t) {
            transformers.add(t);
        }
      
        void applyTransformations(ClassNode classNode) {
            transformers.forEach(t -> t.transformClass(classNode));
            classNode.methods.forEach(method ->
                transformers.forEach(t -> t.transformMethod(method))
            );
        }
    }
  
    interface Transformer {
        default void transformClass(ClassNode cn) {}
        default void transformMethod(MethodNode mn) {}
    }
  
    static class StringEncryptor implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                    String original = (String) ldcNode.cst;
                    String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
                  
                    InsnList newInstructions = new InsnList();
                    newInstructions.add(new LdcInsnNode(encrypted));
                    newInstructions.add(new MethodInsnNode(
                        Opcodes.INVOKESTATIC,
                        "JavaObfuscator",
                        "decrypt",
                        "(Ljava/lang/String;)Ljava/lang/String;"
                    ));
                  
                    method.instructions.insertBefore(insn, newInstructions);
                    method.instructions.remove(insn);
                }
            }
        }
    }
  
    static class ControlFlowObfuscator implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn.getOpcode() == Opcodes.ILOAD) {
                    InsnList garbage = new InsnList();
                    garbage.add(new InsnNode(Opcodes.ICONST_1));
                    garbage.add(new JumpInsnNode(
                        Opcodes.IFNE,
                        new LabelNode()
                    ));
                    method.instructions.insertBefore(insn, garbage);
                }
            }
        }
    }
}

Всем пока. ??
бл, чувак, это годно нах!!! ??
 
а эсли риално? ???
бл годнота ваще братела, я жопастый ?
а эсли риално? ???
я запастэл*
а эсли риално? ???
я запастэл*
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

1. настроим проект
Добавим зависимость ASM

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
Expand Collapse Copy
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>

p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        // чтение байткода классов/класса
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        // трансформация
        // (здесь позже добавим трансформеры)
      
        // записывание модифицированного класса
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
}

2. Добавляем систему трансформаций
Создаем интерфейс и сервис

Добавляем внутрь класса JavaObfuscator:
Java:
Expand Collapse Copy
// сервис для управления трансформерами
static class TransformerService {
    private List<Transformer> transformers = new ArrayList<>();
  
    void addTransformer(Transformer t) {
        transformers.add(t);
    }
  
    void applyTransformations(ClassNode classNode) {
        // применение трансформации к всему классу
        transformers.forEach(t -> t.transformClass(classNode));
      
        // применение трансформации к каждому методу
        classNode.methods.forEach(method ->
            transformers.forEach(t -> t.transformMethod(method))
        );
    }
}

// небольшой интерфейс для трансформеров
interface Transformer {
    default void transformClass(ClassNode cn) {}
    default void transformMethod(MethodNode mn) {}
}

3. Пишем шифрование строк
Делаем трансформер для строк

Добавляем класс-трансформер:
Java:
Expand Collapse Copy
static class StringEncryptor implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                // заменим строку на вызов decrypt("super_puper_obf")
                String original = (String) ldcNode.cst;
                String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
              
                InsnList newInstructions = new InsnList();
                newInstructions.add(new LdcInsnNode(encrypted));
                newInstructions.add(new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "JavaObfuscator",
                    "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;"
                ));
              
                method.instructions.insertBefore(insn, newInstructions);
                method.instructions.remove(insn);
            }
        }
    }
}

// метод для дешифровки (обычный base64)
public static String decrypt(String input) {
    return new String(Base64.getDecoder().decode(input));
}

Пример работы
До:
Java:
Expand Collapse Copy
System.out.println("Hello World");
После:
Java:
Expand Collapse Copy
System.out.println(decrypt("SGVsbG8gV29ybGQ="));

4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
Expand Collapse Copy
static class ControlFlowObfuscator implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn.getOpcode() == Opcodes.ILOAD) { // загрузка int
                // бессмысленная проверка
                InsnList garbage = new InsnList();
                garbage.add(new InsnNode(Opcodes.ICONST_1));
                garbage.add(new JumpInsnNode(
                    Opcodes.IFNE,
                    new LabelNode() // всегда выполняется
                ));
              
                method.instructions.insertBefore(insn, garbage);
            }
        }
    }
}

Как это выглядит в коде:
До:
Java:
Expand Collapse Copy
int x = 5;
После (фейк-код):
Java:
Expand Collapse Copy
if (1 != 0) { // всегда true
    int x = 5;
}

5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
Expand Collapse Copy
public static void main(String[] args) throws Exception {
    // ... (чтение класса)
  
    TransformerService service = new TransformerService();
    service.addTransformer(new StringEncryptor());
    service.addTransformer(new ControlFlowObfuscator());
  
    service.applyTransformations(classNode);
  
    // ... (запись класса)
}

6. Запускаем обфускатор
Компилируем наш обфускатор

Делаем это через запуск из интелиджи

Обфусцируем тестовый класс
Bash:
Expand Collapse Copy
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class

Запускаем результат
Bash:
Expand Collapse Copy
java -noverify TestObf

Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)

Полный код обфускатора:

порно:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;
import java.util.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        TransformerService service = new TransformerService();
        service.addTransformer(new StringEncryptor());
        service.addTransformer(new ControlFlowObfuscator());
      
        service.applyTransformations(classNode);
      
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
  
    // метод для дешифровки (обычный base64)
    public static String decrypt(String input) {
        return new String(Base64.getDecoder().decode(input));
    }
  
    static class TransformerService {
        private List<Transformer> transformers = new ArrayList<>();
      
        void addTransformer(Transformer t) {
            transformers.add(t);
        }
      
        void applyTransformations(ClassNode classNode) {
            transformers.forEach(t -> t.transformClass(classNode));
            classNode.methods.forEach(method ->
                transformers.forEach(t -> t.transformMethod(method))
            );
        }
    }
  
    interface Transformer {
        default void transformClass(ClassNode cn) {}
        default void transformMethod(MethodNode mn) {}
    }
  
    static class StringEncryptor implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                    String original = (String) ldcNode.cst;
                    String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
                  
                    InsnList newInstructions = new InsnList();
                    newInstructions.add(new LdcInsnNode(encrypted));
                    newInstructions.add(new MethodInsnNode(
                        Opcodes.INVOKESTATIC,
                        "JavaObfuscator",
                        "decrypt",
                        "(Ljava/lang/String;)Ljava/lang/String;"
                    ));
                  
                    method.instructions.insertBefore(insn, newInstructions);
                    method.instructions.remove(insn);
                }
            }
        }
    }
  
    static class ControlFlowObfuscator implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn.getOpcode() == Opcodes.ILOAD) {
                    InsnList garbage = new InsnList();
                    garbage.add(new InsnNode(Opcodes.ICONST_1));
                    garbage.add(new JumpInsnNode(
                        Opcodes.IFNE,
                        new LabelNode()
                    ));
                    method.instructions.insertBefore(insn, garbage);
                }
            }
        }
    }
}

Всем пока. ??
r3z: запостил ?
я: спустил ?
венус фри: хайп ?
 
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

1. настроим проект
Добавим зависимость ASM

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
Expand Collapse Copy
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>

p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        // чтение байткода классов/класса
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        // трансформация
        // (здесь позже добавим трансформеры)
      
        // записывание модифицированного класса
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
}

2. Добавляем систему трансформаций
Создаем интерфейс и сервис

Добавляем внутрь класса JavaObfuscator:
Java:
Expand Collapse Copy
// сервис для управления трансформерами
static class TransformerService {
    private List<Transformer> transformers = new ArrayList<>();
  
    void addTransformer(Transformer t) {
        transformers.add(t);
    }
  
    void applyTransformations(ClassNode classNode) {
        // применение трансформации к всему классу
        transformers.forEach(t -> t.transformClass(classNode));
      
        // применение трансформации к каждому методу
        classNode.methods.forEach(method ->
            transformers.forEach(t -> t.transformMethod(method))
        );
    }
}

// небольшой интерфейс для трансформеров
interface Transformer {
    default void transformClass(ClassNode cn) {}
    default void transformMethod(MethodNode mn) {}
}

3. Пишем шифрование строк
Делаем трансформер для строк

Добавляем класс-трансформер:
Java:
Expand Collapse Copy
static class StringEncryptor implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                // заменим строку на вызов decrypt("super_puper_obf")
                String original = (String) ldcNode.cst;
                String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
              
                InsnList newInstructions = new InsnList();
                newInstructions.add(new LdcInsnNode(encrypted));
                newInstructions.add(new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "JavaObfuscator",
                    "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;"
                ));
              
                method.instructions.insertBefore(insn, newInstructions);
                method.instructions.remove(insn);
            }
        }
    }
}

// метод для дешифровки (обычный base64)
public static String decrypt(String input) {
    return new String(Base64.getDecoder().decode(input));
}

Пример работы
До:
Java:
Expand Collapse Copy
System.out.println("Hello World");
После:
Java:
Expand Collapse Copy
System.out.println(decrypt("SGVsbG8gV29ybGQ="));

4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
Expand Collapse Copy
static class ControlFlowObfuscator implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn.getOpcode() == Opcodes.ILOAD) { // загрузка int
                // бессмысленная проверка
                InsnList garbage = new InsnList();
                garbage.add(new InsnNode(Opcodes.ICONST_1));
                garbage.add(new JumpInsnNode(
                    Opcodes.IFNE,
                    new LabelNode() // всегда выполняется
                ));
              
                method.instructions.insertBefore(insn, garbage);
            }
        }
    }
}

Как это выглядит в коде:
До:
Java:
Expand Collapse Copy
int x = 5;
После (фейк-код):
Java:
Expand Collapse Copy
if (1 != 0) { // всегда true
    int x = 5;
}

5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
Expand Collapse Copy
public static void main(String[] args) throws Exception {
    // ... (чтение класса)
  
    TransformerService service = new TransformerService();
    service.addTransformer(new StringEncryptor());
    service.addTransformer(new ControlFlowObfuscator());
  
    service.applyTransformations(classNode);
  
    // ... (запись класса)
}

6. Запускаем обфускатор
Компилируем наш обфускатор

Делаем это через запуск из интелиджи

Обфусцируем тестовый класс
Bash:
Expand Collapse Copy
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class

Запускаем результат
Bash:
Expand Collapse Copy
java -noverify TestObf

Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)

Полный код обфускатора:

порно:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;
import java.util.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
      
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
      
        TransformerService service = new TransformerService();
        service.addTransformer(new StringEncryptor());
        service.addTransformer(new ControlFlowObfuscator());
      
        service.applyTransformations(classNode);
      
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
  
    // метод для дешифровки (обычный base64)
    public static String decrypt(String input) {
        return new String(Base64.getDecoder().decode(input));
    }
  
    static class TransformerService {
        private List<Transformer> transformers = new ArrayList<>();
      
        void addTransformer(Transformer t) {
            transformers.add(t);
        }
      
        void applyTransformations(ClassNode classNode) {
            transformers.forEach(t -> t.transformClass(classNode));
            classNode.methods.forEach(method ->
                transformers.forEach(t -> t.transformMethod(method))
            );
        }
    }
  
    interface Transformer {
        default void transformClass(ClassNode cn) {}
        default void transformMethod(MethodNode mn) {}
    }
  
    static class StringEncryptor implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                    String original = (String) ldcNode.cst;
                    String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
                  
                    InsnList newInstructions = new InsnList();
                    newInstructions.add(new LdcInsnNode(encrypted));
                    newInstructions.add(new MethodInsnNode(
                        Opcodes.INVOKESTATIC,
                        "JavaObfuscator",
                        "decrypt",
                        "(Ljava/lang/String;)Ljava/lang/String;"
                    ));
                  
                    method.instructions.insertBefore(insn, newInstructions);
                    method.instructions.remove(insn);
                }
            }
        }
    }
  
    static class ControlFlowObfuscator implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn.getOpcode() == Opcodes.ILOAD) {
                    InsnList garbage = new InsnList();
                    garbage.add(new InsnNode(Opcodes.ICONST_1));
                    garbage.add(new JumpInsnNode(
                        Opcodes.IFNE,
                        new LabelNode()
                    ));
                    method.instructions.insertBefore(insn, garbage);
                }
            }
        }
    }
}

Всем пока. ??
Максимальное ублюдский обфскатор, даже мой кодлогик мутатор будешь дольше сниматся чем эта хуйня
 
Максимальное ублюдский обфскатор, даже мой кодлогик мутатор будешь дольше сниматся чем эта хуйня
1737986748663.png
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

1. настроим проект
Добавим зависимость ASM

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
Expand Collapse Copy
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>

p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
     
        // чтение байткода классов/класса
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
     
        // трансформация
        // (здесь позже добавим трансформеры)
     
        // записывание модифицированного класса
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
}

2. Добавляем систему трансформаций
Создаем интерфейс и сервис

Добавляем внутрь класса JavaObfuscator:
Java:
Expand Collapse Copy
// сервис для управления трансформерами
static class TransformerService {
    private List<Transformer> transformers = new ArrayList<>();
 
    void addTransformer(Transformer t) {
        transformers.add(t);
    }
 
    void applyTransformations(ClassNode classNode) {
        // применение трансформации к всему классу
        transformers.forEach(t -> t.transformClass(classNode));
     
        // применение трансформации к каждому методу
        classNode.methods.forEach(method ->
            transformers.forEach(t -> t.transformMethod(method))
        );
    }
}

// небольшой интерфейс для трансформеров
interface Transformer {
    default void transformClass(ClassNode cn) {}
    default void transformMethod(MethodNode mn) {}
}

3. Пишем шифрование строк
Делаем трансформер для строк

Добавляем класс-трансформер:
Java:
Expand Collapse Copy
static class StringEncryptor implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                // заменим строку на вызов decrypt("super_puper_obf")
                String original = (String) ldcNode.cst;
                String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
             
                InsnList newInstructions = new InsnList();
                newInstructions.add(new LdcInsnNode(encrypted));
                newInstructions.add(new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "JavaObfuscator",
                    "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;"
                ));
             
                method.instructions.insertBefore(insn, newInstructions);
                method.instructions.remove(insn);
            }
        }
    }
}

// метод для дешифровки (обычный base64)
public static String decrypt(String input) {
    return new String(Base64.getDecoder().decode(input));
}

Пример работы
До:
Java:
Expand Collapse Copy
System.out.println("Hello World");
После:
Java:
Expand Collapse Copy
System.out.println(decrypt("SGVsbG8gV29ybGQ="));

4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
Expand Collapse Copy
static class ControlFlowObfuscator implements Transformer {
    [USER=1367676]@override[/USER]
    public void transformMethod(MethodNode method) {
        for (AbstractInsnNode insn : method.instructions.toArray()) {
            if (insn.getOpcode() == Opcodes.ILOAD) { // загрузка int
                // бессмысленная проверка
                InsnList garbage = new InsnList();
                garbage.add(new InsnNode(Opcodes.ICONST_1));
                garbage.add(new JumpInsnNode(
                    Opcodes.IFNE,
                    new LabelNode() // всегда выполняется
                ));
             
                method.instructions.insertBefore(insn, garbage);
            }
        }
    }
}

Как это выглядит в коде:
До:
Java:
Expand Collapse Copy
int x = 5;
После (фейк-код):
Java:
Expand Collapse Copy
if (1 != 0) { // всегда true
    int x = 5;
}

5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
Expand Collapse Copy
public static void main(String[] args) throws Exception {
    // ... (чтение класса)
 
    TransformerService service = new TransformerService();
    service.addTransformer(new StringEncryptor());
    service.addTransformer(new ControlFlowObfuscator());
 
    service.applyTransformations(classNode);
 
    // ... (запись класса)
}

6. Запускаем обфускатор
Компилируем наш обфускатор

Делаем это через запуск из интелиджи

Обфусцируем тестовый класс
Bash:
Expand Collapse Copy
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class

Запускаем результат
Bash:
Expand Collapse Copy
java -noverify TestObf

Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)

Полный код обфускатора:

порно:
Expand Collapse Copy
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import java.nio.file.*;
import java.util.*;

public class JavaObfuscator {
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Ты че тупой? Вот так юзать надо: JavaObfuscator <входной.class> <выходной.class>");
            return;
        }
     
        byte[] classBytes = Files.readAllBytes(Paths.get(args[0]));
        ClassReader reader = new ClassReader(classBytes);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode, 0);
     
        TransformerService service = new TransformerService();
        service.addTransformer(new StringEncryptor());
        service.addTransformer(new ControlFlowObfuscator());
     
        service.applyTransformations(classNode);
     
        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        classNode.accept(writer);
        Files.write(Paths.get(args[1]), writer.toByteArray());
    }
 
    // метод для дешифровки (обычный base64)
    public static String decrypt(String input) {
        return new String(Base64.getDecoder().decode(input));
    }
 
    static class TransformerService {
        private List<Transformer> transformers = new ArrayList<>();
     
        void addTransformer(Transformer t) {
            transformers.add(t);
        }
     
        void applyTransformations(ClassNode classNode) {
            transformers.forEach(t -> t.transformClass(classNode));
            classNode.methods.forEach(method ->
                transformers.forEach(t -> t.transformMethod(method))
            );
        }
    }
 
    interface Transformer {
        default void transformClass(ClassNode cn) {}
        default void transformMethod(MethodNode mn) {}
    }
 
    static class StringEncryptor implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn instanceof LdcInsnNode ldcNode && ldcNode.cst instanceof String) {
                    String original = (String) ldcNode.cst;
                    String encrypted = Base64.getEncoder().encodeToString(original.getBytes());
                 
                    InsnList newInstructions = new InsnList();
                    newInstructions.add(new LdcInsnNode(encrypted));
                    newInstructions.add(new MethodInsnNode(
                        Opcodes.INVOKESTATIC,
                        "JavaObfuscator",
                        "decrypt",
                        "(Ljava/lang/String;)Ljava/lang/String;"
                    ));
                 
                    method.instructions.insertBefore(insn, newInstructions);
                    method.instructions.remove(insn);
                }
            }
        }
    }
 
    static class ControlFlowObfuscator implements Transformer {
        [USER=1367676]@override[/USER]
        public void transformMethod(MethodNode method) {
            for (AbstractInsnNode insn : method.instructions.toArray()) {
                if (insn.getOpcode() == Opcodes.ILOAD) {
                    InsnList garbage = new InsnList();
                    garbage.add(new InsnNode(Opcodes.ICONST_1));
                    garbage.add(new JumpInsnNode(
                        Opcodes.IFNE,
                        new LabelNode()
                    ));
                    method.instructions.insertBefore(insn, garbage);
                }
            }
        }
    }
}

Всем пока. ??
Ждем в VenysFreeWareSuperPuperUltra.
 
Я вообще влад
 
киньте просто срц
 
как нахуярить трансформер методов адекватный, юзая method_insn у меня все ломает некоторые части кода обфятся некоторые нет
 
Назад
Сверху Снизу