【问题标题】:Does proguard work to obfuscate static string constants?proguard 是否可以混淆静态字符串常量?
【发布时间】:2012-04-30 11:52:40
【问题描述】:

proguard 会混淆静态字符串常量吗?

【问题讨论】:

标签: java android obfuscation proguard


【解决方案1】:

ProGuard 不会混淆字符串常量,如其FAQ 中所述。它最近专门针对 Android 的闭源兄弟DexGuard 提供了额外的应用程序保护技术,例如字符串加密和类加密。

(我是 ProGuard 和 DexGuard 的开发者)

【讨论】:

  • +1 DexGuard 是用于保护应用程序中的字符串的商业产品。我个人使用移位操作,但不提倡对于必须经得起攻击者的值。
  • @Syntax 对于必须经得起攻击者的东西,我根本不提倡混淆。如果这些字符串那么重要,它们甚至不应该出现在您的代码中。我还没有看到一个字符串加密不容易破解的 Java 混淆器,而且我已经看过不少了。
  • 正如我所说的:P 我不提倡对不允许黑客访问的任何内容进行混淆处理。我对 Android 计费 API 的公钥进行了位移,我不太担心人们是否会破解混淆并可以访问它。
  • 可以做些什么来避免所有类中的显式字符串,而不仅仅是在定义它们的地方“翻译”?我的意思是:A 类定义了 public static String MYCONS="no session" 但这实际上是您在 B 类中看到的,而不是 someView.setText(A.MYONCS)
  • ProGuard 非常耗时,有什么方法可以在不构建 apk 的情况下运行应用程序并查看错误,因为我面临这个问题,它在构建 apk 中工作,而在发布 apk 中没有任何工作所以我不知道如何捕捉错误
【解决方案2】:

不,ProGuard 不加密字符串常量 (Proguard FAQ Link)

但有一些商业产品可以帮助您。 我会推荐Stringer Java Obfuscator,因为它具有检查调用上下文和完整性控制功能,这使得逆向工程尽可能困难。恕我直言 Stringer 是当今市场上最好的 Java 和 Android 字符串加密器。

另见Allatori Java Obfuscator

注意我是 Licel LLC 的首席执行官。 Stringer Java 混淆器的开发者。

【讨论】:

  • Stringer Java 混淆器不是免费的
  • @sarah.ferguson 商业产品本质上不是免费的,是的。
【解决方案3】:

ProGuard 做什么(如果配置正确的话)是内联字符串常量。把它们混淆起来并没有多大意义,想想看,一个字符串常量可以用来向用户表示一条消息,如果它被混淆了有什么好处呢?

【讨论】:

  • Proguard 用于使编译后的代码难以阅读和理解,如果方法的每个点都向用户显示纯文本用户消息,我认为每一行代码都变得非常容易理解。如果在像我这样的情况下,我 log.debug("fun()") 每个方法的开始都显示在编译的代码中,那么剥离方法名称是非常没用的!所以这是个大问题……
  • @sarah.ferguson 你也可以configure ProGuard to strip out the log calls
【解决方案4】:

根据我对手册中混淆选项的阅读,答案是否定的。

理论上可以对字符串文字进行混淆,但有必要使用特殊的类加载器在从类文件中读取字符串文字时对其进行去混淆处理。这会很棘手。最重要的是,它并没有取得太大的成就,因为有人可以通过运行带有 Java 调试器的应用程序来轻松恢复原始字符串。

【讨论】:

  • 您不必使用自定义类加载器,您只需将函数插入到类中即可在运行时解读字符串。这就是 Zelix Klassmater 所做的。当然,如果您知道自己在做什么,就很容易绕过,但无论如何,混淆只是为了阻止临时用户。
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多