How does DexGuard encrypt classes?
我想检查DexGuard的工作原理,但似乎没有免费的试用版。
DexGuard可以加密Android应用程序吗? 还是仅仅是混淆了代码? DexGuard加密如何工作? 如果您可以在反编译之前和之后从与DexGuard一起运行的示例应用程序中提供代码,那就太好了。
ProGuard提供名称混淆功能:它可以用简短,无意义的名称替换类,方法和字段的原始名称。 DexGuard还提供字符串加密和类加密。在这种情况下,术语"加密"可能会造成混淆,因为它们基本上是混淆性更强的类型。指定的字符串和类以某种故意复杂的加密形式存储,并在运行时使用应用程序必需使用的密钥和算法进行解密。在某些方面,Google Play市场可以为Android 4.1加密整个应用程序。然后,运行时环境以受控方式在应用程序执行之前对其进行解密。
(我是ProGuard和DexGuard的开发人员-如果您有兴趣,请随时与我们联系)
-
嗨!感谢您的回复!是的,我对DexGuard中的加密定义感到困惑。基本上,我的理解是加密使用秘密密钥来转换数据。但是,如果Android应用程序已加密,则Dalvik将无法理解该加密的应用程序,因为Dalvik不包含该应用程序的解密器。当然,除非将解密程序与密钥一起附加在应用程序内部。这样,该类将在由Dalvik运行之前由应用程序本身解密。这是DexGuard的工作方式吗?
-
我可以将DexGuard与Android 4.1的Google Play集成一起使用吗?另外,是否建议将DexGuard与Proguard一起使用?我在Proguards页面上注意到DexGuard不会预先验证类。如果我要使用DexGuard,该如何预备班级?谢谢! :D
-
正确。是的,从外部看,已处理的应用程序看起来仍然像其他任何应用程序一样。 Google Play仍然可以对其进行加密。不,您不需要结合使用ProGuard和DexGuard,因为DexGuard已经提供了ProGuard的功能。只有Java Micro Edition和Java 6才需要进行预验证,而Android则不需要。
-
谢谢,埃里克!我可以知道DexGuard何时发布吗?或者,您可以给我一个包含不同DexGuard版本发行日期的链接吗?我会推荐给我们的总裁,这样我们才能使用它。另外,我知道这是一个不同的话题,但是为什么仅在J2ME和Java 6上而不是在Android上才需要预验证?我对那个话题不是很了解。再次感谢!
-
Weve于2012年5月首次发布了DexGuard。
-
Android和Java的虚拟机和字节码完全不同。 Dalvik字节码不具有预验证信息,而Java字节码可能具有预验证信息。 Java虚拟机使用该信息来检查程序的结构是否正确。由于开发人员运行应用程序的方式不同,Android开发人员认为这不是必需的。因此,写出Dalvik字节码的DexGuard不需要它。
-
@ EricLafortune,DexGuard如何与Android的新ART实验运行时一起运行(如果有的话)?
-
由于我们在每次启动之前都会进行反射和解密,因此启动应用程序的开销是多少?
-
@EricLafortune我们可以谈谈DexGuard吗?如果有兴趣,请发送邮件至[email protected]
-
@EricLafortune您已经提到`Google Play市场可以为Android 4.1 . Does it mean that Google Play市场加密整个应用程序`可以加密我们的应用程序吗?
-
@EricLafortune我在应用程序中使用proguard。但是我意识到有人(或者可能是几个人)对我的apk进行了反向工程并更改了其中的关键部分。我想知道是否提供更新,proguard是否有可能为我的应用程序生成一个新的映射,以便此人以前确定的类名这次映射到另一个名称?我不希望在新版本中轻松识别相同的类。
-
应该使用什么配置来混淆dexguard中的类名称?
旧版本的DexGuard使用" DES"算法加密指定的类。后来它更改了" AES"算法。
对指定的类进行加密后,它将使用解密方法通过数据数组格式将加密的数据存储到另一个类中。 Dex中作为静态块的解密方法是使用控制流混淆和API隐藏进行混淆的clinit格式方法。因此,对解密方法进行模糊处理是有点困难的。在其他类中,将指定的类更改引用为反射操作码。每次运行APK时,加密类都会首先以静态方法解密。然后使用反射API将解密的类加载到dvm内存中。因此其他类可以正确引用指定的类。而已。我认为DexGuard是非常强大的混淆工具。如果每个功能混淆都适用于APK,则将花费大量时间来撤消整个真实程序。
尽管他们使用了加密一词,但似乎确实令人困惑。我之所以这么说是因为尽管它们可能会加密某些字符串/值...加密密钥也必须存储在应用程序中这一事实意味着它们在为代码提供"锁"的同时包装了"密钥"" 用它。