Гайд Пишем "свой" обфускатор для майнкрафт | any base #2

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
17 Ноя 2023
Сообщения
291
Реакции
3

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

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

Спасибо!

Так-как многие просили а точнее никто делаю 2 часть
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
Код:
Expand Collapse Copy
public class Main {
    public static int result(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(3, 5);
        System.out.println(result);
    }
}
После:

Код:
Expand Collapse Copy
public class Main{
    public static int a1(int x, int y) {
        if (x > y) {
            return x + y;
        } else {
            return y + x;
        }
    }

    public static int a2() {
        return 5;
    }

    public static int a3() {
        return 3;
    }

    public static int sumOfTwoNumbers(int a, int b) {
        int temp = a1(a, b);
        temp = a2() + temp;
        return temp;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(a3(), a2());
        System.out.println(result);
    }
}

Вот как выглядитего код обфускации ( примерный ):
Код:
Expand Collapse Copy
@Override
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (!method.name.startsWith("<")) {
                for (AbstractInsnNode insnNode : method.instructions.toArray()) {
                    
                    if (shouldObfuscate(insnNode)) {
                        int insertCount = 1 + RANDOM.nextInt(5);
                        for (int i = 0; i < insertCount; i++) {
                            insertRandomOperations(method, insnNode);
                        }
                    }
                    
                    if (insnNode.getOpcode() == Opcodes.DUP) {
                        obfuscateDupMethod(method);
                    }
                }
            }
        }
private void obfuscateDupMethod(MethodNode method) {
        method.instructions.insert(new InsnNode(Opcodes.POP2));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new InsnNode(Opcodes.POP));

        if (RANDOM.nextBoolean()) {
            for (int i = 0; i < 2 + RANDOM.nextInt(5); i++) {
                method.instructions.insert(new InsnNode(Opcodes.SWAP));
            }
        }

        if (RANDOM.nextBoolean()) {
            method.instructions.insert(new InsnNode(Opcodes.POP));
        } else {
            method.instructions.insert(new InsnNode(Opcodes.DUP));
            method.instructions.insert(new InsnNode(Opcodes.POP2));
        }

        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
    }
}

2.NumbersModifier - меняет числа все и добавляет лишнее вот пример обфусцированый ( это моя версия переписаная в обычном колониал он другой)

Код:
Expand Collapse Copy
public class Main {
    public static void main(String[] args) {
        long key = -164701876253981L;
        int varIndex = 1; 


        long value1 = -2078941969276575294L;
        long value2 = key ^ value1;
        int value1X = (int) value2;

        int a = 5;
        int b = 10;
        int c = a + b;

        int xorValue1 = 2026340751;
        int xorValue2 = 485239483;   
        c = c ^ xorValue1;
        c = c ^ xorValue2;

        System.out.println("Result: " + c);
    }
}

3. LocalVariables - меняет название локальных переменных и тд йоу пример обфусцированого кода не нужен
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час

LocalVariables:
Expand Collapse Copy
package colonialobfuscator.transforms;

import static colonialobfuscator.guis.SettingsPanel.namesLenghtField;

import colonialobfuscator.utils.OutputUtil;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.ParameterNode;

import colonialobfuscator.utils.NameGen;

import java.util.Random;

public class LocalVariables implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (method.localVariables != null && method.localVariables.size() > 0) {
                for (LocalVariableNode var : method.localVariables) {
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    var.name = newName;

                    if (RANDOM.nextBoolean()) {
                        String alias = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                        var.name += "_" + alias;
                    }

                    if (RANDOM.nextBoolean()) {
                        swapLocalVariables(method);
                    }
                }
            }

            if (method.parameters != null && method.parameters.size() > 0) {
                for (ParameterNode param : method.parameters) {
                    // Генерация нового имени для параметра
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    param.name = newName;

                    if (RANDOM.nextBoolean()) {
                        insertHiddenParameter(method);
                    }
                }
            }
        }
    }

    private void swapLocalVariables(MethodNode method) {
        if (method.localVariables.size() > 1) {
            int index1 = RANDOM.nextInt(method.localVariables.size());
            int index2 = RANDOM.nextInt(method.localVariables.size());

            LocalVariableNode var1 = method.localVariables.get(index1);
            LocalVariableNode var2 = method.localVariables.get(index2);

            String tempName = var1.name;
            var1.name = var2.name;
            var2.name = tempName;
        }
    }

    private void insertHiddenParameter(MethodNode method) {
        String hiddenName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
        String none = "";
        ParameterNode hiddenParam = new ParameterNode(none,1);
        hiddenParam.name = hiddenName;
        
        method.parameters.add(0, hiddenParam);
    }
}


ObfNumber:
Expand Collapse Copy
package colonialobfuscator.transforms;

