【问题标题】:Dealing with labels in decompiled code处理反编译代码中的标签
【发布时间】:2011-06-14 18:02:27
【问题描述】:

我希望返回一个项目,该项目我之前丢失了源代码,但设法从用户​​那里获得了编译版本。我已经使用了一些反编译器来缓慢地将代码重新拼凑起来,但最终还是被两个“标签”卡住了。

在过去三天尝试了一系列反编译器后,却发现他们中的大多数人发现这些 sn-ps 更加困难,我作为最后的手段来到这里。我知道这是一个相当大的要求,特别是因为缺少上下文并且它的存在是不寻常的,但如果有经验的人能够理解这一点,那么幸运的话。

以下 sn-p 具有“label337”,我不知道如何解决。我知道它们是某种指针,但我没有想到如何重新排列代码。 JD-GUI 生成的输出。 http://pastebin.com/mVNksm13

以下 sn-p 有“label711”,我也不知道该怎么处理。尽管非常脱离上下文,但它是一个完整的条件,尽管我不知道它会有多大意义。 JD-GUI 生成的输出。 http://pastebin.com/5MLFxHPb

我想再次重申,我知道这是一个多么伟大的请求,但是在厌倦了 Java 或反编译器的视线之后,我来到这里,希望能比我已经了解的情况更进一步地阐明这种情况知道。

编辑: 我试图反编译的 jar 在很大程度上依赖于我可以访问的另一个 jar。在反编译期间以某种方式指向类所依赖的 jar 会产生更好的输出吗?我尝试在反编译器中搜索如何链接到此类依赖项,但一无所获。

【问题讨论】:

    标签: java label decompiling jad


    【解决方案1】:

    如果我正确理解您的问题,您希望重构粘贴的代码。中断就像 GOTO 语句。重构此代码的最简单方法是使用方法。

    你有一个很长的 if/else 语句,如果移到一个方法中,你可以使用 return 语句。这是您的第一个示例的缩写形式

    for (final TileInfo t : this.myTiles) {
      if (rsi != null) {
        //do something
      } else if (rso != null) {
        //if some condition; break label337;
      }else{
        //do something else
      }
    }
    label337: for (TileInfo t : fallenTiles) {         
    }
    

    创建新的方法来执行你的逻辑,而不是这个

    private void CheckMyConditionsMethod(MyParameters obj){
        if (rsi != null) {
            //do something
        } else if (rso != null) {
            //if some condition return;
        }else{
            //do something else
        }
        fallenTilesMethod(fallenTiles);
    }
    
    private void fallenTilesMethod(ArrayList<TileInfo> fallenTiles){
       for (TileInfo t : fallenTiles) {         
       }
    }
    

    现在您的代码缩短为

    for (final TileInfo t : this.myTiles) {
          CheckMyConditionsMethod(myobj);
    }
    

    同样在你原来的情况下,你很可能有一个编译错误“标签 label337 is missing”,因为它是在使用后声明的。使用方法也将有助于消除该错误。

    【讨论】:

    • 如果是这种情况,标签所指的代码块是什么。它是从标签之后一直到下一个 } 开始的代码块,还是仅引用它之前的 for 循环?
    • 标签开始你的第二个 for 语句,break 跳转到代码中的那个点并继续
    • 在这种情况下,移动 for (TileInfo t : fallTiles) 循环来替换两个 break label337 不是问题;声明,当然是添加大括号还是我遗漏了什么?
    • 在我上面给出的情况下,你需要做的就是用'return'替换'break label337'语句。通过这样做,您退出该方法并进入第二个 for 循环,无论如何您都会中断
    • 让我自相矛盾一下,我刚刚阅读了文档,我已经有一段时间没有使用标签了。如果在休息时使用,它将跳过标记代码的结束括号。让我编辑一下上面的代码
    【解决方案2】:

    看起来你的反编译器搞砸了,把标签放在了错误的位置。至少对于第一个示例,如果您将 label337 移动到发生中断的最外层 for 循环,它应该可以正常编译并执行您期望的操作。对于另一个,您必须将 if 块修改为接近最后一个中断才能进行编译。

    这里有一个关于如何使用带标签的中断的简短教程:http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 2015-12-21
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多