【问题标题】:Can't recompile decompiled class files无法重新编译反编译的类文件
【发布时间】:2011-11-21 04:42:10
【问题描述】:

我有一点想要编辑的 Java(它是一个 Minecraft mod)我反编译了 .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;
              }
            }
          }

【问题讨论】:

  • 你编译的时候有没有把原来的库加到classpath中?
  • 就示例而言,您是否只想让我复制整个错误日志?另外:原始库?我知道编程基础知识和其他不相关的语言,但对 Java 几乎一无所知。不明白你的意思。这可以解释为什么我有问题。 . .
  • @zeel:不一定。只需显示一个错误类型的示例和导致它的代码。我们不知道您屏幕上的内容,因此无法正确诊断。
  • 添加了我得到的样本。
  • @zeel:您仍然没有显示实际代码。但是“switch (???)”不是一种有效的 Java。获得更好的反编译器。

标签: java decompiling recompile


【解决方案1】:

听起来原始的 Java 编译被混淆了。混淆器使用许多技巧来使逆向工程代码变得困难。例如,.class 文件中的方法和字段名称是 Java 源代码中的保留字(forif 等)是合法的。如果混淆器使用此类技巧,那么当您反编译 .class 文件时,Java 源代码是非法的,因为您不能将这些保留字用作方法或字段名称。

【讨论】:

  • 确实,这也是我发现的,混淆器的设计正是为了使这种逆向工程更加困难。实际上,与尝试重新编译反编译的源代码相比,修改底层字节码可能更幸运。
  • 没有一个代码看起来是混淆的,我见过混淆的代码,这看起来不像。
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多