import java.util.Random;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.VarInsnNode;

public class ModifierNumbers implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode classNode) {
        classNode.methods.stream().forEach(mn -> {
            long key = new Random().nextLong();
            int varIndex = mn.maxLocals;
            mn.maxLocals++;

            InsnList keyStore = new InsnList();
            keyStore.add(new LdcInsnNode(key));
            keyStore.add(new VarInsnNode(LSTORE, varIndex));
            mn.instructions.insertBefore(mn.instructions.getFirst(), keyStore);

            for (AbstractInsnNode insn : mn.instructions.toArray()) {
                if (isIntInsn(insn)) {
                    try {
                        int originalNum = getIntegerFromInsn(insn);
                        int value1 = RANDOM.nextInt();
                        int value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                        mn.instructions.insertBefore(insn, new LdcInsnNode(0));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isLongInsn(insn)) {
                    try {
                        long originalNum = getLongFromInsn(insn);
                        long value1 = new Random().nextLong();
                        long value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(LXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP2));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isFloatInsn(insn)) {
                    try {
                        float originalNum = getFloatFromInsn(insn);
                        int value1 = Float.floatToIntBits(originalNum);
                        int value2 = new Random().nextInt();

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(I2F));
                        insnList.add(new LdcInsnNode(0.0f));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public static boolean isIntInsn(AbstractInsnNode insn) {
        if (insn == null) {
            return false;
        }
        int opcode = insn.getOpcode();
        return ((opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5)
                || opcode == Opcodes.BIPUSH
                || opcode == Opcodes.SIPUSH
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer));
    }

    public static boolean isLongInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode == Opcodes.LCONST_0
                || opcode == Opcodes.LCONST_1
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long));
    }

    public static boolean isFloatInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2)
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float);
    }

    public static int getIntegerFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5) {
            return opcode - 3;
        } else if (insn instanceof IntInsnNode && insn.getOpcode() != Opcodes.NEWARRAY) {
            return ((IntInsnNode) insn).operand;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer) {
            return (Integer) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static long getLongFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.LCONST_0 && opcode <= Opcodes.LCONST_1) {
            return opcode - 9;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long) {
            return (Long) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static float getFloatFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2) {
            return opcode - 11;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float) {
            return (Float) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }
}

Ну все йоу топавая обф майнкрафт 228 йоу написана класс ремап в 3 туториале будет йоууу
 
Говнокод - способ защитить код без использования обфускаторов и протекторов
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а потом приходит паймон и такой "Paimon - Хочешь покажу фокус? - На тебе декрипт твоего клиента"
 
Капец ты угарную тему сделал. Во-первых, обычный намбер трансформер xdxd. Ты ваще не понимаешь видимо, что на любые операции с числами уже есть трансформер, то-есть на х**** по типу 48 ^ 81 уже есть трансформер, и на все аналогичные операции по типу умножения, деления, смещения, IOR, AND тоже есть. Если ты не вычисляешь 1 из чисел для операции в статик блоке, то человек просто скачает сурсы Narumii(noad) и при помощи 1 трансформера снимет твой жалкий обфускатор написанный на коленке при помощи GPT. Во-вторых тут расписывать ничего и не надо, у тебя просто аватарка кринжовая, лучше бы ваще ничё не постил xd
 
Капец ты угарную тему сделал. Во-первых, обычный намбер трансформер xdxd. Ты ваще не понимаешь видимо, что на любые операции с числами уже есть трансформер, то-есть на х**** по типу 48 ^ 81 уже есть трансформер, и на все аналогичные операции по типу умножения, деления, смещения, IOR, AND тоже есть. Если ты не вычисляешь 1 из чисел для операции в статик блоке, то человек просто скачает сурсы Narumii(noad) и при помощи 1 трансформера снимет твой жалкий обфускатор написанный на коленке при помощи GPT. Во-вторых тут расписывать ничего и не надо, у тебя просто аватарка кринжовая, лучше бы ваще ничё не постил xd
xD снимешь обфку с моей jar-ки?)
 
