2

我目前使用 LVL 和 Proguard 的组合作为抵御盗版的第一道防线。

但是,资源字符串呢?例如,如果存在诸如“许可证检查失败”之类的资源字符串,那么盗版者是否只需将该资源 id 追溯到它在代码中的使用位置?事实上,如果字符串是诸如“请联系开发人员”之类的通用字符串,也是如此。

最好的方法是什么?

4

2 回答 2

12

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

  • 字符串资源文件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 调用)。

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

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

(我是 ProGuard 和 DexGuard 的开发者)

于 2012-06-24T15:27:17.397 回答
5

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

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

于 2016-12-21T00:12:23.427 回答