DexGuard 如何加密类?

Posted

技术标签:

【中文标题】DexGuard 如何加密类?【英文标题】:How does DexGuard encrypt classes? 【发布时间】:2012-10-26 02:04:45 【问题描述】:

我想查看 DexGuard 的工作原理,但它似乎没有免费试用版。

DexGuard 可以加密 android 应用程序吗?或者它只是混淆了代码? DexGuard 加密如何工作?如果您能提供在反编译前后使用 DexGuard 运行的示例应用程序的代码,那就太好了。

【问题讨论】:

【参考方案1】:

ProGuard 提供名称混淆:它可以用简短、无意义的名称替换类、方法和字段的原始名称。 DexGuard 额外提供字符串加密和类加密。在这种情况下,术语加密可能会令人困惑,因为这些基本上是更激进的混淆类型。指定的字符串和类以某种故意复杂的加密形式存储,并在运行时使用应用程序必须可用的密钥和算法进行解密。在某些方面类似,Google Play 市场可以为 Android 4.1 加密整个应用程序。然后,运行时环境以受控方式在应用程序执行之前对其进行解密。

(我是 ProGuard 和 DexGuard 的开发者——如果您有兴趣,请随时与我们联系)

【讨论】:

嗨!感谢您的回复!是的,我对 DexGuard 中的加密定义感到困惑。基本上,我的理解是加密使用密钥转换数据。但是,如果 Android 应用程序被加密,Dalvik 将无法理解加密的应用程序,因为 Dalvik 不包含应用程序的解密器。当然,除非在应用程序中附加了解密器和密钥。这样,该类将在由 Dalvik 运行之前由应用程序本身解密。这就是 DexGuard 的工作原理吗? 我可以将 DexGuard 与 Google Play 的 Android 4.1 加密一起使用吗?另外,是否建议将 DexGuard 与 Proguard 一起使用?我在 Proguard 的页面上注意到 DexGuard 不会预先验证类。如果我要使用 DexGuard,我该如何预选课程?谢谢! :D 正确。是的,从外部看,已处理的申请仍然与任何其他申请一样; Google Play 仍然可以对其进行加密。不,您不需要结合 ProGuard 和 DexGuard,因为 DexGuard 已经提供了 ProGuard 的功能。只有 Java Micro Edition 和 Java 6 需要预验证,Android 不需要。 Android 和 Java 的虚拟机和字节码完全不同。 Dalvik 字节码没有预验证信息,而 Java 字节码可能有预验证信息。 Java 虚拟机使用这些信息来检查程序是否构造良好。由于应用程序的运行方式不同,Android 开发人员认为这没有必要。所以写出 Dalvik 字节码的 DexGuard 不需要它。 @EricLafortune,DexGuard 如何使用(如果有的话)Android 的新 ART 实验运行时?【参考方案2】:

旧版本的 DexGuard 使用“DES”算法加密指定的类。后来它改变了“AES”算法。 加密指定类后,将加密后的数据以数据数组的形式,以解密的方式存储到另一个类中。 Dex中作为静态块的解密方法是使用控制流混淆和API隐藏进行混淆的clinit格式方法。所以对解密方法进行去混淆处理就有点麻烦了。在其他类中,将指定的类更改引用到反射操作码。每次APK运行时,加密的类都会先用静态方法解密。解密后的类将使用反射 API 加载到 dvm 内存中。因此其他类可以正确引用指定的类。而已。在我看来,DexGuard 是一个非常强大的混淆工具。如果每个功能混淆都适用于 APK,那么你将花费大量时间来反转整个真实程序。

【讨论】:

【参考方案3】:

虽然他们使用了加密这个词,但似乎真的是混淆了。我这么说只是因为尽管它们可能会加密某些字符串/值……事实上,加密密钥也必须存储在应用程序中,这意味着它们为代码提供“锁”,同时打包“密钥” " 和它。

【讨论】:

以上是关于DexGuard 如何加密类?的主要内容,如果未能解决你的问题,请参考以下文章

使用 dexguard 加密时,在运行时加载本机库需要更多时间

我可以使用 dexguard 生成未签名的 APK 吗?

使用 DexGuard 混淆动态加载的类

如何防止 Dexguard 混淆 android studio 中的资源文件夹?

如何使用 Dexguard 混淆清单文件中引用的类?

DexGuard 篡改和环境检测有用吗?