Начинающий
- Статус
- Оффлайн
- Регистрация
- 14 Окт 2024
- Сообщения
- 25
- Реакции
- 5
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Эта тема подойдет для тех кто задавался или хочет написать защиту для своего или чужого чита, здесь будет краткий разбор что и нахуя нужно сделать так чтобы какие нибудь обрыганы не трогали вас и не просили выкуп за кряк вашей очередной пасты.
1. Класс-файл парсер (ClassFileParser)
Суть: Чтобы усложнить анализ твоего говна .jar/.class.
Изменить структуру .class-файлов (например, поменять порядок констант в пуле).
Добавить мусорные байты, чтобы декомпиляторы (например, CFR, FernFlower) ломались.
Пример как поднасрать пастерам:
2. Класс-файл стрим (ClassFileStream)
Суть: Чтобы затруднить загрузку всякой хуйни в память JVM (если кто-то попытается проанализировать в runtime).
Шифровать .class-файлы и расшифровывать их только перед загрузкой.
Использовать кастомный ClassLoader, который проверяет хеш перед загрузкой.
Пример:
3. Вырезать jvmti (JVM Tool Interface)
Чтобы запретить отладку (читеры не смогут подключиться к JVM через jdb, JVMTI или ASM).
Собрать кастомную JVM без поддержки jvmti.dll.
Патчить libjvm.so, чтобы он игнорировал запросы отладчика.
Эффект:
jstack, jmap не смогут получить дампы памяти.
Код сложнее анализировать в runtime.
4. Менять сдвиги таблицы JNI (Java Native Interface)
Суть: Чтобы замести следы нативных вызовов (если твой чит использует JNI).
Перемешать JNIEnv-таблицу (чтобы реверсеры не могли найти CallStaticVoidMethod и т.д.).
Динамически вычислять оффсеты функций (а не страдать хуйней).
Пример:
5. Скриптить константы отдельно
Суть: Чтобы запутать сигнатуры (строки, числа, хеши), которые реверсеры ищут в бинарнике.
Разбивать строки:
6. Сменить структуру InstanceClass
Суть: Чтобы нассать в памяти и сломать декомпиляторы (например, jd gui).
Патчить HotSpot JVM, чтобы она меняла порядок полей в рантайме.
Добавлять fake-поля в классы.
Эффект:
Dump памяти будет выглядеть как мусор.
Рефлексия (getDeclaredFields) вернёт бессмысленные данные.
7. Нативная защита
Суть: Усложнить реверс (анализировать нативный код сложнее, чем Java).
Скрыть критическую логику (например, критически важных классов чтобы не вьебали как дусю ебаную).
Обфусцировать нативный код (OLLVM, Tigress).
Анти-отладка:
Детект Cheat Engine / x64dbg например по хешу иконок.
8. Крипта (кфс/кфп)
кфс (Key-Flow Crypt)
Суть: Динамическое шифрование кода так, чтобы:
В памяти всегда лежала только расшифрованная часть, которая сейчас выполняется.
Остальное — зашифрованный мусор, который расшифровывается только перед исполнением.
Как делается:
Делим код на куски (например, по методам).
Каждый кусок шифруем AES-256 + свой ключ.
Перед вызовом метода — расшифровываем, выполняем, сразу затираем.
Ключи генерируются в рантайме (например, из хеша системного времени).
Можно зашифровать даже строки (String → byte[] → XOR → мусор в декомпиляторе).
кфп (Key-Flow Packer)
Суть: Упаковка .class-файлов так, чтобы:
Dump памяти был бесполезен.
Декомпиляторы (JD-GUI, FernFlower) падали с ошибками.
Как делается:
Ломаем структуру .class-файла:
Меняем magic bytes (CA FE BA BE → DE AD BE EF).
Добавляем фейковые секции в константный пул.
Динамическая реконструкция:
При загрузке исправляем битый .class в памяти перед передачей в ClassLoader.
CFR и другие декомпиляторы не понимают битые файлы.
Reflection тоже ломается — getDeclaredMethods() вернёт хуйню.
Шифровать .class-файлы (AES + кастомный загрузчик).
Динамическая расшифровка кода перед выполнением.
Вывод:
Если сделать кфс + кфп + нативку, реверсеру проще написать чит с нуля, чем разбирать этот фаршированный пиздец.
1. Класс-файл парсер (ClassFileParser)
Суть: Чтобы усложнить анализ твоего говна .jar/.class.
Изменить структуру .class-файлов (например, поменять порядок констант в пуле).
Добавить мусорные байты, чтобы декомпиляторы (например, CFR, FernFlower) ломались.
Пример как поднасрать пастерам:
Java:
// Вместо нормального класса:
public class Main {
public static void enable() { ... }
}
// Создаёшь битый class-файл с лишними байтами:
CA FE BA BE 00 00 00 34 ← стандартный заголовок
00 00 00 FF FF FF FF ← мусорные данные (декомпилятор ломается)
2. Класс-файл стрим (ClassFileStream)
Суть: Чтобы затруднить загрузку всякой хуйни в память JVM (если кто-то попытается проанализировать в runtime).
Шифровать .class-файлы и расшифровывать их только перед загрузкой.
Использовать кастомный ClassLoader, который проверяет хеш перед загрузкой.
Пример:
Java:
public class CustomClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) {
byte[] encrypted = loadEncryptedClass(name);
byte[] decrypted = decrypt(encrypted, SECRET_KEY);
return defineClass(name, decrypted, 0, decrypted.length);
}
}
3. Вырезать jvmti (JVM Tool Interface)
Чтобы запретить отладку (читеры не смогут подключиться к JVM через jdb, JVMTI или ASM).
Собрать кастомную JVM без поддержки jvmti.dll.
Патчить libjvm.so, чтобы он игнорировал запросы отладчика.
Эффект:
jstack, jmap не смогут получить дампы памяти.
Код сложнее анализировать в runtime.
4. Менять сдвиги таблицы JNI (Java Native Interface)
Суть: Чтобы замести следы нативных вызовов (если твой чит использует JNI).
Перемешать JNIEnv-таблицу (чтобы реверсеры не могли найти CallStaticVoidMethod и т.д.).
Динамически вычислять оффсеты функций (а не страдать хуйней).
Пример:
Java:
// Вместо:
(*env)->CallStaticVoidMethod(env, cls, mid);
// Делаешь:
void* jniFunc = (void*)((uintptr_t)env + RANDOM_OFFSET);
((JNICALL)jniFunc)(env, cls, mid); // Обычный пастер не поймет что это вызов.
5. Скриптить константы отдельно
Суть: Чтобы запутать сигнатуры (строки, числа, хеши), которые реверсеры ищут в бинарнике.
Разбивать строки:
Java:
// Вместо:
String key = "SECRET_CHEAT_KEY";
// Делаешь:
String key = "SEC" + "RET" + "_CH" + "EAT" + "_KE" + "Y";
Динамически генерировать важные значения (например, XOR-шифрование строк).
6. Сменить структуру InstanceClass
Суть: Чтобы нассать в памяти и сломать декомпиляторы (например, jd gui).
Патчить HotSpot JVM, чтобы она меняла порядок полей в рантайме.
Добавлять fake-поля в классы.
Эффект:
Dump памяти будет выглядеть как мусор.
Рефлексия (getDeclaredFields) вернёт бессмысленные данные.
7. Нативная защита
Суть: Усложнить реверс (анализировать нативный код сложнее, чем Java).
Скрыть критическую логику (например, критически важных классов чтобы не вьебали как дусю ебаную).
Обфусцировать нативный код (OLLVM, Tigress).
Анти-отладка:
Детект Cheat Engine / x64dbg например по хешу иконок.
8. Крипта (кфс/кфп)
кфс (Key-Flow Crypt)
Суть: Динамическое шифрование кода так, чтобы:
В памяти всегда лежала только расшифрованная часть, которая сейчас выполняется.
Остальное — зашифрованный мусор, который расшифровывается только перед исполнением.
Как делается:
Делим код на куски (например, по методам).
Каждый кусок шифруем AES-256 + свой ключ.
Перед вызовом метода — расшифровываем, выполняем, сразу затираем.
Java:
// Пример псевдокода для кфс
void encryptedMethod() {
byte[] encryptedCode = loadFromFile("method1.enc");
byte[] code = decrypt(encryptedCode, dynamicKey);
executeInMemory(code); // выполнить
Arrays.fill(code, 0); // затереть
}
Ключи генерируются в рантайме (например, из хеша системного времени).
Можно зашифровать даже строки (String → byte[] → XOR → мусор в декомпиляторе).
кфп (Key-Flow Packer)
Суть: Упаковка .class-файлов так, чтобы:
Dump памяти был бесполезен.
Декомпиляторы (JD-GUI, FernFlower) падали с ошибками.
Как делается:
Ломаем структуру .class-файла:
Меняем magic bytes (CA FE BA BE → DE AD BE EF).
Добавляем фейковые секции в константный пул.
Динамическая реконструкция:
При загрузке исправляем битый .class в памяти перед передачей в ClassLoader.
Java:
// Пример: подмена magic bytes
byte[] brokenClass = Files.readAllBytes("Main.class");
brokenClass[0] = 0xDE; // CA → DE
brokenClass[1] = 0xAD; // FE → AD
CFR и другие декомпиляторы не понимают битые файлы.
Reflection тоже ломается — getDeclaredMethods() вернёт хуйню.
Шифровать .class-файлы (AES + кастомный загрузчик).
Динамическая расшифровка кода перед выполнением.
Вывод:
Если сделать кфс + кфп + нативку, реверсеру проще написать чит с нуля, чем разбирать этот фаршированный пиздец.
Последнее редактирование: