Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

null

Тема в разделе "Обсуждение Minecraft", создана пользователем FedorNogopletov, 19 янв 2014.

Статус темы:
Закрыта.
  1. Konstantin773

    Konstantin773 Старожил Пользователь

    Баллы:
    153
    Skype:
    Konstantin77313
    Имя в Minecraft:
    K773
    Присланный с сервера байткод можно выполнить, но как новый класс из нового загрузчика классов. (классы в Java неьзя перезагружать без debug-режима)
    А патчить классы можно так:
    Код:
    package fml.plugin;
    
    import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
    import java.util.Map;
    
    public class Plugin
      implements IFMLLoadingPlugin
    {
      public String[] getLibraryRequestClass()
      {
        return null;
      }
      public String[] getASMTransformerClass()
      {
        return new String[] { "fml.plugin.Transformer" };
      }
      public String getModContainerClass()
      {
        return null;
      }
      public String getSetupClass()
      {
        return null;
      }
      public void injectData(Map<String, Object> data) {}
    }
    
    Код:
    package fml.plugin;
    
    import java.io.PrintStream;
    import net.minecraft.launchwrapper.IClassTransformer;
    
    public class Transformer
      implements IClassTransformer
    {
      public Transformer()
      {
         ...................
      }
      public byte[] transform(String name, String transformedName, byte[] bytes)
      {
        ///name -название класса до деобфускации
       ///transformedName - название класса после деобфускации
       ///bytes - байткод
       ///здесь можно патчить байткод (как через ASM, так и читая классы, например, из зашифрованного файла и возвращая новый байткод
      }
      private static void dbg(String str)
      {
        System.out.println(str);
      }
    }
    
    
    Manifest-Version: 1.0
    FMLCorePlugin: fml.plugin.Plugin

    Но стоит учесть, что трансформеров в Forge достаточно много и не факт, что ваш сработает самым последним (или самым первым). Для этого существуют аннотации типа @SortingIndex(int) и другие.

    Но смысла патчинга почти нет, т.к. классы дампить из JVM не так сложно. Спасет только от большей части читеров.

    P.S: ASM не лучший вариант для работы с байткодом.
     
    Последнее редактирование: 2 авг 2014
  2. Хостинг MineCraft
    <
  3. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    А зачем перезагружать классы? Можно просто прислать пакет и имя класса, а также указать, какой метод в этом классе надо выполнить (Reflection в помощь). Вот и всё. Единственный способ обхода такой защиты, который мне приходит в голову - это перехват получаемого байт-кода, поиск части, отвечающей за ответ серверу (а она может быть всегда разная и находиться в любой точке класса), и выполнение только оной.
    P.S. У меня есть ещё идея, как можно заставить сервер/клиент выполнять любой код, но я пока не нашёл мода, в пакете которого передавался бы объект, а на принимающей стороне вызывался какой-либо метод из экземпляра полученного объекта.
     
  4. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    По поводу объекта - используя Json, сериализируй, посылай String и десириализируй, а мод - DropChanger.
    Но что мешает выпилить, допустим, метод выполнения кода на стороне клиента?
     
  5. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    В передаваемый байт-код я могу добавить код, например, для отправки на какой-то сайт рандомного числа. Если выполнение кода будет вырезано, то и число не отправится. Сервер будет проверять, получал сайт число или нет, если в течении 10 секунд никакого числа не было, то игрока кикает с сервера.
     
  6. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Я подчеркиваю:
    Т.е. ответить на пакет - это не проблема, ведь код непосредственно выполнения можно выпилить, а пакет пускай и дальше отвечает.
     
  7. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Ответ может быть всегда разный. Сегодня, например, я требую отправить число на сайт, а завтра уже мне нужен будет скриншот и т.д. Ответ не содержится в обработчике пакета, он содержится в отсылаемом коде и всегда находится в разных местах. Ещё код перед отправкой можно обфусцировать и т.д. Клиент никогда не будет знать, какой код он получит и что с ним надо будет делать.
    Вот пример:
    Код сегодня:
    Код:
    public void start()
    {
         sendIntToURI(new URI("http://test.ru/test.php?int=" + Minecraft.getMinecraft().theWorld.getTime());
    }
    
    Код завтра:
    Код:
    public void start()
    {
         Thread timeSendingThread = new Thread()
         {
               public void run() {while(true) sendIntToURI(new URI("�������p�����������������������p����������" + Minecraft.getMinecraft().thePlayer.getName());}
          };
         timeSendingThread.start();
         timeSendingThread.setDaemon(true);
    }
    
     
  8. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Но как же... деобфусцировать уже на стороне клиента нужно чем-то/относительно какого-то кода, или я ошибаюсь?
     
  9. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Деобфускатор можно впихнуть в отсылаемый код.
     
  10. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Ели он не будет обфусицированн, его можно будет точно так же использовать для получения деобфусцированного кода.
     
  11. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Но пока человек поймёт, как и что устроено в новом коде, 10 секунд сто раз успеют пройти, а следующие пакеты с кодом могут быть уже другими. Я уже придумал, как всё можно организовать, если кому-то нужна будет такая системка, то могу написать (для 1.7.10).
    P.S. Генерация кода будет выполняться при помощи ASM.
     
  12. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Это будет полезно в случае с сотнями шаблонов, хотя умелый программист может попросту отловить/проанализировать и запилить "автоответчик", тем более, что пакеты будут высылаться каждые 10 секунд. Как-то оно дыряво звучит.
     
  13. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Не каждые 10 секунд, а только тогда, когда потребуется.
     
  14. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Это будет решаться выполнением данного кода в сэндбоксе.
    Не стоит придумывать велосипед.
     
  15. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    SecurityManager? Интересно...
     
  16. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Нет, SecurityManager это слишком топорно, код выполняется именно в сэндбоксе - виртуальной копии нормального клиента.
     
  17. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Это как вообще? Есть какая-нибудь документация?
     
  18. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Нет никакой. Это не фича джавы, это самописный велосипед.
    Служил мне в качестве от отладчика для рантайм патчинга самого форджа, пока я не вспомнил что можно просто дампануть классы чтобы получить их в том виде в каком я хотел.
     
  19. sashabelii

    sashabelii Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    sashabelii
    Тогда как это решит отлов исходного кода пакетов?
    Иными словами, что представляет из себя сэндбокс?
     
  20. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    А нам не нужен исходный код. Суть присланного кода - проверить с помощью чего-либо клиент и отослать пакет на сервер. Таким образом наша задача - создать копию нормального клиента, запустить её, и отправлять присланный код ей.
    Самый простой способ - тупо запустить копию в отдельном процессе и передавать ей копии всех пакетов присланных патчненной копии.

    Либо вариант 2: Для тех кому вариант 1 кажется слишком сложным.
    Присланный код должен ведь что-то проверять. Просто пилим чит который анализирует пакеты и выводит инфу о них в отдельное окно. Либо собственно тогда уж чит работающий только с пакетами. Такой чит нереально запалить никакими проверками, не зная пекеджа чита, а его можно менять когда захочется.

    А вообще фигня в том что присланный код должен что-то проверять, но вот проверять ему нечего ведь почти. Файлы легко отресторить к начальному виду после загрузки майнкрафта. Таким образом надо ещё напилить кучу проверок которые как-то должны проверять майн на валидность.

    Короче отправка скриншотов с клиента на сервер звучит и то логичнее чем эта хрень.
    Правда это пока вам туда тысячу картинок с ***ми не зальют.
     
    Последнее редактирование: 2 авг 2014
  21. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Только вот серверу надо как-то знать адреса на которых хранятся скрины чтобы их можно было проверить. Так что ничего не мешает серверу отправить тысячу линок на ***цы, пусть админы порадуются.
    Под звёздочками - МПХ.
     
Статус темы:
Закрыта.

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