- Баллы
- 103
Любопытно то, как себя будут вести при этом моды, использующие кастомные classloader и манипулирующие байт-кодом.Второй шаг - шифрование классов
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Любопытно то, как себя будут вести при этом моды, использующие кастомные classloader и манипулирующие байт-кодом.Второй шаг - шифрование классов
На сталкрафте как-то сдампили все динамические классы от своих модов и так же зашифровали. Не знаю, как именно это сделали и в каких пределах это можно делать вообще, но - возможно.Любопытно то, как себя будут вести при этом моды, использующие кастомные classloader и манипулирующие байт-кодом.
Моды их => могли и просто написать classloader, который расшифровывает массив байтов при чтении классов. В случае дешифровки на уровне JVM затронуты будут все classloader: чтение класса в бинарном представлении (как обычный файл) выявит наличие шифрования и т.о. загрузка повалится.На сталкрафте как-то сдампили все динамические классы от своих модов и так же зашифровали. Не знаю, как именно это сделали и в каких пределах это можно делать вообще, но - возможно.
Это уже детали реализации. Думаю, для начала подойдёт некий рабочий концепт, который в принципе умеет что-то шифровать и расшифровывать. Или не расшифровывать, а проверять некие метки в самих классах. Т.е., привязывать конкретные классы к конкретной jvm любым способом.Моды их => могли и просто написать classloader, который расшифровывает массив байтов при чтении классов. В случае дешифровки на уровне JVM затронуты будут все classloader: чтение класса в бинарном представлении (как обычный файл) выявит наличие шифрования и т.о. загрузка повалится.
Для привязки к конкретной JVM надо б гарантировать, что всякие средства вроде ASM не будут пытаться такие вот "привязанные к конкретной JVM классы" редактировать (иначе попросту завалится при попытке редактирования) или вообще пытаться свои генерировать. Естественно, моды в этом плане "хороши": могут использовать ASM (равно как и отражения) на любой чих.Это уже детали реализации. Думаю, для начала подойдёт некий рабочий концепт, который в принципе умеет что-то шифровать и расшифровывать. Или не расшифровывать, а проверять некие метки в самих классах. Т.е., привязывать конкретные классы к конкретной jvm любым способом.
> гарантироватьДля привязки к конкретной JVM надо б гарантировать, что всякие средства вроде ASM не будут пытаться такие вот "привязанные к конкретной JVM классы" редактировать (иначе попросту завалится при попытке редактирования) или вообще пытаться свои генерировать. Естественно, моды в этом плане "хороши": могут использовать ASM (равно как и отражения) на любой чих.
Не плоди сущности: в первую очередь, ты делаешь концепт в паблик. Кому надо - доработают его под себя, твоя же задача - показать самое важное - принцип, поэтому выкладывай всё как есть.Выложишь шифровщик в открытый доступ, и читеры зашифруют свои классы. Не выложишь -- админы проектов не смогут зашифровать свои моды. Нужно как-то определять админов проектов и давать шифровальщик только им или что-то еще придумать.
А если то же самое, только понятным языком? Что именно "но" и кто это на скрине, и что это должно означать?Есть в гравитЛаунчере у нас мини-фильтр, канал который доступен только владельцам проектов но:
Посмотреть вложение 54172
И майн с форжем можно выбрасывать, ибо asm либа отвалится. А нативные читы продолжат работать. К примеру подменим нативку из lwjgl. Через jni все прозрачно же будет.В общем, это всё придирки и мелочи.
@fereter, ты красавчик, что занялся защитой в джаве, но с текущим билдом разобрались, надо двигаться дальше.
Первое, что тебе надо сделать - полностью вырезать JVMTI. Насколько знаю, он отключается каким-то аргументом при билде. Второй шаг - шифрование классов: *.class-файлики передаются на вход зашифрованными, JVM их расшифровывает и запускает. Потребуется зашифровать все классы клиента и самой джавы, для этого напиши утилитку или скрипт, на вход которым передавай, например, путь к папке с клиентом, на выходе - отдельная папка с зашифрованными файлами. Это не позволит запускать чужие классы by-design, т.к. джава их просто не поймёт: после её внутренней попытки их расшифровать получит мусор.
А если перемешать расположение полей в JNIEnv и собрать все нативки с новыми хедерами? Тогда отвалятся и нативные читы на JNI.Через jni все прозрачно же будет
Как вариант. Но придется вести поддержку новых версий. Да и в модах типо комп крафт бывают нативки, внезапно. Все это пересобирать тоже.А если перемешать расположение полей в JNIEnv и собрать все нативки с новыми хедерами? Тогда отвалятся и нативные читы на JNI.
надо ловить трейс и проверять.
Добавил проверку стека на предмет gl11 и JVM_MonitorNotify. Добавил в версию с черными/белыми списками проверку на последний frame стека по белым спискам.0 проверок стека, а то что есть с JavaThread это не решение
Было 13 секунд. Стало 13 секунд.Когда публикаешь сравнения, пиши относительные результаты: было -> стало.
Протестировал на GTNH 2.0.7.5.оттестит на разных версиях
Форж отвалится.пошифровать классы
Почему? Если зашифрровать и его, то ничего не должно отвалиться.Форж отвалится.
Ну попробуй. Посмотрим как asm себя поведет.Почему? Если зашифрровать и его, то ничего не должно отвалиться.
[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При запуске 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)
С проверками не связано, компилировал без проверок и логирования -- все равно вылетало.
Кто знает с чем связано и как можно фиксить?
не дашь шифровальщик - напишут свой. главное знать ключ и алгоритми давать шифровальщик только им или что-то еще придумать.