【问题标题】:ProGuard obfuscation variable naming, how to avoid local and param prefixes?ProGuard混淆变量命名,如何避免local和param前缀?
【发布时间】:2011-10-06 15:37:01
【问题描述】:

我正在尝试使用 ProGuard 混淆 Spring Web 应用程序。我想保留类和方法的名称,尤其是那些用作 spring bean 的名称。

但是 ProGuard 将局部变量重命名为 local[class name],例如,如果我有一个 User 对象,它会将局部变量重命名为 localUser。它还将方法参数重命名为param[Class name],例如,如果我有一个用户参数,则混淆方法中的变量名称变为paramUser。因此,混淆后的代码变得非常可读。

我想防止 ProGuard 使用本地和参数前缀以及类名。例如,我希望它使用x1 而不是localUser。我检查了配置选项,但找不到如何操作。

【问题讨论】:

  • 我大量使用 ProGuard;但是当我检查了混淆的类时,所有混淆的名称都会系统地重命名为 1 或 2 个字母(无论它们的上下文如何)。我没有看到您所描述的那种命名方案的证据,这让我认为他们可能是您指定的某个配置选项导致它。
  • 我保留了一些类和方法名。这就是为什么某些类和方法名没有转换为 a、b 等的原因
  • 您是否设法完全混淆了您的应用程序,因为我的 webApplication 正面临 Spring 配置的噩梦 ..

标签: java spring proguard


【解决方案1】:

变量x1 不会提供比paramUser 更多的信息,因为查看的代码是:

public void foo(User x1)
{
    ...
}

除非您的方法真的很长,否则任何阅读该方法的人都不会很难记住它是User 类型的参数,这就是paramUser 所说的全部内容。是的,可读性有所不同,但我不会说值得担心,就个人而言 - 如果有人投入足够的时间来反编译您的代码,那么像这样的非常小的差异不太可能阻止他们。如果类名也被混淆了,那么 IMO 会产生更大的差异。

【讨论】:

  • 你是对的,但我只是想让它更难阅读。你知道更好的 Spring bean 混淆解决方案吗?我的意思是混淆类和方法名,而不会陷入 Spring 应用程序配置的噩梦。
  • @Serkan:我不知道有更好的解决方案,但如果您的 Spring 配置是 XML 格式,我希望自动修改它以使用 Proguard 提供的新混淆名称是可行的。
  • proguard 以不尊重导致反射故障的 java bean 约定的方式混淆了 getter 和 setter。从混淆中排除每个spring bean有点愚蠢,特别是当很多层大量使用spring注入时
【解决方案2】:

ProGuard manual > Troubleshooting > 处理后的意外观察 > 变量名没有被混淆

如果你混淆了局部变量和参数的名称 代码看起来没有混淆,因为它们可疑地类似于 它们类型的名称,可能是因为您使用的反编译器 正在使用这些名称。 ProGuard 的混淆步骤 确实完全删除了原始名称,除非您明确保留 LocalVariableTable 或 LocalVariableTypeTable 属性。

【讨论】:

  • 感谢您的澄清。
【解决方案3】:

您所描述的命名方案看起来像 Java 编译器跳过 LocalVariableTable 时 JD 重新生成的名称(请参阅 javac -g:var)。对我来说,这不是 ProGuard 的错误。

为了更有效地混淆您的应用程序,

  • 尽可能尝试将“protected”替换为“private”:ProGuard 将用短名称替换类、方法和字段名称,
  • 尝试在您的代码中使用匿名类,
  • 并尝试将您的算法拆分为大量类,以使对执行流程的理解更加复杂。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多