真的不可能保护Android应用程序免受逆向工程的影响吗?

众所周知,Android应用程序是用Java编写的。在Java中,无论你做什么,都不可能保护编译的代码免受反编译或逆向工程的影响,正如Stack Overflow问题如何锁定编译的Java类以防止反编译所暗示的那样。

如何保护包含算法商业机密的应用程序免受逆向工程的影响?

我说的“如何”不仅指软件技术,还指其他创造性的方法。


答案 1

对我来说,第一站是使用ProGuard优化和混淆代码,ProGuard已知可以使用针对Android的Dalvik VM的字节代码(通过Dex)。这是一个非常棒的工具,可以增加“反转”代码的难度,同时缩小代码的占用空间(在某些情况下,戏剧性地:我最近的一个小程序从大约600 KB下降到大约50 KB)。

就像其他人说的那样,在将算法的实现分发给客户端时,您将永远无法获得算法详细信息的100%安全性。为此,您需要将代码单独保存在服务器上。尝试将客户端代码接近100%的安全性有效地等同于DRM,并且可能会使您的客户端代码在面对网络中断时变得脆弱,并且通常会使(合法)用户感到沮丧。

Android开发人员博客上有一些关于“防篡改”Android应用程序问题的有用文章(他们建议使用ProGuard作为整体方法的一部分)。

关于“创造性”方法:一些开发人员使用调试器检测技术来防止运行时分析,并将其与部分二进制代码的加密相结合(以阻止静态分析),但说实话,足够坚定的攻击者可以绕过这些,同时它可能导致合法的用户挫败感,如Windows知识库文章游戏:错误消息所示: 检测到调试器:卸载调试器并重试。出于这个原因,我女朋友的“学习驱动”DVD软件不会在VirtualBox下运行,但她当然责怪Linux!

OpenRCE维基百科关于混淆代码的文章可能是很好的起点,如果你想进一步研究这个问题。但请注意,过度热衷于使用这些技术来挫败用户,您可能会比通过逆向工程丢失商业秘密而损失更多。正如Anton S所说,也许最“有创意”的方法在于调整商业模式而不是技术。

2010 年 12 月 6 日的最新 Android SDK 更新(与 Android 2.3 Gingerbread 版本一致):

集成的 ProGuard 支持:ProGuard 现在与 SDK 工具一起打包。开发人员现在可以将其代码作为发布版本的集成部分进行模糊处理。


答案 2

如果是可能的:对受到良好保护的服务器(服务器具有要保护的代码)的远程过程调用。


推荐