模糊资源字符串可能会泄露有关编程逻辑的过多信息

Mar*_*ark 1 obfuscation android proguard android-lvl android-resources

我目前使用LVL和Proguard的组合作为打击盗版的第一道防线.

但是,资源字符串呢?例如,如果存在类似"许可证检查失败"的资源字符串,那么盗版者是否只需要将该资源ID追溯回代码中使用的位置?事实上,如果字符串是像"请联系开发者"这样的通用字符,也是如此.

什么是最好的方法?

Eri*_*une 11

如果您定义资源字符串,您可能会在以下位置定义或使用它:

  • 字符串资源文件res/values/strings.xml,
  • 布局文件res/layout/*.xml,
  • 生成的资源文件R.java,
  • 你的java代码src/**.java.

编译后,资源字符串,其名称和整数代码最终出现在:

  • 资源文件resources.arsc(字符串,名称和代码),
  • 资源类R $ string.class(名称,代码),
  • 你编译的代码**.class(内联代码).

ProGuard将完全删除R $ string.class,但Android反编译器可以重建来自resources.arsc的所有信息.它仍然需要一些工作,但字符串可能确实暗示了代码的目的(以及某些API调用).

您可以通过加密/混淆代码中的字符串以及使用反射访问某些API来改进这一点,如Google的演示文稿Evading Pirates and Stopping Vampires中所述.

ProGuard针对Android DexGuard的闭源兄弟可以为您加密字符串(以及API调用和整个类),可能比您手动实现的更有效,并且不会增加源代码的负担.

(我是ProGuard和DexGuard的开发人员)

  • @ChuongPham 很有趣,DexGuard 开发人员没有在评论中回答您的问题 xD (2认同)

j2e*_*nue 5

当我想在 android 中隐藏重要的字符串时,我将它们放在 ac/c++ 库中。然后我使用 JNI 调用来检索它们。在 c 库中,我走得更远,我将字符串转换为十六进制,当我检索相同的字符串时,我再次将其从十六进制转换为整数。当黑客试图查看 c/c++ 库时,将很难找到您的秘密字符串(尤其是转换为十六进制时)。

这是一篇不错的文章以及如何开始这样做。