Капец ты угарную тему сделал. Во-первых, обычный намбер трансформер xdxd. Ты ваще не понимаешь видимо, что на любые операции с числами уже есть трансформер, то-есть на х**** по типу 48 ^ 81 уже есть трансформер, и на все аналогичные операции по типу умножения, деления, смещения, IOR, AND тоже есть. Если ты не вычисляешь 1 из чисел для операции в статик блоке, то человек просто скачает сурсы Narumii(noad) и при помощи 1 трансформера снимет твой жалкий обфускатор написанный на коленке при помощи GPT. Во-вторых тут расписывать ничего и не надо, у тебя просто аватарка кринжовая, лучше бы ваще ничё не постил xd
АХАХАХХАХАХАХАХАХ скачал я значит твой мега деобфускатор ну вот что осталось
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad ни риклама честна)
накидать говноинструкций и циферки то это не защита
я для югейма такое написал, я в своем обфускаторе норм код писал и обфускацию йоу
Капец ты угарную тему сделал. Во-первых, обычный намбер трансформер xdxd. Ты ваще не понимаешь видимо, что на любые операции с числами уже есть трансформер, то-есть на х**** по типу 48 ^ 81 уже есть трансформер, и на все аналогичные операции по типу умножения, деления, смещения, IOR, AND тоже есть. Если ты не вычисляешь 1 из чисел для операции в статик блоке, то человек просто скачает сурсы Narumii(noad) и при помощи 1 трансформера снимет твой жалкий обфускатор написанный на коленке при помощи GPT. Во-вторых тут расписывать ничего и не надо, у тебя просто аватарка кринжовая, лучше бы ваще ничё не постил xd
Крч я посморел порядка 20 классов, он даже числа не вернул АХХАХАХАХАХАХ а про иероглифы китайские и эмодзи я уж вообще молчу xdxdxdxdxdxdxdxdxdxdxd лучше бы не писал данное сообщение xdxdxddxdxdx
 
Последнее редактирование:
Капец ты угарную тему сделал. Во-первых, обычный намбер трансформер xdxd. Ты ваще не понимаешь видимо, что на любые операции с числами уже есть трансформер, то-есть на х**** по типу 48 ^ 81 уже есть трансформер, и на все аналогичные операции по типу умножения, деления, смещения, IOR, AND тоже есть. Если ты не вычисляешь 1 из чисел для операции в статик блоке, то человек просто скачает сурсы Narumii(noad) и при помощи 1 трансформера снимет твой жалкий обфускатор написанный на коленке при помощи GPT. Во-вторых тут расписывать ничего и не надо, у тебя просто аватарка кринжовая, лучше бы ваще ничё не постил xd
кстати спсибо за идею как улучшить основной обф)
 
АХАХАХХАХАХАХАХАХ скачал я значит твой мега деобфускатор ну вот что осталось
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad ни риклама честна)

я для югейма такое написал, я в своем обфускаторе норм код писал и обфускацию йоу

Крч я посморел порядка 20 классов, он даже числа не вернул АХХАХАХАХАХАХ а про иероглифы китайские и эмодзи я уж вообще молчу xdxdxdxdxdxdxdxdxdxdxd лучше бы не писал данное сообщение xdxdxddxdxdx
кого ты из себя строишь?
p.s. не понимаешь, что делаешь - не открывай рот.
 
кого ты из себя строишь?
p.s. не понимаешь, что делаешь - не открывай рот.
блять "кого я из себя строю"? давай обьясни мне 1 вопрос хуйня от тебя далее " p.s. не понимаешь, что делаешь - не открывай рот. " ? что я не понимаю? это тутор блять для тех кто вообще 0 в этом и что бы была хоть какая-та обфка блять а не колониал который ломает все базы йоу может некоторые не ломает и чистую mcp,а ты сейчас такую хуйню выписал
 
Так-как многие просили а точнее никто делаю 2 часть
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
Код:
Expand Collapse Copy
public class Main {
    public static int result(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(3, 5);
        System.out.println(result);
    }
}
После:

Код:
Expand Collapse Copy
public class Main{
    public static int a1(int x, int y) {
        if (x > y) {
            return x + y;
        } else {
            return y + x;
        }
    }

    public static int a2() {
        return 5;
    }

    public static int a3() {
        return 3;
    }

    public static int sumOfTwoNumbers(int a, int b) {
        int temp = a1(a, b);
        temp = a2() + temp;
        return temp;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(a3(), a2());
        System.out.println(result);
    }
}

Вот как выглядитего код обфускации ( примерный ):
Код:
Expand Collapse Copy
@Override
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (!method.name.startsWith("<")) {
                for (AbstractInsnNode insnNode : method.instructions.toArray()) {
                    
                    if (shouldObfuscate(insnNode)) {
                        int insertCount = 1 + RANDOM.nextInt(5);
                        for (int i = 0; i < insertCount; i++) {
                            insertRandomOperations(method, insnNode);
                        }
                    }
                    
                    if (insnNode.getOpcode() == Opcodes.DUP) {
                        obfuscateDupMethod(method);
                    }
                }
            }
        }
private void obfuscateDupMethod(MethodNode method) {
        method.instructions.insert(new InsnNode(Opcodes.POP2));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new InsnNode(Opcodes.POP));

        if (RANDOM.nextBoolean()) {
            for (int i = 0; i < 2 + RANDOM.nextInt(5); i++) {
                method.instructions.insert(new InsnNode(Opcodes.SWAP));
            }
        }

        if (RANDOM.nextBoolean()) {
            method.instructions.insert(new InsnNode(Opcodes.POP));
        } else {
            method.instructions.insert(new InsnNode(Opcodes.DUP));
            method.instructions.insert(new InsnNode(Opcodes.POP2));
        }

        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
    }
}

