Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Лаунчер Пересобранная jvm.

Любопытно то, как себя будут вести при этом моды, использующие кастомные classloader и манипулирующие байт-кодом.
На сталкрафте как-то сдампили все динамические классы от своих модов и так же зашифровали. Не знаю, как именно это сделали и в каких пределах это можно делать вообще, но - возможно.
 
На сталкрафте как-то сдампили все динамические классы от своих модов и так же зашифровали. Не знаю, как именно это сделали и в каких пределах это можно делать вообще, но - возможно.
Моды их => могли и просто написать classloader, который расшифровывает массив байтов при чтении классов. В случае дешифровки на уровне JVM затронуты будут все classloader: чтение класса в бинарном представлении (как обычный файл) выявит наличие шифрования и т.о. загрузка повалится.
 
Моды их => могли и просто написать classloader, который расшифровывает массив байтов при чтении классов. В случае дешифровки на уровне JVM затронуты будут все classloader: чтение класса в бинарном представлении (как обычный файл) выявит наличие шифрования и т.о. загрузка повалится.
Это уже детали реализации. Думаю, для начала подойдёт некий рабочий концепт, который в принципе умеет что-то шифровать и расшифровывать. Или не расшифровывать, а проверять некие метки в самих классах. Т.е., привязывать конкретные классы к конкретной jvm любым способом.
 
Это уже детали реализации. Думаю, для начала подойдёт некий рабочий концепт, который в принципе умеет что-то шифровать и расшифровывать. Или не расшифровывать, а проверять некие метки в самих классах. Т.е., привязывать конкретные классы к конкретной jvm любым способом.
Для привязки к конкретной JVM надо б гарантировать, что всякие средства вроде ASM не будут пытаться такие вот "привязанные к конкретной JVM классы" редактировать (иначе попросту завалится при попытке редактирования) или вообще пытаться свои генерировать. Естественно, моды в этом плане "хороши": могут использовать ASM (равно как и отражения) на любой чих.
 
Выложишь шифровщик в открытый доступ, и читеры зашифруют свои классы. Не выложишь -- админы проектов не смогут зашифровать свои моды. Нужно как-то определять админов проектов и давать шифровальщик только им или что-то еще придумать.
 
Для привязки к конкретной JVM надо б гарантировать, что всякие средства вроде ASM не будут пытаться такие вот "привязанные к конкретной JVM классы" редактировать (иначе попросту завалится при попытке редактирования) или вообще пытаться свои генерировать. Естественно, моды в этом плане "хороши": могут использовать ASM (равно как и отражения) на любой чих.
> гарантировать
Знать бы, как это сделать... Боюсь, что гарантий никаких нет. Однако, я лишь поверхностно знаком с внутренним устройством джавы и по этому вопросу отвечу просто - не знаю.
Выложишь шифровщик в открытый доступ, и читеры зашифруют свои классы. Не выложишь -- админы проектов не смогут зашифровать свои моды. Нужно как-то определять админов проектов и давать шифровальщик только им или что-то еще придумать.
Не плоди сущности: в первую очередь, ты делаешь концепт в паблик. Кому надо - доработают его под себя, твоя же задача - показать самое важное - принцип, поэтому выкладывай всё как есть.
 
Есть в гравитЛаунчере у нас мини-фильтр, канал который доступен только владельцам проектов но:
upload_2019-6-22_16-28-2.png
 
В общем, это всё придирки и мелочи.
@fereter, ты красавчик, что занялся защитой в джаве, но с текущим билдом разобрались, надо двигаться дальше.
Первое, что тебе надо сделать - полностью вырезать JVMTI. Насколько знаю, он отключается каким-то аргументом при билде. Второй шаг - шифрование классов: *.class-файлики передаются на вход зашифрованными, JVM их расшифровывает и запускает. Потребуется зашифровать все классы клиента и самой джавы, для этого напиши утилитку или скрипт, на вход которым передавай, например, путь к папке с клиентом, на выходе - отдельная папка с зашифрованными файлами. Это не позволит запускать чужие классы by-design, т.к. джава их просто не поймёт: после её внутренней попытки их расшифровать получит мусор.
И майн с форжем можно выбрасывать, ибо asm либа отвалится. А нативные читы продолжат работать. К примеру подменим нативку из lwjgl. Через jni все прозрачно же будет.
 
Последнее редактирование:
А если перемешать расположение полей в JNIEnv и собрать все нативки с новыми хедерами? Тогда отвалятся и нативные читы на JNI.
Как вариант. Но придется вести поддержку новых версий. Да и в модах типо комп крафт бывают нативки, внезапно. Все это пересобирать тоже.
 
