我正在为Android开发一款支付处理应用程序,我想防止黑客访问APK文件中的任何资源、资产或源代码。

如果有人将.apk扩展名更改为.zip,那么他们可以将其解压缩并轻松访问应用程序的所有资源和资产,并且可以使用dex2jar和Java反编译器访问源代码。对Android APK文件进行反向工程非常容易-有关更多详细信息,请参阅堆栈溢出问题从APK文件到项目的反向工程。

我已经使用了Android SDK提供的Proguard工具。当我对使用签名密钥库和Proguard生成的APK文件进行反向工程时,我得到了混淆的代码。

然而,Android组件的名称保持不变,一些代码(如应用程序中使用的关键值)保持不变。根据Proguard文档,该工具无法混淆Manifest文件中提到的组件。

现在我的问题是:

如何完全防止Android APK的反向工程?这可能吗?我如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?


当前回答

完全避免逆向工程是不可能的,但通过在内部使其更加复杂,攻击者可能更难看到应用程序的清晰操作,这可能会减少攻击向量的数量。

如果应用程序处理高度敏感的数据,则存在各种技术,这些技术会增加代码反向工程的复杂性。一种技术是使用C/C++来限制攻击者容易进行的运行时操作。有大量的C和C++库非常成熟,易于集成,Android提供JNI。

攻击者必须首先绕过调试限制,才能在较低级别上攻击应用程序。这增加了攻击的复杂性。Android应用程序应在应用程序清单中设置Android:debuggable=“false”,以防止攻击者或恶意软件轻易地进行运行时操作。

跟踪检查–应用程序可以确定调试器或其他调试工具当前是否正在跟踪它。如果被跟踪,应用程序可以执行任意数量的可能的攻击响应动作,例如丢弃加密密钥以保护用户数据、通知服务器管理员或其他此类类型的响应以试图自卫。这可以通过检查进程状态标志或使用其他技术来确定,如比较ptrace附件的返回值、检查父进程、进程列表中的黑名单调试器或比较程序不同位置的时间戳。

优化-为了隐藏高级数学计算和其他类型的复杂逻辑,利用编译器优化可以帮助混淆目标代码,使其不易被攻击者分解,从而使攻击者更难理解特定代码。在Android中,这可以通过使用NDK本地编译的库更容易地实现。此外,使用LLVM混淆器或任何保护器SDK将提供更好的机器代码混淆。

剥离二进制文件–剥离本机二进制文件是一种有效的方法,可以增加攻击者查看应用程序低级功能组成所需的时间和技能水平。通过剥离二进制文件,二进制文件的符号表被剥离,这样攻击者就无法轻松调试或反向工程应用程序。您可以参考GNU/Linux系统上使用的技术,如sstriping或使用UPX。

最后,您必须了解混淆和ProGuard等工具。

其他回答

我建议您查看“保护软件应用程序免受攻击”。这是一项商业服务,但我朋友的公司使用了它,他们很高兴使用它。

在计算历史上,当您将软件的工作副本提供给攻击者时,从未有过阻止软件逆向工程的可能。而且,在大多数情况下,这是不可能的。

明白了这一点,就有了一个显而易见的解决方案:不要把你的秘密泄露给攻击者。虽然你不能保护APK的内容,但你可以保护的是你没有分发的任何内容。通常,这是服务器端软件,用于激活、支付、规则执行和其他有趣的代码。您可以通过不在APK中分发有价值的资产来保护它们。相反,设置一个服务器来响应应用程序的请求,“使用”资产(无论这意味着什么),然后将结果发送回应用程序。如果这个模型不适用于你心目中的资产,那么你可能需要重新思考你的战略。

此外,如果你的首要目标是防止应用程序盗版,那就别费心了。你已经在这个问题上花费了比任何反盗版措施都能挽救你的时间和金钱。解决这一问题的投资回报率很低,甚至连思考都没有意义。

只是上面已经很好的答案的补充。

我知道的另一个技巧是将有价值的代码存储为Java库。然后将该库设置为Android项目。与C.so文件一样好,但Android Lib可以。

这样,这些存储在Android库中的宝贵代码在反编译后将不可见。

我知道一些银行应用程序正在使用DexGuard,它提供了类、字符串、资产、资源文件和本地库的混淆和加密。

100%避免Android APK的反向工程是不可能的,但您可以使用以下方法避免提取更多数据,如源代码、APK中的资产和资源:

使用ProGuard混淆应用程序代码使用使用C和C++的NDK将应用程序核心和安全部分代码放在.so文件中为了保护资源,不要将所有重要资源都包含在APK的资产文件夹中。在应用程序首次启动时下载这些资源。