众所周知,Android应用程序是用Java编写的。在Java中,无论你做什么,都不可能防止已编译的代码被反编译或逆向工程,正如Stack Overflow问题如何锁定编译的Java类以防止反编译?所建议的那样。
如果一个应用程序包含算法交易秘密,如何保护其免受逆向工程的影响呢?
“如何”不仅指软件技术,还包括其他创意方法。
众所周知,Android应用程序是用Java编写的。在Java中,无论你做什么,都不可能防止已编译的代码被反编译或逆向工程,正如Stack Overflow问题如何锁定编译的Java类以防止反编译?所建议的那样。
如果一个应用程序包含算法交易秘密,如何保护其免受逆向工程的影响呢?
“如何”不仅指软件技术,还包括其他创意方法。
我的第一步是使用ProGuard来优化和混淆代码,该工具已知可用于针对Android的Dalvik虚拟机(通过Dex)的字节码。这是一个非常好的工具,可以增加“反转”代码的难度,同时缩小代码的占用空间(在某些情况下甚至可以显著减少:我最近的一个小应用从约600KB减少到了约50KB)。
正如其他人所说,当你的算法实现被分发给客户端时,你永远无法完全保证其细节的安全性。要做到这一点,你需要将代码仅保留在自己的服务器上。试图实现客户端代码的近乎100%的安全性实际上相当于DRM,这可能会使你的客户端代码在网络故障时变得脆弱,并且会让(合法的)用户感到沮丧。
Android开发者博客上有一些关于“防篡改”的Android应用程序的有用 文章(并且他们建议在整体方法中使用ProGuard)。
关于“创意”方法:一些开发人员采用调试器检测技术来防止运行时分析,并将此与部分二进制代码的加密相结合(以防止静态分析),但说实话,足够决心的攻击者可以规避这些措施,同时也会引起合法用户的沮丧,正如Windows KB文章所述游戏:错误消息:检测到调试器:卸载调试器并重试。我的女朋友的“学车”DVD软件因此无法在VirtualBox下运行,但她当然归咎于Linux!OpenRCE和维基百科关于混淆代码的文章可能是进一步了解此内容的好起点。但请注意,过度热衷于使用这些技术会让您失去更多用户而不是通过反向工程失去商业机密。正如Anton S所说,也许最“有创意”的方法在于调整业务模式而不是技术。
最新的Android SDK更新于2010年12月6日发布(与Android 2.3 Gingerbread版本同时发布):
集成ProGuard支持:ProGuard现在已经打包到SDK工具中。开发人员现在可以将代码混淆作为发布构建的一部分来集成。
让麻烦变得非常便宜,并且不要建立在客户端执行的秘密之上的业务模型。换句话说,不要分享你的秘密。
无法防止客户端代码被逆向工程。你只能使用更或者更少有效的混淆代码的方法。而优化的x86汇编语言恰好是一种相当好的混淆方式。
因此,如果你有算法保密,请将其放在服务器端。
您无法完全保护您的应用程序,因为总会有人会破解它...
但是,您可以通过使您的应用程序免费或至少价格便宜来阻止他们这样做,以此来阻碍他们。
另一种方法是尽量让您的Android应用程序“愚蠢”,即将所有机密业务逻辑保留在后端服务器上,并只使用某种形式的公开服务显示数据。
我将我的算法放在服务器上,并从我的智能手机应用程序中调用该服务。攻击者可以对我的智能手机应用程序进行逆向工程,以查看我与服务器之间的协议。我可以保护我的算法,但无法防止未经授权使用我的服务。我必须接受这个现实而没有解决方案。只要我通过自己的服务赚钱,我就必须接受其他人可能窃取我的服务的潜力。
你想寻找一种创新的方法,这里提供一种。
现在手机上尚未被反编译的主程序是什么?无线电固件。为什么?因为它不在手机的ARM芯片组上运行,而是在越来越多出现在智能手机中的高通Hexagon单独芯片上。它不是x86,也不是ARM,它使用了高通专有的架构和指令。
Java反编译很容易。
ARM反编译更加困难(Hex-Rays反编译器的许可证从1129美元起...并且二进制代码中的Thumb代码和标准ARM代码混合在一起会很麻烦)=>你可以尝试使用Android NDK进行编译。
目前还没有Hexagon反编译器!而且QDSP规格也没有公开的版本,即使是盗版。
问题是,一个独立的软件供应商是否可以使用大众市场手机中包含的Hexagon固件?这似乎是高通所采取的方向。看看他们的网站和SnapDragon产品。
注意:我不是高通或闭源的支持者。但这个帖子呼吁这种解决方案。你无法百分之百地保护你的安卓代码免受反向工程。如果你想要保护一些关键信息,那么可以通过集成服务器来获取在调用网络服务时提供给你的加密密钥,并将该密钥用于你的代码中。