• Ну и что вы думаете? Мы взяли и создали свой собственный чат, с блекджеком и шлюхами, теперь все легенды в одном месте: даже те 1000 человек, которых мы забанили в старом чате 🫡 Будем публиковать там очень интересные подробности нового дизайна форума, oh yeah

    Вступай и становись легендой, пока это не стало поздно: жмякай на меня, ток не сильно(

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

aka wqzxqz
Начинающий
Статус
Оффлайн
Регистрация
24 Ноя 2024
Сообщения
561
Реакции[?]
6
Поинты[?]
5K

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

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

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

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
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:
// сервис для управления трансформерами
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:
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:
System.out.println("Hello World");
После:
Java:
System.out.println(decrypt("SGVsbG8gV29ybGQ="));
4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
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:
int x = 5;
После (фейк-код):
Java:
if (1 != 0) { // всегда true
    int x = 5;
}
5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
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:
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class
Запускаем результат
Bash:
java -noverify TestObf
Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

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

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

порно:
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);
                }
            }
        }
    }
}
Всем пока. 🤣😇
 
Danq Client
Начинающий
Статус
Оффлайн
Регистрация
23 Апр 2024
Сообщения
618
Реакции[?]
2
Поинты[?]
2K
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

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

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
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:
// сервис для управления трансформерами
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:
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:
System.out.println("Hello World");
После:
Java:
System.out.println(decrypt("SGVsbG8gV29ybGQ="));
4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
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:
int x = 5;
После (фейк-код):
Java:
if (1 != 0) { // всегда true
    int x = 5;
}
5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
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:
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class
Запускаем результат
Bash:
java -noverify TestObf
Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

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

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

порно:
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);
                }
            }
        }
    }
}
Всем пока. 🤣😇
бл, чувак, это годно нах!!! 🤟😂
 
Danq Client
Начинающий
Статус
Оффлайн
Регистрация
23 Апр 2024
Сообщения
618
Реакции[?]
2
Поинты[?]
2K
а эсли риално? 🥲🥲🥲
бл годнота ваще братела, я жопастый 🫠
а эсли риално? 🥲🥲🥲
я запастэл*
а эсли риално? 🥲🥲🥲
я запастэл*
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

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

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
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:
// сервис для управления трансформерами
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:
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:
System.out.println("Hello World");
После:
Java:
System.out.println(decrypt("SGVsbG8gV29ybGQ="));
4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
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:
int x = 5;
После (фейк-код):
Java:
if (1 != 0) { // всегда true
    int x = 5;
}
5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
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:
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class
Запускаем результат
Bash:
java -noverify TestObf
Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

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

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

порно:
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: запостил 🥰
я: спустил 🧠
венус фри: хайп 💀
 
Начинающий
Статус
Оффлайн
Регистрация
4 Дек 2021
Сообщения
196
Реакции[?]
7
Поинты[?]
4K
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

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

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
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:
// сервис для управления трансформерами
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:
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:
System.out.println("Hello World");
После:
Java:
System.out.println(decrypt("SGVsbG8gV29ybGQ="));
4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
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:
int x = 5;
После (фейк-код):
Java:
if (1 != 0) { // всегда true
    int x = 5;
}
5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
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:
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class
Запускаем результат
Bash:
java -noverify TestObf
Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

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

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

порно:
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);
                }
            }
        }
    }
}
Всем пока. 🤣😇
Максимальное ублюдский обфскатор, даже мой кодлогик мутатор будешь дольше сниматся чем эта хуйня
 
Забаненный
Статус
Оффлайн
Регистрация
8 Авг 2024
Сообщения
905
Реакции[?]
6
Поинты[?]
5K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)

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

В файл pom.xml (для Maven) или build.gradle (для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.4</version>
</dependency>
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже

Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
Java:
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:
// сервис для управления трансформерами
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:
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:
System.out.println("Hello World");
После:
Java:
System.out.println(decrypt("SGVsbG8gV29ybGQ="));
4. Усложняем поток управления
Добавляем мусорные условия

Создаем новый трансформер:
Java:
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:
int x = 5;
После (фейк-код):
Java:
if (1 != 0) { // всегда true
    int x = 5;
}
5. Собираем все вместе
Модифицируем main-метод

Обновляем код в main():
Java:
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:
java -cp ".;asm-9.4.jar" JavaObfuscator Test.class TestObf.class
Запускаем результат
Bash:
java -noverify TestObf
Итог моего гайда: У нас есть обфкскатор который:
  • Шифрует строки через бейз64
  • Добавляет мусорные условия (фейк код)
  • Модифицирует байткод напрямую

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

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

порно:
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.
 
Начинающий
Статус
Оффлайн
Регистрация
16 Июн 2024
Сообщения
319
Реакции[?]
14
Поинты[?]
13K
Начинающий
Статус
Оффлайн
Регистрация
16 Июл 2024
Сообщения
21
Реакции[?]
0
Поинты[?]
0
как нахуярить трансформер методов адекватный, юзая method_insn у меня все ломает некоторые части кода обфятся некоторые нет
 
Начинающий
Статус
Оффлайн
Регистрация
29 Дек 2024
Сообщения
74
Реакции[?]
1
Поинты[?]
1K
Сверху Снизу