0

我需要与具有许多相同类但名称不同的 jar 文件进行比较。

假设您正在寻找一个包含以下内容的类:

public class AStar {
    private int verbose = 0;
    private int maxSteps = -1;
    private int numSearchSteps;
    public ISearchNode bestNodeAfterSearch;

等等......,但它被混淆成

public class ard {
    private int fas = 0;
    private int asd = -1;
    private int ags;
    public ars arser;

你必须将第一个文件与其他 100 个文件进行比较才能找到这个文件。我的猜测是字节码比较,但我找不到它的工具或方法来比较两个 jar 中的所有文件。

4

5 回答 5

1

我过去曾这样做过,但问题是通常还需要大量手动工作来确定保留的信息类型,以及将其与哪些库进行比较。

例如,在一个案例中,我发现混淆的 Jar 向库类中添加了一个方法,该方法在我找到并解释它之前抛出了比较。另一个常见问题是混淆器会删除未使用的方法和接口,有时还会添加特定于混淆器的方法。

要想取得好成绩,不能只考虑个别班级。您需要匹配类之间的继承层次结构、接口和交叉引用,以便明确匹配大多数类,即使这样也并不总是成功的。

幸运的是,他们几乎从不重新排序或更改字段和方法的签名。否则,收集足够的信息来明确匹配类将是极其困难的。事实上,通常有一些类具有完全相同的方法和继承集(例如实现相同接口的两个类)。如果幸运的话,您将能够通过匹配来自第三类的引用来推断它,但这并不总是可能的。

无论如何,如果你愿意,我可以把我的代码发给你。它是为识别混淆应用程序中包含的开源库而设计的,但它也可能适用于匹配两个混淆应用程序。

于 2013-11-01T18:42:30.100 回答
0

您应该可以使用ASM完成此任务。它有很好的文档和相当多的示例。

您从类型和值构建一个内部模型,然后比较并吐出相同的类。

如果是你混淆了它,你应该能够得到映射......

于 2013-11-01T17:31:26.927 回答
0

在一般情况下,确定两个任意程序是否对所有输入都执行相同的操作是不可判定的(可归结为停止问题)。

对于以下内容,我假设混淆不会混淆类结构:它只会重命名字段、方法和类,并且可能会混淆字节码。

假设您正在寻找一个等同于 some class 的混淆类C。以下是您可以执行的一些搜索,按难度递增的顺序排列:

  1. 查找具有完全相同数量的字段和方法的所有类C
  2. 对于每个混淆类,计算它包含的字段类型集(但为简单起见,不包括指向其他​​混淆类的类型)。C可以过滤掉这组字段类型不是字段类型子集的所有类。
  3. 对方法签名执行相同的操作。
  4. 你可以走得更远,但它可能会变得相当复杂。

最后,最有效的方法取决于混淆器做了哪些具体的事情,而不是试图隐藏。

ASM是一个很好的文件解析和处理库.class

于 2013-11-01T18:01:18.390 回答
0

如果混淆只改变变量名,而不是变量顺序或任何编译器生成的字节码,您应该能够使用 ASM 或 Javassist 或其他字节码库来做到这一点。事实上,下面的列表可以使用常规的 Java 反射来完成。

如果满足以下条件,则两个类文件将是平等的候选者:

  1. 它们具有相同数量的方法
  2. A 类和 B 类中方法的参数签名之间存在 1 对 1 的映射关系
  3. 匹配方法也匹配标志(私有/公共、静态、抽象等)

那将是一场相当不错的比赛。除此之外,您可能还需要了解字节码的详细信息。字节码应该相似,但对常量池的引用可能会被打乱。你必须破译那些。例如,一类可能ldc #12,另一类可能ldc #34;如果事实证明 A 类中的 #12 与 B 类中的 #34 相同,则它们匹配(至少为此)。

如果混淆器重新连接私有方法上的参数顺序,则可能很难轻易检测到匹配项。尽管如此,也许您需要做的只是将其缩小到合理数量的候选者,因此将上面的列表应用于公共和受保护的方法可能就是您所需要的。

于 2013-11-01T18:11:50.607 回答
0

我使用 Beyond Compare 来比较 jar 文件:

http://www.scootersoftware.com/

您可能有一些运气使用他们的附加文件格式来比较 .class 文件(反编译)

http://www.scootersoftware.com/download.php?zz=kb_moreformats_win

于 2013-11-01T18:17:22.823 回答