gpt4 book ai didi

Java Obscured混淆

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:48 24 4
gpt4 key购买 nike

类似问题:HereHere

我想这种情况一开始就很不常见,所以我承认对于 SO 来说它可能太局限了。

问题

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());

...
}
}

错误是: 无法在原始类型 float 上调用 a(aji, String, br)

可妥协的限制:

  • 字段 b 不能重命名。
  • 不能重命名或重构 b 类。

为什么

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

可能的解决方案

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

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

  • 第二个显而易见的选择是在字节码中执行(通过 ASM)。有时这没关系,当修改很小或足够简单时。不幸的是,相比之下,仅对我无法通过 java 编译的文件(这是大部分文件,但这是我通常尝试做的)进行字节码修改速度慢得令人痛苦。

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

  • 有可能创建一个带有静态包装器方法的类以避免晦涩难懂。我刚想到这个。

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

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

最佳答案

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

可以很容易地使用反射重写:

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

The problem would also be solved with a way to force the java compiler to require the keyword "this".

我不认为这对静态成员有什么帮助。编译器必须要求我们限定一切——基本上,除了本地人之外,完全不允许简单的名字。

关于Java Obscured混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25831784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com