2.NumbersModifier - меняет числа все и добавляет лишнее вот пример обфусцированый ( это моя версия переписаная в обычном колониал он другой)

Код:
Expand Collapse Copy
public class Main {
    public static void main(String[] args) {
        long key = -164701876253981L;
        int varIndex = 1; 


        long value1 = -2078941969276575294L;
        long value2 = key ^ value1;
        int value1X = (int) value2;

        int a = 5;
        int b = 10;
        int c = a + b;

        int xorValue1 = 2026340751;
        int xorValue2 = 485239483;   
        c = c ^ xorValue1;
        c = c ^ xorValue2;

        System.out.println("Result: " + c);
    }
}

3. LocalVariables - меняет название локальных переменных и тд йоу пример обфусцированого кода не нужен
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час

LocalVariables:
Expand Collapse Copy
package colonialobfuscator.transforms;

import static colonialobfuscator.guis.SettingsPanel.namesLenghtField;

import colonialobfuscator.utils.OutputUtil;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.ParameterNode;

import colonialobfuscator.utils.NameGen;

import java.util.Random;

public class LocalVariables implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (method.localVariables != null && method.localVariables.size() > 0) {
                for (LocalVariableNode var : method.localVariables) {
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    var.name = newName;

                    if (RANDOM.nextBoolean()) {
                        String alias = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                        var.name += "_" + alias;
                    }

                    if (RANDOM.nextBoolean()) {
                        swapLocalVariables(method);
                    }
                }
            }

            if (method.parameters != null && method.parameters.size() > 0) {
                for (ParameterNode param : method.parameters) {
                    // Генерация нового имени для параметра
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    param.name = newName;

                    if (RANDOM.nextBoolean()) {
                        insertHiddenParameter(method);
                    }
                }
            }
        }
    }

    private void swapLocalVariables(MethodNode method) {
        if (method.localVariables.size() > 1) {
            int index1 = RANDOM.nextInt(method.localVariables.size());
            int index2 = RANDOM.nextInt(method.localVariables.size());

            LocalVariableNode var1 = method.localVariables.get(index1);
            LocalVariableNode var2 = method.localVariables.get(index2);

            String tempName = var1.name;
            var1.name = var2.name;
            var2.name = tempName;
        }
    }

    private void insertHiddenParameter(MethodNode method) {
        String hiddenName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
        String none = "";
        ParameterNode hiddenParam = new ParameterNode(none,1);
        hiddenParam.name = hiddenName;
        
        method.parameters.add(0, hiddenParam);
    }
}


ObfNumber:
Expand Collapse Copy
package colonialobfuscator.transforms;

import java.util.Random;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.VarInsnNode;

public class ModifierNumbers implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode classNode) {
        classNode.methods.stream().forEach(mn -> {
            long key = new Random().nextLong();
            int varIndex = mn.maxLocals;
            mn.maxLocals++;

            InsnList keyStore = new InsnList();
            keyStore.add(new LdcInsnNode(key));
            keyStore.add(new VarInsnNode(LSTORE, varIndex));
            mn.instructions.insertBefore(mn.instructions.getFirst(), keyStore);

            for (AbstractInsnNode insn : mn.instructions.toArray()) {
                if (isIntInsn(insn)) {
                    try {
                        int originalNum = getIntegerFromInsn(insn);
                        int value1 = RANDOM.nextInt();
                        int value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                        mn.instructions.insertBefore(insn, new LdcInsnNode(0));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isLongInsn(insn)) {
                    try {
                        long originalNum = getLongFromInsn(insn);
                        long value1 = new Random().nextLong();
                        long value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(LXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP2));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isFloatInsn(insn)) {
                    try {
                        float originalNum = getFloatFromInsn(insn);
                        int value1 = Float.floatToIntBits(originalNum);
                        int value2 = new Random().nextInt();

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(I2F));
                        insnList.add(new LdcInsnNode(0.0f));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public static boolean isIntInsn(AbstractInsnNode insn) {
        if (insn == null) {
            return false;
        }
        int opcode = insn.getOpcode();
        return ((opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5)
                || opcode == Opcodes.BIPUSH
                || opcode == Opcodes.SIPUSH
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer));
    }

    public static boolean isLongInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode == Opcodes.LCONST_0
                || opcode == Opcodes.LCONST_1
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long));
    }

    public static boolean isFloatInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2)
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float);
    }

    public static int getIntegerFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5) {
            return opcode - 3;
        } else if (insn instanceof IntInsnNode && insn.getOpcode() != Opcodes.NEWARRAY) {
            return ((IntInsnNode) insn).operand;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer) {
            return (Integer) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static long getLongFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.LCONST_0 && opcode <= Opcodes.LCONST_1) {
            return opcode - 9;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long) {
            return (Long) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static float getFloatFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2) {
            return opcode - 11;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float) {
            return (Float) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }
}

