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

时间:2010-12-02 15:30:59

标签: java android reverse-engineering decompiling

众所周知,Android应用程序是用Java编写的。在Java中,无论what you do如何,都无法保护已编译的代码免受反编译或逆向工程的影响,因为Stack Overflow问题 How to lock compiled Java classes to prevent decompilation? 建议。

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

“如何”我的意思不仅仅是软件技术,还包括其他创意方法。

10 个答案:

答案 0 :(得分:72)

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

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

Android开发者博客在“防篡改”Android应用程序问题上有一些useful articles(他们建议将ProGuard用作整体方法的一部分)。

关于“创造性”方法:一些开发人员使用debugger detection techniques来阻止运行时分析,并将其与二进制代码部分的加密相结合(以阻止静态分析),但说实话,已经足够坚定攻击者可circumvent这些,虽然它可能导致合法用户沮丧,如Windows知识库文章 Games: Error Message: A Debugger Has Been Detected: Unload the Debugger and Try Again 所示。由于这个原因,我女朋友的'学驾车'DVD软件不会在VirtualBox下运行,但她当然会责怪Linux!

如果您想进一步研究,

OpenRCEWikipedia's article on obfuscated code可能是一个很好的起点。但要注意,通过过度热衷于使用这些技术来挫败您的用户,您可能会因为通过逆向工程丢失商业机密而失去更多。与Anton S says一样,也许最“创造性”的方法在于调整商业模式而不是技术。

2010年12月6日的最新Android SDK update(与Android 2.3 Gingerbread发布时间一致):

  

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

答案 1 :(得分:14)

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

答案 2 :(得分:7)

让它变得如此便宜,并且不要在客户端执行的秘密之上构建您的业务模型。换句话说,不要分享你的秘密。

答案 3 :(得分:5)

不可能保护任何客户端代码免受逆向工程。您可以使用更高效或更低效的方式来混淆代码。优化的x86汇编程序恰好是一个非常好的混淆。

因此,如果您有算法机密,请将它们放在服务器端。

答案 4 :(得分:3)

  

如何锁定已编译的Java类以防止反编译

你做不到。任何有足够技能,时间和动力的人都可以打败任何计划。

(顺便说一句,这也适用于编译为二进制文件的软件。唯一的区别在于反编译所涉及的工作量。)

  

我的问题是如何保护包含逆向工程的算法商业秘密的应用程序?

只是不要在用户的手机上安装应用程序。或者(更有用的),在远程(适当安全的)服务器上运行包含商业秘密的代码。

答案 5 :(得分:2)

你无法完全保护自己的应用程序,因为总有人会破解它......

然而,你可以通过免费提供应用程序来阻止他们这样做,或者至少是便宜的,这样人们就不会受到打扰。

替代方案,尝试让您的Android应用程序“愚蠢”,就像在后端服务器上保留所有秘密的业务逻辑一样,并让您使用某种形式的公开服务让应用程序显示数据。

答案 6 :(得分:1)

无论你做什么,也许至少你可以很难反编译,但是:如果在程序中执行/计算某些东西,那么算法的信息就必须存在,并且总是有可能找出如何获得(足够的技能和动机对你的对手假设)。总是

答案 7 :(得分:0)

我在服务器上有算法,我从智能手机应用程序调用该服务。犯罪者可以对我的智能手机应用程序进行逆向工程,以查看我的服务器上的协议。我可以保护我的算法,但我无法防止未经授权使用我的服务。我必须接受这个现实而没有解决方案。我必须满足于只要我用自己的服务赚钱,那么我就必须忍受别人吸收我服务的潜力。

答案 8 :(得分:0)

你想要一种创造性的方法,这是一种方法。

今天尚未反编译的手机主程序是什么?无线电固件。为什么?它不是在手机的ARM芯片组上运行,而是在智能手机中越来越多的单独Qualcomm Hexagon上运行。它不是x86,它不是ARM,它使用Qualcomm专有架构和指令。

  • Java反编译很容易。

  • ARM反编译比较困难(Hex-Rays Decompiler许可证 从1129美元开始...并且在二进制文件中拇指代码和标准ARM代码之间的混合很痛苦)=>您可以尝试使用 Android进行编译 NDK

  • 目前还没有Hexagon反编译器!并且QDSP规范不公开,甚至是盗版版本。

问题是,独立软件供应商是否可以使用大众市场手机中包含的Hexagon固件?这似乎是高通公司的方向。查看他们的网站和SnapDragon产品。

注意:我不是专业高通,也不是亲封闭源。但是这个线程吸引了这种解决方案。

答案 9 :(得分:0)

你无法100%保护你的android代码免受逆向工程。 如果您想要保护某些密钥,那么您可以从集成服务器获取帮助,该服务器在调用Web服务时为您提供加密密钥,并将该密钥用于您的代码。