Как происходит обфускация на Java?

сегодня я столкнулся с запутанным классом (ну, много запутанных классов в банке), и у меня нет понятия о том, как делается такая запутанность.

пример:

  protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃)
    throws Exception
  {
    int ☃ = ☃.readableBytes();
    if (☃ < this.c)
    {
      ☃.b(0);
      ☃.writeBytes(☃);
    }
    else
    {
      byte[] ☃ = new byte[☃];
      ☃.readBytes(☃);

      ☃.b(☃.length);

      this.b.setInput(☃, 0, ☃);
      this.b.finish();
      while (!this.b.finished())
      {
        int ☃ = this.b.deflate(this.a);
        ☃.writeBytes(this.a, 0, ☃);
      }
      this.b.reset();
    }
  }

}

Как вы видите выше, все переменные параметров снежного человека. Как это можно исправить? Также, как это делается в первую очередь; как JVM может "обрабатывать" их и выполнять код без каких-либо проблем?

уточнить, я не собираюсь использовать этот код, это просто для образовательных целей. Я беру курс информатики в школе, так как мы Изучаем Java и говорим об ограничениях, таких как декомпиляции. Мне интересно узнать больше, поэтому я решил взглянуть на более крупные проекты, особенно на серверы. Этот фрагмент кода извлекается из сервер Spigot для Майнкрафт (игра) это вилка под Bukkit сервер для Minecraft это должно было быть открытым исходным кодом.

3 ответов


прежде всего, следует отметить, что это параметры, которые имеют этот Юникод, а не методы. Почему это так важно? Для параметров не обязательно указывать имена, так как они в основном индексируются ссылкой на номер. Однако его можно указать, и я предполагаю, что большинство Java-сред выполнения фактически не проверяют это имя, поскольку оно не требуется для выполнения. Напротив, имена классов, имена методов и имена полей, однако, необходимы.

о вас упоминая кран, кран действительно с открытым исходным кодом. Однако вы, скорее всего, декомпилировали класс, который изначально был с оригинального сервера Mojang Minecraft, который не является открытым исходным кодом и действительно запутан.

Edit: в случае, если вы хотите исследовать эти классы, я недавно нашел инструмент под названием Bytecode Viewer, который доступен вhttps://github.com/Konloch/bytecode-viewer Этот инструмент имеет несколько декомпиляторов, а также некоторые параметры для просмотра более байт-кода, как версия файла класса. - пример найденной функции содержит следующие данные байт-кода:

     <localVar:index=1 , name=☃ , desc=D, sig=null, start=L1, end=L2>
     <localVar:index=3 , name=☃ , desc=D, sig=null, start=L1, end=L2>
     <localVar:index=5 , name=☃ , desc=D, sig=null, start=L1, end=L2>

действительно, как видно, имя unicode было установлено одинаково, но это не имеет значения, поскольку в конце индексы (1,3,5) используются для ссылки на эти переменные.


protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃)

это недопустимо. Нельзя иметь несколько параметров с одинаковым именем. Возможно, вы не читаете текст unicode с правильным текстовым форматом.


ваш текстовый редактор показывает значение символа Юникода.

Я только что протестировал eclipse, и имена с символами unicode приемлемы.

    public String publicationXmlUrl(int \u9090currentPage) {

но запись со значениями не является:

   public String publicationXmlUrl(int ♥currentPage) {