Ну все йоу топавая обф майнкрафт 228 йоу написана класс ремап в 3 туториале будет йоууу
Зачем писать ремап если есть прогуард
 
Так-как многие просили а точнее никто делаю 2 часть
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
Код:
Expand Collapse Copy
public class Main {
    public static int result(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(3, 5);
        System.out.println(result);
    }
}
После:

Код:
Expand Collapse Copy
public class Main{
    public static int a1(int x, int y) {
        if (x > y) {
            return x + y;
        } else {
            return y + x;
        }
    }

    public static int a2() {
        return 5;
    }

    public static int a3() {
        return 3;
    }

    public static int sumOfTwoNumbers(int a, int b) {
        int temp = a1(a, b);
        temp = a2() + temp;
        return temp;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(a3(), a2());
        System.out.println(result);
    }
}

Вот как выглядитего код обфускации ( примерный ):
Код:
Expand Collapse Copy
@Override
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (!method.name.startsWith("<")) {
                for (AbstractInsnNode insnNode : method.instructions.toArray()) {
                    
                    if (shouldObfuscate(insnNode)) {
                        int insertCount = 1 + RANDOM.nextInt(5);
                        for (int i = 0; i < insertCount; i++) {
                            insertRandomOperations(method, insnNode);
                        }
                    }
                    
                    if (insnNode.getOpcode() == Opcodes.DUP) {
                        obfuscateDupMethod(method);
                    }
                }
            }
        }
private void obfuscateDupMethod(MethodNode method) {
        method.instructions.insert(new InsnNode(Opcodes.POP2));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new InsnNode(Opcodes.POP));

        if (RANDOM.nextBoolean()) {
            for (int i = 0; i < 2 + RANDOM.nextInt(5); i++) {
                method.instructions.insert(new InsnNode(Opcodes.SWAP));
            }
        }

        if (RANDOM.nextBoolean()) {
            method.instructions.insert(new InsnNode(Opcodes.POP));
        } else {
            method.instructions.insert(new InsnNode(Opcodes.DUP));
            method.instructions.insert(new InsnNode(Opcodes.POP2));
        }

        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
    }
}

2.NumbersModifier - меняет числа все и добавляет лишнее вот пример обфусцированый ( это моя версия переписаная в обычном колониал он другой)

Код:
Expand Collapse Copy
public class Main {
    public static void main(String[] args) {
        long key = -164701876253981L;
        int varIndex = 1; 


        long value1 = -2078941969276575294L;
        long value2 = key ^ value1;
        int value1X = (int) value2;

        int a = 5;
        int b = 10;
        int c = a + b;

        int xorValue1 = 2026340751;
        int xorValue2 = 485239483;   
        c = c ^ xorValue1;
        c = c ^ xorValue2;

        System.out.println("Result: " + c);
    }
}

3. LocalVariables - меняет название локальных переменных и тд йоу пример обфусцированого кода не нужен
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час

LocalVariables:
Expand Collapse Copy
package colonialobfuscator.transforms;

import static colonialobfuscator.guis.SettingsPanel.namesLenghtField;

import colonialobfuscator.utils.OutputUtil;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.ParameterNode;

import colonialobfuscator.utils.NameGen;

import java.util.Random;

public class LocalVariables implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (method.localVariables != null && method.localVariables.size() > 0) {
                for (LocalVariableNode var : method.localVariables) {
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    var.name = newName;

                    if (RANDOM.nextBoolean()) {
                        String alias = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                        var.name += "_" + alias;
                    }

                    if (RANDOM.nextBoolean()) {
                        swapLocalVariables(method);
                    }
                }
            }

            if (method.parameters != null && method.parameters.size() > 0) {
                for (ParameterNode param : method.parameters) {
                    // Генерация нового имени для параметра
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    param.name = newName;

                    if (RANDOM.nextBoolean()) {
                        insertHiddenParameter(method);
                    }
                }
            }
        }
    }

    private void swapLocalVariables(MethodNode method) {
        if (method.localVariables.size() > 1) {
            int index1 = RANDOM.nextInt(method.localVariables.size());
            int index2 = RANDOM.nextInt(method.localVariables.size());

            LocalVariableNode var1 = method.localVariables.get(index1);
            LocalVariableNode var2 = method.localVariables.get(index2);

            String tempName = var1.name;
            var1.name = var2.name;
            var2.name = tempName;
        }
    }

    private void insertHiddenParameter(MethodNode method) {
        String hiddenName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
        String none = "";
        ParameterNode hiddenParam = new ParameterNode(none,1);
        hiddenParam.name = hiddenName;
        
        method.parameters.add(0, hiddenParam);
    }
}


