Не могу перекомпилировать декомпилированные файлы классов - PullRequest
1 голос
/ 21 ноября 2011

У меня есть немного Java, который я хочу редактировать (это мод для Minecraft) Я декомпилировал файлы .class (с помощью jd-gui), отредактировал то, что хотел, затем попытался перекомпилировать (с помощью javac).

Я получил сотни ошибок. Я только отредактировал несколько строк, поэтому попытался скомпилировать файлы .java, которые не были отредактированы, точно так же, как они были из декомпилятора. То же самое, сотни ошибок.

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

Вот пример того, что я получаю:

ReiMinimap.java:451: illegal start of expression
              switch (???)
              ^
ReiMinimap.java:451: ';' expected
              switch (???)
                    ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                      ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                        ^
ReiMinimap.java:451: illegal start of expression
              switch (???)
                         ^
ReiMinimap.java:452: illegal start of expression
              {
              ^
ReiMinimap.java:452: : expected
              {
               ^
ReiMinimap.java:453: ';' expected
              case 49:
                     ^
ReiMinimap.java:453: ')' expected
              case 49:
                      ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                    ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                     ^
ReiMinimap.java:454: illegal start of expression
                this.allowCavemap = true;
                                  ^
ReiMinimap.java:454: ';' expected
                this.allowCavemap = true;
                                   ^
ReiMinimap.java:456: orphaned case
              case 50:
              ^
ReiMinimap.java:308: 'try' without 'catch' or 'finally'
    try { if (paramMinecraft == null);
    ^
ReiMinimap.java:499: illegal start of type
      else
      ^
ReiMinimap.java:499: ';' expected
      else
          ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
        ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
            ^
ReiMinimap.java:501: ';' expected
        this.chatWelcomed = true;
             ^
ReiMinimap.java:501: illegal start of type
        this.chatWelcomed = true;
                          ^
ReiMinimap.java:501: <identifier> expected
        this.chatWelcomed = true;
                           ^

И часть кода:

if ((!this.chatWelcomed) && (System.currentTimeMillis() < this.chatTime + 10000L))
      {
        Object localObject1;
        for (localObject2 = this.chatLineList.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject1 = (ahe)((Iterator)localObject2).next();

          if ((localObject1 == null) || (this.chatLineLast == localObject1)) break;
          Matcher localMatcher1 = Pattern.compile("§0§0((?:§[1-9a-d])+)§e§f").matcher(((ahe)localObject1).a);
          while (localMatcher1.find())
          {
            this.chatWelcomed = true;
            for (??? : localMatcher1.group(1).toCharArray())
            {
              switch (???)
              {
              case 49:
                this.allowCavemap = true;
                break;
              case 50:
                this.allowEntityPlayer = true;
                break;
              case 51:
                this.allowEntityAnimal = true;
                break;
              case 52:
                this.allowEntityMob = true;
                break;
              case 53:
                this.allowEntitySlime = true;
                break;
              case 54:
                this.allowEntitySquid = true;
                break;
              case 55:
                this.allowEntityLiving = true;
              }
            }
          }

1 Ответ

2 голосов
/ 21 ноября 2011

Похоже, оригинальная компиляция Java была запутана. Есть много хитростей, которые обфускаторы используют, чтобы затруднить обратный инжиниринг кода. Например, допустимо иметь имена методов и полей в файлах .class, которые являются зарезервированными словами в исходном коде Java (for, if и т. Д.) Если обфускатор использует такие приемы, то при декомпиляции файла .class , источник Java недопустим, потому что вы не можете использовать эти зарезервированные слова в качестве имен методов или полей.

...