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

Ham*_*hah 46 android apk

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

小智 33

基本上,有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++代码保护,以实现反调试和反编译效果.

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

  • APKProtect 依赖于 Android smali 反编译器中的错误:它在应用程序中发生变化,因此反编译器崩溃并且不生成源代码。因此,APKProtect 将一直工作,直到反编译器目标错误得到纠正。在此处查看比较:http://www.youtube.com/watch?v=t7M4AK1vZPA (2认同)

Ben*_*rst 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
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请阅读以下博客文章


小智 5

你考虑过sqlite加密吗?请参阅此线程 -适用于 android 的 sqlite 加密

至于保护您的 .apk,请尝试使用 proguard 混淆您的代码。请参阅http://developer.android.com/guide/developing/tools/proguard.html

  • 抱歉,但有趣的是它使代码更容易理解(proguard):) 我测试它 (4认同)

Ben*_*Ben 5

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

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

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

  • 我很少使用proguard,然后只删除Scala或Mercury标准库的不必要部分,因此用Scala或Mercury编写的程序能够为Android翻译.但我相信它确实有"混淆"选项,可以破坏类/变量名称,并删除可能对逆向工程有用的其他信息.如果您发现proguard输出比输入源代码更容易阅读,我会怀疑您没有打开它们. (4认同)