ObfNumber:
Expand Collapse Copy
package colonialobfuscator.transforms;

import java.util.Random;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.VarInsnNode;

public class ModifierNumbers implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode classNode) {
        classNode.methods.stream().forEach(mn -> {
            long key = new Random().nextLong();
            int varIndex = mn.maxLocals;
            mn.maxLocals++;

            InsnList keyStore = new InsnList();
            keyStore.add(new LdcInsnNode(key));
            keyStore.add(new VarInsnNode(LSTORE, varIndex));
            mn.instructions.insertBefore(mn.instructions.getFirst(), keyStore);

            for (AbstractInsnNode insn : mn.instructions.toArray()) {
                if (isIntInsn(insn)) {
                    try {
                        int originalNum = getIntegerFromInsn(insn);
                        int value1 = RANDOM.nextInt();
                        int value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                        mn.instructions.insertBefore(insn, new LdcInsnNode(0));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isLongInsn(insn)) {
                    try {
                        long originalNum = getLongFromInsn(insn);
                        long value1 = new Random().nextLong();
                        long value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(LXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP2));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isFloatInsn(insn)) {
                    try {
                        float originalNum = getFloatFromInsn(insn);
                        int value1 = Float.floatToIntBits(originalNum);
                        int value2 = new Random().nextInt();

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(I2F));
                        insnList.add(new LdcInsnNode(0.0f));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public static boolean isIntInsn(AbstractInsnNode insn) {
        if (insn == null) {
            return false;
        }
        int opcode = insn.getOpcode();
        return ((opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5)
                || opcode == Opcodes.BIPUSH
                || opcode == Opcodes.SIPUSH
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer));
    }

    public static boolean isLongInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode == Opcodes.LCONST_0
                || opcode == Opcodes.LCONST_1
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long));
    }

    public static boolean isFloatInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2)
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float);
    }

    public static int getIntegerFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5) {
            return opcode - 3;
        } else if (insn instanceof IntInsnNode && insn.getOpcode() != Opcodes.NEWARRAY) {
            return ((IntInsnNode) insn).operand;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer) {
            return (Integer) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static long getLongFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.LCONST_0 && opcode <= Opcodes.LCONST_1) {
            return opcode - 9;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long) {
            return (Long) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static float getFloatFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2) {
            return opcode - 11;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float) {
            return (Float) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }
}

Ну все йоу топавая обф майнкрафт 228 йоу написана класс ремап в 3 туториале будет йоууу
и потом продавать за 500р :roflanEbalo::roflanEbalo::roflanEbalo:
 
Так-как многие просили а точнее никто делаю 2 часть
1.FlowObfuscation - этот метод обфускации просто добавляет если просто говоря то мусорный код вот пример:
До:
Код:
Expand Collapse Copy
public class Main {
    public static int result(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(3, 5);
        System.out.println(result);
    }
}
После:

Код:
Expand Collapse Copy
public class Main{
    public static int a1(int x, int y) {
        if (x > y) {
            return x + y;
        } else {
            return y + x;
        }
    }

    public static int a2() {
        return 5;
    }

    public static int a3() {
        return 3;
    }

    public static int sumOfTwoNumbers(int a, int b) {
        int temp = a1(a, b);
        temp = a2() + temp;
        return temp;
    }

    public static void main(String[] args) {
        int result = sumOfTwoNumbers(a3(), a2());
        System.out.println(result);
    }
}

Вот как выглядитего код обфускации ( примерный ):
Код:
Expand Collapse Copy
@Override
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (!method.name.startsWith("<")) {
                for (AbstractInsnNode insnNode : method.instructions.toArray()) {
                    
                    if (shouldObfuscate(insnNode)) {
                        int insertCount = 1 + RANDOM.nextInt(5);
                        for (int i = 0; i < insertCount; i++) {
                            insertRandomOperations(method, insnNode);
                        }
                    }
                    
                    if (insnNode.getOpcode() == Opcodes.DUP) {
                        obfuscateDupMethod(method);
                    }
                }
            }
        }
private void obfuscateDupMethod(MethodNode method) {
        method.instructions.insert(new InsnNode(Opcodes.POP2));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new InsnNode(Opcodes.POP));

        if (RANDOM.nextBoolean()) {
            for (int i = 0; i < 2 + RANDOM.nextInt(5); i++) {
                method.instructions.insert(new InsnNode(Opcodes.SWAP));
            }
        }

        if (RANDOM.nextBoolean()) {
            method.instructions.insert(new InsnNode(Opcodes.POP));
        } else {
            method.instructions.insert(new InsnNode(Opcodes.DUP));
            method.instructions.insert(new InsnNode(Opcodes.POP2));
        }

        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
        method.instructions.insert(new LdcInsnNode(NameGen.String(1)));
    }
}

