Гайд Разбор защиты чита - Akrien Premium [MINECRAFT] [JAVA]

Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
10
Реакции[?]
0
Поинты[?]
0
0. ОГЛАВЛЕНИЕ.
Это больше не гайд, а статья.

Сие чудо оснащено протектором - VMProtect 3.5-3.6.
Посмотреть вложение 234667

1. АВТОРИЗАЦИЯ
Приступим к разбору авторизации.
При авторизации отправляется запрос по сыллке -

akrien.wtf/akrienmc/api/v2/brain.php? a=Sg8pc8d374QX7k0V42WV<|>auth<|>логин<|>пароль<|>E3182ADDBD540B761D1220A995A7323F<|>V1BIUFYyUW9WfEdBUTU0VVJSVkJRbUZOUG9JcU1CVlJWbUZMVVE1TlBvZ2NVblE1SUc1VVBCUlBNQE1zSVBNN0tAZzVKUG9zSn5FNUp9RldeXF1jU0cwc2FMc3VPanxGZlNSfWVTSmxmbUZKXlNgbGBMTmhmaVZ-TUFocV19MTxPbXQ8UTdofmBDUnBNQkZ9ZjZWNV03VWNQaUJwXlxzdU9qfFxWQUljTUJgQVF-TTVJQWd9VW5GRkhQRXNRNDQ1SUdGPE1ATXxJUEFzSTRBc0lRTTRJanN1T2p8RlBRVWNRamgyXlMwY0pXRX5KbkVzTUBdcFU2PX1eV0ZVZ2k9bl5cSn5mN01jTUdFY01HRWNNR0VjTUdFY01Mc3VPanxDZkM9fWdpbyo.&b=JDJhJDEyJEFqUFd0dXJMNkEvZDNGYmRHOW56bnVLOG9MbGk3Y0VIWFFoOVU1MkwvSG9ncS5DWEl4MnY

имеющие себе ваш логин, пароль, дату и информацию о вашем компьютере в зашифрованном виде.
При успешной авторизации, мы получаем такие данные:
Gay|><|юид|><|дата-окончания-подписки|><|версия-чита|><|дата<|>$2y$12$YW3KSoVQ1w3fWYtko6IWZ.1cUemBHphZOcuRCyrV8W777PUxime6C
2. ПРОВЕРКА ВЕРСИИ
При открытие лоадера, до момента авторизации, лоадер проверяет свою версию, отправляя запрос по сыллке -

akrien.wtf/akrienmc/api/v2/brain.php?a=h0A6Lb6X2VF4euN1o01p<|>loader<|>7&b=JDJhJDEyJGdPLklmUE5PcnRUbHpXbDhtLmJQWi5QL0ZYMVRURUlVRmMvWXAyZUo3TS43dDhVUGxGYmsy

При успешно пройденной проверке мы получаем следующие данные:
Uptodate<|>$2y$12$2alSbYJu/d8wWdTJKI4Qjev0.aGjaEJH2kC.LoWSN8klnhpjFXYui

3. JVM
Расскажу всего пару слов, потому что я не сильно ее размусоливал, jvm.dll оснащена VMProtect 3.2-3.5.
В ней присутствует измененный экспорт - Java_java_lang_ClassLoader_defineClass0.

4. ДЫРЫ ЗАЩИТЫ [JVM]
Джава акриена позволяет нам загружать свои классы, первое что я сделал, сделал статический анализ launcher.jar, он валяется в зашифрованном виде на пк, но подгружая свой класс используя рефлексию мы можем получить ее классы, методы классов, филды классов, и многое другое, в конце мы получаем такой результат:


