aka wqzxqz
-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Всем привет дорогие друзья. Давно от меня не было всякой полезной хуйни, так что делаем свой обфускатор на джаве. Снизу вы увидите сразу практику т.к мне лень писать какие то теории (это не заходило югейму, они же пастить хотят сразу xD)
1. настроим проект
Добавим зависимость ASM
В файл
p.s: также можно просто закинуть в папку проекта либку asm с maven repository и подключить через либки в интелидже
Создаем базовый класс обфускатора
Создаем класс JavaObfuscator:
2. Добавляем систему трансформаций
Создаем интерфейс и сервис
Добавляем внутрь класса JavaObfuscator:
3. Пишем шифрование строк
Делаем трансформер для строк
Добавляем класс-трансформер:
Пример работы
До:
После:
4. Усложняем поток управления
Добавляем мусорные условия
Создаем новый трансформер:
Как это выглядит в коде:
До:
После (фейк-код):
5. Собираем все вместе
Модифицируем main-метод
Обновляем код в
6. Запускаем обфускатор
Компилируем наш обфускатор
Обфусцируем тестовый класс
Запускаем результат
Итог моего гайда: У нас есть обфкскатор который:
В качестве улучшений мы сможем добавлять новые трансформеры. Это база обфускатора)
Полный код обфускатора:
Всем пока. 

1. настроим проект
Добавим зависимость ASM
В файл
pom.xml
(для Maven) или build.gradle
(для Gradle) добавляем:
XML:
<!-- Maven -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>9.4</version>
</dependency>
Создаем базовый класс обфускатора
Создаем класс 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());
}
}
Создаем интерфейс и сервис
Добавляем внутрь класса 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) {}
}
Делаем трансформер для строк
Добавляем класс-трансформер:
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="));
Добавляем мусорные условия
Создаем новый трансформер:
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;
}
Модифицируем 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);
// ... (запись класса)
}
Компилируем наш обфускатор
Делаем это через запуск из интелиджи
Обфусцируем тестовый класс
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);
}
}
}
}
}