2.NumbersModifier - меняет числа все и добавляет лишнее вот пример обфусцированый ( это моя версия переписаная в обычном колониал он другой)

Код:
Expand Collapse Copy
public class Main {
    public static void main(String[] args) {
        long key = -164701876253981L;
        int varIndex = 1; 


        long value1 = -2078941969276575294L;
        long value2 = key ^ value1;
        int value1X = (int) value2;

        int a = 5;
        int b = 10;
        int c = a + b;

        int xorValue1 = 2026340751;
        int xorValue2 = 485239483;   
        c = c ^ xorValue1;
        c = c ^ xorValue2;

        System.out.println("Result: " + c);
    }
}

3. LocalVariables - меняет название локальных переменных и тд йоу пример обфусцированого кода не нужен
Теперь зная все это приступим к написани, код своего обф я вам не дам но вот что я написал за +- час

LocalVariables:
Expand Collapse Copy
package colonialobfuscator.transforms;

import static colonialobfuscator.guis.SettingsPanel.namesLenghtField;

import colonialobfuscator.utils.OutputUtil;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.ParameterNode;

import colonialobfuscator.utils.NameGen;

import java.util.Random;

public class LocalVariables implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode node) {
        for (MethodNode method : node.methods) {
            if (method.localVariables != null && method.localVariables.size() > 0) {
                for (LocalVariableNode var : method.localVariables) {
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    var.name = newName;

                    if (RANDOM.nextBoolean()) {
                        String alias = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                        var.name += "_" + alias;
                    }

                    if (RANDOM.nextBoolean()) {
                        swapLocalVariables(method);
                    }
                }
            }

            if (method.parameters != null && method.parameters.size() > 0) {
                for (ParameterNode param : method.parameters) {
                    // Генерация нового имени для параметра
                    String newName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
                    param.name = newName;

                    if (RANDOM.nextBoolean()) {
                        insertHiddenParameter(method);
                    }
                }
            }
        }
    }

    private void swapLocalVariables(MethodNode method) {
        if (method.localVariables.size() > 1) {
            int index1 = RANDOM.nextInt(method.localVariables.size());
            int index2 = RANDOM.nextInt(method.localVariables.size());

            LocalVariableNode var1 = method.localVariables.get(index1);
            LocalVariableNode var2 = method.localVariables.get(index2);

            String tempName = var1.name;
            var1.name = var2.name;
            var2.name = tempName;
        }
    }

    private void insertHiddenParameter(MethodNode method) {
        String hiddenName = NameGen.colonial() + NameGen.String(OutputUtil.namesLenght);
        String none = "";
        ParameterNode hiddenParam = new ParameterNode(none,1);
        hiddenParam.name = hiddenName;
        
        method.parameters.add(0, hiddenParam);
    }
}


ObfNumber:
Expand Collapse Copy
package colonialobfuscator.transforms;

import java.util.Random;

import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.VarInsnNode;

public class ModifierNumbers implements ClassModifier {

    private static final Random RANDOM = new Random();