Java:
ru.fals3r.AkrienGuard - super class: java.lang.Object
ru.fals3r.AkrienGuard - method: private static void a([byte[] arg0)
ru.fals3r.AkrienGuard - method: private static [byte[] a(URL arg0)
ru.fals3r.AkrienGuard - method: public static ClassLoader launch(String arg0)
ru.fals3r.b.a - super class: java.lang.Object
ru.fals3r.b.a - method: public static int b(java.io.InputStream arg0)
ru.fals3r.b.a - method: public static int b(java.io.OutputStream arg0)
ru.fals3r.b.a - method: public static int b(java.io.InputStream arg1)
ru.fals3r.b.a - method: public static int b(java.io.OutputStream arg1)
ru.fals3r.b.a - method: public static [byte[] a(java.io.InputStream arg0)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg0)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg0)
ru.fals3r.b.a - method: public static long a(int arg0)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg1)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg1)
ru.fals3r.b.a - method: public static long a(int arg1)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg2)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg2)
ru.fals3r.b.a - method: public static long a(int arg2)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg0)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg0)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg1)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg1)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg0)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg0)
ru.fals3r.b.a - method: public static long a([byte[] arg0)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg1)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg1)
ru.fals3r.b.a - method: public static long a([byte[] arg1)
ru.fals3r.b.a - method: public static long a(java.io.InputStream arg2)
ru.fals3r.b.a - method: public static long a(java.io.OutputStream arg2)
ru.fals3r.b.a - method: public static long a([byte[] arg2)
ru.fals3r.a.a - super class: java.net.URLClassLoader
ru.fals3r.a.a - Constructor([LURL; arg0)
ru.fals3r.a.a - Constructor(ClassLoader arg0)
ru.fals3r.a.a - Constructor([[byte[] arg0)
ru.fals3r.a.a - Constructor([LURL; arg1)
ru.fals3r.a.a - Constructor(ClassLoader arg1)
ru.fals3r.a.a - Constructor([[byte[] arg1)
ru.fals3r.a.a - Constructor([LURL; arg2)
ru.fals3r.a.a - Constructor(ClassLoader arg2)
ru.fals3r.a.a - Constructor([[byte[] arg2)
ru.fals3r.a.a - method: public Class loadClass(String arg0)
ru.fals3r.a.a - method: public URL findResource(String arg0)
ru.fals3r.a.a - field: private final HashMap a
ru.fals3r.a.b - super class: java.net.URLConnection
ru.fals3r.a.b - Constructor(URL arg0)
ru.fals3r.a.b - Constructor(java.util.HashMap arg0)
ru.fals3r.a.b - Constructor(URL arg1)
ru.fals3r.a.b - Constructor(java.util.HashMap arg1)
ru.fals3r.a.b - field: private final HashMap a
ru.fals3r.a.c - super class: java.net.URLStreamHandler
ru.fals3r.a.c - Constructor(java.util.HashMap arg0)
ru.fals3r.a.c - method: protected URLConnection openConnection(URL arg0)
ru.fals3r.a.c - field: private final HashMap a
И тут я решил сравнить две launcher.jar, фри версии, и премиум, и оказалось, что во фришной версии, были не изменённые названия методов, филдов.
Вкратце я сравнивая получил два нужных метода для получения дешифрованной джар файла чита.
Метод decrypt, download, и филд в класслоадере jarEntries, используя это есть два метода получения джарфайла:
1. Хуканием классов джавы, я получил сыллку, которая получает джар файл зашифрованный AES, получая сыллку можно сделать просто:

Java:
byte[] data = AkrienGuard.a(new URL("https://akrien.wtf/akrienmc/data/premium_1.12.2/get.php")); (т.е метод download)
AkrienGuard.a(data);

try(FileOutputStream fos = new FileOutputStream("Shitty client.jar"))
{
    fos.write(data);
}

// done
2. Используя то что метод AkrienGuard.launch(String str) возвращает класслоадер, не сложно было догадаться получить инстантс класслоадера лаунчера, и имея эти данные просто получить private final HashMap a (jarEntries), и в цикле сохранить файлы по порядку.

5. КОНЕЦ СТАТЬИ.
Но не все так просто, как казалось, на самих классах есть условное шифрование похожее на xor, из за не хватки времени, на полный разбор, и дешифрование классов, это статья заканчивается, но возможно будет вторая часть, где я буду рассказывать про это.

Посмотреть вложение 234666
Пожалуйста, авторизуйтесь для просмотра ссылки.
Декодни классы пожалуйста :)
 
Сверху Снизу