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

Posted

技术标签:

【中文标题】真的不可能保护 Android 应用免受逆向工程吗?【英文标题】:Is it really impossible to protect Android apps from reverse engineering? 【发布时间】:2011-05-19 05:00:57 【问题描述】:

众所周知,android 应用程序是用 Java 编写的。在 Java 中,无论是 what you do,都无法保护编译后的代码免于反编译或逆向工程,正如 Stack Overflow 问题 How to lock compiled Java classes to prevent decompilation? 所暗示的那样。

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

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

【问题讨论】:

Android 应用程序可以“用 Java 编写”作为源代码,但它们不是作为 Java 字节码分发 - 它们是作为 DEX(Dalvik EXecutable)文件分发的。有针对 DEX 文件的反汇编程序可以生成“类似汇编”的代码,但据我所知,没有办法将 DEX“反编译”为 Java 源代码。 Nate,这是一个很棒的评论和非常有用的信息。如果这是一个正确的解决方案,请将其作为答案发布,我会很乐意将其作为“答案”接受。同时,我发现以下线程表明即使是 DEX 文件也可以反编译成 Java 源代码:***.com/questions/1249973/… -- 这是真的吗? 我偶然发现的另一个相关参考:***.com/questions/3122635/android-decompile-apk 【参考方案1】:

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

【讨论】:

【参考方案2】:

您想要一种创造性的方法,这里有一个。

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

Java 反编译很容易。

ARM 反编译更加困难(Hex-Rays 反编译器许可证 起价 1129 美元...在二进制文件中混合使用拇指代码和标准 ARM 代码是一种痛苦)=> 您可以尝试使用 Android 进行编译 NDK。

目前没有Hexagon反编译器!并且 QDSP 规范不公开,即使是盗版。

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

注意:我不支持高通,也不支持封闭源代码。但是这个线程吸引了这种解决方案。

【讨论】:

逆向工程不需要反编译,反汇编就够了。而且我发现六边形反汇编非常可读。【参考方案3】:

不管你做什么,也许至少你可以让反编译变得非常困难,但是:如果在程序中执行/计算某些东西,关于算法的信息必须在那里,并且总是有可能找出如何做到这一点(假设对手有足够的技巧和动力)。总是。

【讨论】:

【参考方案4】:

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

【讨论】:

我的想法! +1! @Android Eve:您可以使用保密的身份验证密码来连接到您的服务器。即使有人从你的代码中提取了这个密码,也没有人能看到你的计算是如何工作的。 这个想法+1。但是,一个巨大的缺点是:放弃了分布式处理的好处。如果算法需要为数亿人服务,那么您需要对服务器场进行大量投资。 我会说忘记密码,因为有人提取它。正如您所说,这是一个黑匣子,人们可以看到结果,但看不到产生结果的代码。感谢您的 +1! 密码是额外的混淆层。您不需要它,但它也不会造成伤害,并且在不使用应用程序的情况下更难使用此服务。 @elusive:如果这是您的偏好。在这些小评论框中很难解释我的理念,所以我不会尝试。【参考方案5】:

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

【讨论】:

安东,我不是指针对用户的复制或盗版保护。该应用程序很可能是免费提供的。我的意思是一些公司的逆向工程...... 这同样适用于根检测。您将尝试控制“控制控制的用户”,包括您依赖的 api 调用来了解“谁拥有 root 访问权限?”。【参考方案6】:

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

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

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

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

OpenRCE 和 Wikipedia's article on obfuscated code 如果您想进一步研究,可能是很好的起点。但请注意,与通过逆向工程丢失商业机密相比,过度使用这些让用户感到沮丧的技术可能会给您带来更多损失。像Anton S says 一样,也许最“有创意”的方法在于调整商业模式而不是技术。

2010 年 12 月 6 日最新的 Android SDK update(与 Android 2.3 Gingerbread 版本同时发布):

集成 ProGuard 支持:ProGuard 现在与 SDK 工具一起打包。开发人员现在可以将他们的代码混淆为发布构建的一个集成部分。

【讨论】:

+1。这是迄今为止我收到的最好的答案。谢谢你。除非收到更好的答案,否则这将是公认的答案。【参考方案7】:

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

【讨论】:

【参考方案8】:

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

但是,您可以通过免费提供您的应用程序来阻止他们这样做,或者至少非常便宜,这样人们就不会被打扰。

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

【讨论】:

+1 表示第三个。还有其他不一定是软件技术的想法吗?【参考方案9】:

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

你不能。任何计划都可能被有足够技能、时间和动力的人打败。

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

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

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

【讨论】:

+1 最后一个提示。还有其他不一定是软件技术的想法吗?【参考方案10】:

不可能保护任何客户端代码免受逆向工程。您可以使用或多或少有效的方式来混淆您的代码。而优化的 x86 汇编器恰好是一个很好的混淆。

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

【讨论】:

Android 设备上优化 x86 汇编程序?怎么样? 这只是关于 x86 比 java 字节码更难逆转的一般性评论,但仍然可能。而且 afaik 可以将本机代码与您的 android 程序(我猜是 ARM)一起发布,但我不确定这是一个好主意。 你指的是NDK吗?我不介意在 Android 上使用我的母语 (C++),但我的理解是 NDK 仅限于非常特定的低级系统编程。

以上是关于真的不可能保护 Android 应用免受逆向工程吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 Android 代码免受逆向工程? [复制]

无法在eclipse中保护代码免受逆向工程

在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?

保护字符串常量免受逆向工程

保护字符串常量免受逆向工程

Android 保护清单和布局免受逆向工程