Java模糊混淆

时间:2014-09-14 09:14:16

标签: java obfuscation

类似问题HereHere

我想这种情况开始时非常罕见,因此我承认它可能过于本地化了。

问题

public class bqf implements azj
{
    ...

    public static float b = 0.0F;

    ...

    public void b(...)
    {
        ...

        /* b, in both references below,
         * is meant to be a class (in the
         * default package)
         *
         * It is being obscured by field
         * b on the right side of the
         * expression.
         */
        b var13 = b.a(var9, var2, new br());

        ...
    }
}

错误是: cannot invoke a(aji, String, br) on primitive type float

可妥协的限制:

  • 无法重命名字段b。
  • 无法重命名或重构B类。

为什么

我正在修改一个混淆程序。对于不相关的[?],未知(对我来说)和不可妥协的原因,必须通过使用.class文件修补原始jar来完成修改。因此,重命名公共字段b或类b将需要修改大部分程序。因为所有类都在默认包中,所以重构类b将要求我修改引用b的每个类(大部分程序)。尽管如此,我还是打算进行大量修改,在字节码级别进行修改是很痛苦的。仅仅不足以保证重命名/重构。

可能的解决方案

  • 最明显的一个是重命名/重构。有数千个类,每个类都在默认包中。似乎我想要修改的每个java程序都有这种混淆。 :(

    无论如何,有时我会花时间去手动重命名/重构程序。但是当错误太多时(我曾经做过18,000次),这不是一个可行的选择。

  • 第二个显而易见的选择是在字节码中进行(通过ASM)。当修改很小或很简单时,有时这是可以的。不幸的是,只对那些我无法通过java编译的文件进行字节码修改(这是我们通常尝试做的大部分,但这是我通常尝试做的事情)。相比之下,这是非常缓慢的。

  • 有时我可以扩展类b,并在我修改过的类中使用它。显然,这并不总是有效,例如当b是枚举时。不幸的是,这意味着很多额外的课程。

  • 可以使用静态包装器方法创建一个类以避免模糊。我只想到了这一点。

  • 重新映射所有名称的工具(不是反混淆,只是唯一的名称),然后在您进行修改后取消映射它们。那会很好。如果它不存在,我应该制作一个。

  • 问题也可以通过强制java编译器要求关键字“this”来解决。

2 个答案:

答案 0 :(得分:2)

b.a(var9, var2, new br());

可以使用反射轻松重写:

Class.forName("b").getMethod("a", argTypes...).invoke(null, var9, var2, new br());
  

这个问题也可以通过一种方法来解决,迫使java编译器需要关键字"这个"。

我不会想到这会对静态成员有什么帮助。编译器必须要求我们限定所有内容 - 基本上不允许使用简单名称,除了本地人。

答案 1 :(得分:1)

在其他地方编写一个调用b.a()的辅助方法。然后你可以调用它。

注意:在Java中,惯例是将命名为B而不是b(也适用于bqf和aqz)并且如果已遵循问题不会显示出来。

真正的长期治疗方法不是将类放入默认包中。