如何使apk安全。防止反编译

时间:2011-06-04 06:57:36

标签: android apk

您好 我正在为公司开发一个应用程序,我们的应用程序包含一个包含个人信息的sqlite数据库,我们希望保护它。 我们怎样才能保护它。因为我很容易反编译,因为我自己做了。 所以现在的问题是如何保护apk?以及如何在手机上安装应用程序后保护手机中的数据库。

8 个答案:

答案 0 :(得分:32)

基本上,有5种方法可以保护您的APK正在破解/撤消/重新打包:

1。隔离Java程序

最简单的方法是让用户无法访问Java Class程序。这是最基本的方式,它有多种具体的方法来实现这一目标。例如,开发人员可以将密钥Java类放在服务器上,客户端通过访问服务器的相关接口获取服务,而不是直接访问Class文件。因此,黑客无法反编译类文件。目前,通过接口提供的标准和协议服务越来越多,如HTTP,Web Service,RPC等。但是有很多应用程序不适合这种保护。例如,独立程序中的Java程序无法隔离。

2。加密类文件

为了防止类文件被直接反编译,许多开发人员将加密一些关键的Class文件,例如注册号,序列号管理和其他相关类。在使用这些加密类之前,程序需要首先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。

开发人员经常通过自定义的ClassLoader类加载加密类(由于安全性,Applet不支持自定义的ClassLoader)。 Customed ClassLoader将首先找到加密类,然后解密它们。最后将解密的类加载到JVM。 Customed ClassLoader是这种保护方法中非常重要的一个类。因为它本身没有加密,所以它可能是黑客的第一个目标。如果已经克服了相关的解密密钥和算法,则可以很容易地解密加密的类。

3。转换为本机代码

将程序转换为本机代码也是防止反编译的有效方法。因为本机代码通常很难被反编译。开发人员可以将整个应用程序转换为本机代码,也可以只转换关键模块。如果只是转换模块的关键部分,当Java程序使用这些模块时,它将需要JNI技术来调用。在使用此方法保护Java程序时,它放弃了Java的跨平台功能。对于不同的平台,我们需要维护不同版本的本机代码,这将增加软件支持和维护工作量。但对于某些关键模块,有时这种解决方案通常是必要的。为了保证这些本机代码不会被修改或替换,开发人员通常需要对这些代码进行数字签名。在使用这些本机代码之前,开发人员通常需要对这些本地代码进行身份验证,以确保黑客不会更改这些代码。如果签名检查通过,那么开发人员可以调用相关的JNI方法。

4。代码混淆

代码混淆是重新组织和处理类文件,使得处理过的代码与未处理的代码完成相同的功能(语义)。但是混淆的代码很难被反编译,即反编译的代码很难理解,因此反编译人员很难理解真正的语义。从理论上讲,如果黑客有足够的时间,混淆的代码可能仍然会被破解。甚至有些人正在开发去混淆工具。但从实际情况来看,由于混淆的多样化发展,混淆理论的成熟,混淆的Java代码可以很好地防止反编译。

5。在线加密

APK Protect是APK的在线加密网站,但自2013年以来,活动显然已停止使用。它提供了Java代码和C ++代码保护,以实现反调试和反编译效果。

我最初建议您使用最后一种方法,因为它可以为您节省更多时间。根据我的经验,操作非常简单,不会花很长时间。

答案 1 :(得分:8)

使用Jellybean现在已成为可能。

$ openssl enc -aes-128-cbc -K 000102030405060708090A0B0C0D0E0F 
-iv 000102030405060708090A0B0C0D0E0F -in my-app.apk -out my-app-enc.apk

$ adb install --algo 'AES/CBC/PKCS5Padding' --key 000102030405060708090A0B0C0D0E0F 
--iv 000102030405060708090A0B0C0D0E0F my-app-enc.apk
        pkg: /data/local/tmp/my-app-enc.apk
Success

请阅读以下博文,了解更多details

答案 2 :(得分:5)

如果这是不能落入用户手中的秘密信息,则无法保护它。从根本上说,不可能将信息放在设备上(代码或数据),让应用程序访问它,但不允许有设备的人访问该信息。

从安全的角度来看,加密信息是没有意义的,因为你的应用程序必须包含解密它才能使用它所需要的东西,并且一个充满动力的攻击者总能提取它并自己解密它。 / p>

所有你能做的就是让访问这些信息变得更加烦人和耗时,这只有在没有那么多需要保密的情况下才有用。这就是使用proguard来混淆你的.apk文件所能做到的。

答案 3 :(得分:4)

你考虑过sqlite加密吗?请参阅此主题 - sqlite encryption for android

至于保护.apk,请尝试使用proguard对代码进行模糊处理。见http://developer.android.com/guide/developing/tools/proguard.html

答案 4 :(得分:3)

您可以在http://www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect阅读我的帖子。添加了APK Protect的保护外壳的APK似乎无法反编译。我的意思是,加密方法非常先进。即使是黑客大师也需要很长时间才能破解它。

答案 5 :(得分:3)

您可以尝试'Anti Decompiler(Android)试用版

https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial

它让Proguard没有:

  • 隐藏所有const值(字符串,字符),你永远不会在你的apk文件中看到像“my key”,“my val”...这样的明文。
  • 模糊文件名,在AndroidManifest.xml中引用
  • 在源代码中添加假代码。强大的反编译器喜欢的事件:dex2jar,jd-gui,...无法完全反转你的apk文件。大多数功能都会显示注释“错误”。

=====

  • 转换后,如果你给某人你的源项目,那么几乎不可能阅读和理解。
  • 此解决方案不排除Proguard,您可以将它们组合在一起。 (函数,字段Proguard的混淆优于此解决方案的混淆功能)

答案 6 :(得分:1)

首先,制作永远无法修改和使用的apk。我通过服务器的温度检测来做到这一点。我使用根检查模拟器检查。然后在重要的活动上,它在每次创建和恢复时检查根和模拟器,在暂停时删除重要数据,太好了。现在加密数据并将许可证放置到服务器,使用 SSL 服务器。它的应用程序无法修改和运行,一切都是永远安全的。那么,如何避免反编译和在线篡改检测。我确实放置了一个巨大的代码来从 apk 文件生成一些示例字符串,并将其与放置在服务器上的 apk 副本进行比较。我已将 apk 文件转换为字符串。尽情享受吧。

答案 7 :(得分:0)

如果是包含敏感数据的数据库,您可以像其他答案中提到的那样加密多个列的值或完整数据库,并确保密码不存储在设备上但必须由用户输入访问数据。

如果有一些代码需要保护,那么确保它没有好办法。对于有限数量的用例,您可以创建对在线服务的依赖关系并保护服务器。但对于很多应用程序来说,这不是一个选择。