    [USER=1367676]@override[/USER]
    public void modify(ClassNode classNode) {
        classNode.methods.stream().forEach(mn -> {
            long key = new Random().nextLong();
            int varIndex = mn.maxLocals;
            mn.maxLocals++;

            InsnList keyStore = new InsnList();
            keyStore.add(new LdcInsnNode(key));
            keyStore.add(new VarInsnNode(LSTORE, varIndex));
            mn.instructions.insertBefore(mn.instructions.getFirst(), keyStore);

            for (AbstractInsnNode insn : mn.instructions.toArray()) {
                if (isIntInsn(insn)) {
                    try {
                        int originalNum = getIntegerFromInsn(insn);
                        int value1 = RANDOM.nextInt();
                        int value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                        mn.instructions.insertBefore(insn, new LdcInsnNode(0));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isLongInsn(insn)) {
                    try {
                        long originalNum = getLongFromInsn(insn);
                        long value1 = new Random().nextLong();
                        long value2 = originalNum ^ value1;

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(LXOR));
                        insnList.add(new LdcInsnNode(0));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP2));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (isFloatInsn(insn)) {
                    try {
                        float originalNum = getFloatFromInsn(insn);
                        int value1 = Float.floatToIntBits(originalNum);
                        int value2 = new Random().nextInt();

                        InsnList insnList = new InsnList();
                        insnList.add(new LdcInsnNode(value1));
                        insnList.add(new LdcInsnNode(value2));
                        insnList.add(new InsnNode(IXOR));
                        insnList.add(new InsnNode(I2F));
                        insnList.add(new LdcInsnNode(0.0f));

                        mn.instructions.insertBefore(insn, insnList);
                        mn.instructions.remove(insn);
                        
                        mn.instructions.insertBefore(insn, new InsnNode(Opcodes.POP));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public static boolean isIntInsn(AbstractInsnNode insn) {
        if (insn == null) {
            return false;
        }
        int opcode = insn.getOpcode();
        return ((opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5)
                || opcode == Opcodes.BIPUSH
                || opcode == Opcodes.SIPUSH
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer));
    }

    public static boolean isLongInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode == Opcodes.LCONST_0
                || opcode == Opcodes.LCONST_1
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long));
    }

    public static boolean isFloatInsn(AbstractInsnNode insn) {
        int opcode = insn.getOpcode();
        return (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2)
                || (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float);
    }

    public static int getIntegerFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.ICONST_M1 && opcode <= Opcodes.ICONST_5) {
            return opcode - 3;
        } else if (insn instanceof IntInsnNode && insn.getOpcode() != Opcodes.NEWARRAY) {
            return ((IntInsnNode) insn).operand;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Integer) {
            return (Integer) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static long getLongFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.LCONST_0 && opcode <= Opcodes.LCONST_1) {
            return opcode - 9;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Long) {
            return (Long) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }

    public static float getFloatFromInsn(AbstractInsnNode insn) throws Exception {
        int opcode = insn.getOpcode();

        if (opcode >= Opcodes.FCONST_0 && opcode <= Opcodes.FCONST_2) {
            return opcode - 11;
        } else if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst instanceof Float) {
            return (Float) ((LdcInsnNode) insn).cst;
        }

        throw new Exception("Unexpected instruction");
    }
}

Ну все йоу топавая обф майнкрафт 228 йоу написана класс ремап в 3 туториале будет йоууу

1. FlowObfuscation - ты можешь сделать более сложную систему. К примеру сделать switch в котором сделай переход на новые LabelNode с мусорным кодом(это усложнит анализ) а ключ для switch собирай по мере прохождения по коду.

2. NumberObfuscation - не делай просто Integer ^ Integer, лучше сделай ключ через field который задаётся в <clinit> и по мере исполнения изменяй ключ, так будет надёжно и обычным UniversalNumberTransformer будет уже не снять. И сделай не только для int значений, лучше обфуцирвоать все числа(int,double,float and etc...).

3. LocalVariables - Можно сделать автодобавление локальных переменных и уже ренеймить(в некоторых случаях LV отсутствует и прока от твоего ренейма не будет)


Можешь ещё попробовать ReferenceTransformer сделать но скажу сразу это трудно.
 
Бля, это такой ахтунг.
1. FlowObfuscation - ты можешь сделать более сложную систему. К примеру сделать switch в котором сделай переход на новые LabelNode с мусорным кодом(это усложнит анализ) а ключ для switch собирай по мере прохождения по коду.

2. NumberObfuscation - не делай просто Integer ^ Integer, лучше сделай ключ через field который задаётся в <clinit> и по мере исполнения изменяй ключ, так будет надёжно и обычным UniversalNumberTransformer будет уже не снять. И сделай не только для int значений, лучше обфуцирвоать все числа(int,double,float and etc...).

3. LocalVariables - Можно сделать автодобавление локальных переменных и уже ренеймить(в некоторых случаях LV отсутствует и прока от твоего ренейма не будет)


Можешь ещё попробовать ReferenceTransformer сделать но скажу сразу это трудно.
Метки + goto лучше уже. Это если во внимание не принимать тот факт, что это джавасайд защита.
 
Бля, это такой ахтунг.

Метки + goto лучше уже. Это если во внимание не принимать тот факт, что это джавасайд защита.
Спасибо большое за идею
1. FlowObfuscation - ты можешь сделать более сложную систему. К примеру сделать switch в котором сделай переход на новые LabelNode с мусорным кодом(это усложнит анализ) а ключ для switch собирай по мере прохождения по коду.

2. NumberObfuscation - не делай просто Integer ^ Integer, лучше сделай ключ через field который задаётся в <clinit> и по мере исполнения изменяй ключ, так будет надёжно и обычным UniversalNumberTransformer будет уже не снять. И сделай не только для int значений, лучше обфуцирвоать все числа(int,double,float and etc...).

3. LocalVariables - Можно сделать автодобавление локальных переменных и уже ренеймить(в некоторых случаях LV отсутствует и прока от твоего ренейма не будет)


Можешь ещё попробовать ReferenceTransformer сделать но скажу сразу это трудно.
Спасибо большое за идею
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Назад
Сверху Снизу