我正在为Android开发一款支付处理应用程序,我想防止黑客访问APK文件中的任何资源、资产或源代码。
如果有人将.apk扩展名更改为.zip,那么他们可以将其解压缩并轻松访问应用程序的所有资源和资产,并且可以使用dex2jar和Java反编译器访问源代码。对Android APK文件进行反向工程非常容易-有关更多详细信息,请参阅堆栈溢出问题从APK文件到项目的反向工程。
我已经使用了Android SDK提供的Proguard工具。当我对使用签名密钥库和Proguard生成的APK文件进行反向工程时,我得到了混淆的代码。
然而,Android组件的名称保持不变,一些代码(如应用程序中使用的关键值)保持不变。根据Proguard文档,该工具无法混淆Manifest文件中提到的组件。
现在我的问题是:
如何完全防止Android APK的反向工程?这可能吗?我如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?
基本上这是不可能的。这永远不可能。然而,这是有希望的。你可以使用混淆器来实现,这样一些常见的攻击就更难执行了,包括:
重命名方法/类(因此在反编译器中,您可以获得像.a这样的类型)使控制流混乱(因此在反编译器中,代码很难阅读)加密字符串和可能的资源
我肯定还有其他的,但这是主要的。我在一家名为PreEmptive Solutions的公司工作,负责.NET混淆器。他们还有一个适用于Android的Java混淆器,一个叫做DashO的混淆器。
不过,困惑总是有代价的。值得注意的是,性能通常更差,通常需要一些额外的时间来发布。然而,如果你的知识产权对你来说非常重要,那么它通常是值得的。
否则,你唯一的选择就是让你的Android应用程序直接传递到一个承载你应用程序所有真实逻辑的服务器。这有其自身的问题,因为这意味着用户必须连接到Internet才能使用您的应用程序。
此外,不仅仅是Android有这个问题。这是每个应用商店的问题。这只是获取程序包文件有多困难的问题(例如,我不相信在iPhone上很容易,但仍然有可能)。
Android 7.0中的APK签名方案v2(Nougat)
PackageManager类现在支持使用APK签名方案v2验证应用程序。APK签名方案v2是一个完整的文件签名方案,通过检测对APK文件的任何未经授权的更改,显著提高了验证速度并加强了完整性保证。
为了保持向后兼容性,APK必须在使用v2签名方案签名之前使用v1签名方案(JAR签名方案)签名。使用v2签名方案,如果在使用v2方案签名后使用附加证书对APK进行签名,则验证失败。
APK签名方案v2支持稍后将在N开发者预览版中提供。
http://developer.android.com/preview/api-overview.html#apk_signature_v2
1.如何完全避免Android APK的反向工程?这可能吗?
那是不可能的
2.如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?
开发人员可以采取一些措施,例如使用ProGuard之类的工具来混淆他们的代码,但到目前为止,要完全阻止某人对应用程序进行反编译还是相当困难的。
这是一个非常棒的工具,可以增加“反转”代码的难度,同时缩小代码的占地面积。
集成ProGuard支持:ProGuard现在与SDK工具一起打包。开发人员现在可以将其代码作为发布构建的集成部分进行模糊处理。
3.有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?
在研究期间,我了解了HoseDex2Jar。此工具将保护您的代码不被反编译,但似乎不可能完全保护您的。
一些有用的链接,你可以参考它们。
Proguard、Android和许可服务器保护Android LVL应用程序堆栈溢出问题:保护Android应用程序不受反向工程的影响真的不可能吗?堆栈溢出问题如何防止Android APK文件反向工程以保护代码?