@fereter, раз уж занялся, поресёрчи всё это - и возможность пошифровать классы, и перемешивание полей в JNI
 
надо ловить трейс и проверять.
0 проверок стека, а то что есть с JavaThread это не решение
Добавил проверку стека на предмет gl11 и JVM_MonitorNotify. Добавил в версию с черными/белыми списками проверку на последний frame стека по белым спискам.
Когда публикаешь сравнения, пиши относительные результаты: было -> стало.
Было 13 секунд. Стало 13 секунд.
оттестит на разных версиях
Протестировал на GTNH 2.0.7.5.
В ближайших планах вырезать jvmti и добавить демку на третьем сашке.
 
При запуске vanilla 1.6.4 возникает ошибка парсинга одного из майновских классов. Я немного модифицировал логирование загрузки классов и добавил записи вида "[Loading %classname% GetFrameCount = %getframeCcount%]" для отладки. Выводятся они еше до проверки magic number. Лог падения прилагаю.
Код:
[Loading avi GetFrameCount = 15]
[Loading avi:avi from file:/C:/Users/rect/AppData/Roaming/.technic/modpacks/vanilla/bin/minecraft.jar]
[Loaded avi from file:/C:/Users/rect/AppData/Roaming/.technic/modpacks/vanilla/bin/minecraft.jar]
[Loading aux GetFrameCount = 10]
[Loading java.lang.ClassFormatError GetFrameCount = 10]
[Loaded java.lang.ClassFormatError from D:\dev\minedev\TenonteamPrivate\RebVM\vmsrc\jdk8\build\windows-x86_64-normal-server-release\jdk\classes]
Exception in thread "Minecraft main thread" java.lang.ClassFormatError: Truncated class file
        at java.lang.ClassLoader.findBootstrapClass(Native Method)
        at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1015)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:413)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at avv.d(SourceFile:43)
        at net.minecraft.client.Minecraft.c(SourceFile:190)
        at net.minecraft.client.Minecraft.run(SourceFile:510)
        at java.lang.Thread.run(Thread.java:748)

С проверками не связано, компилировал без проверок и логирования -- все равно вылетало.

Кто знает с чем связано и как можно фиксить?
 
При запуске vanilla 1.6.4 возникает ошибка парсинга одного из майновских классов. Я немного модифицировал логирование загрузки классов и добавил записи вида "[Loading %classname% GetFrameCount = %getframeCcount%]" для отладки. Выводятся они еше до проверки magic number. Лог падения прилагаю.
Код:
[Loading avi GetFrameCount = 15]
[Loading avi:avi from file:/C:/Users/rect/AppData/Roaming/.technic/modpacks/vanilla/bin/minecraft.jar]
[Loaded avi from file:/C:/Users/rect/AppData/Roaming/.technic/modpacks/vanilla/bin/minecraft.jar]
[Loading aux GetFrameCount = 10]
[Loading java.lang.ClassFormatError GetFrameCount = 10]
[Loaded java.lang.ClassFormatError from D:\dev\minedev\TenonteamPrivate\RebVM\vmsrc\jdk8\build\windows-x86_64-normal-server-release\jdk\classes]
Exception in thread "Minecraft main thread" java.lang.ClassFormatError: Truncated class file
        at java.lang.ClassLoader.findBootstrapClass(Native Method)
        at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1015)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:413)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at avv.d(SourceFile:43)
        at net.minecraft.client.Minecraft.c(SourceFile:190)
        at net.minecraft.client.Minecraft.run(SourceFile:510)
        at java.lang.Thread.run(Thread.java:748)

С проверками не связано, компилировал без проверок и логирования -- все равно вылетало.

Кто знает с чем связано и как можно фиксить?
А вы уверены, что само ядро не повреждено (точнее говоря, его классы)? https://bugs.mojang.com/browse/MC-20394
"Удалить и перескачать" пробовали?
 
и давать шифровальщик только им или что-то еще придумать.
не дашь шифровальщик - напишут свой. главное знать ключ и алгоритм
если расшифровывать прямо в jvm, то из нее же можно вытащить ключи и зашифровать самому. можно конечно вместо общих алгоритмов наговнокодить свои, но это лишь усложнит процесс вытаскивания алгоритма, но не предотвратит.
можно вместо шифрования использовать подпись. тогда вместо ключа расшифровки в jvm будет только открытый ключ, а закрытый для ручной подписи будет только у админов сервера.
но особо ушлые смогут тупо подменить этот ключ в jvm и переподписать все классы.
если конечно как-то не защитить jvm от изменения
короче с шифрованием все сложно)
 

Поделиться этой страницей

Назад
Верх