协慌网

登录 贡献 社区

如何避免 APK 文件的反向工程?

我正在开发适用于 Android 的付款处理应用 ,并且希望防止黑客访问APK文件中的任何资源,资产或源代码。

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

我已经使用了 Android SDK 随附的 Proguard 工具。当我反向工程使用签名的密钥库和 Proguard 生成的 APK 文件时,我得到的代码很混乱。

但是,Android 组件的名称保持不变,某些代码(如应用中使用的键值)保持不变。根据 Proguard 文档,该工具不能混淆清单文件中提到的组件。

现在我的问题是:

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

答案

1. 如何完全避免对 Android APK 进行反向工程?这可能吗?

AFAIK,没有任何技巧可以完全避免逆向工程。

@inazaruk 也很好地指出: 无论您对代码做什么,潜在的攻击者都可以通过其认为可行的任何方式对其进行更改 。您基本上不能保护您的应用程序不被修改。并且您放置在其中的所有保护措施都可以被禁用 / 删除。

2. 如何保护应用程序的所有资源,资产和源代码,以使黑客无法以任何方式对 APK 文件进行黑客攻击?

您可以采取不同的技巧来使黑客攻击更加困难。例如,使用混淆(如果是 Java 代码)。这通常会大大降低反向工程的速度。

3. 有没有办法使黑客攻击变得更加严厉甚至不可能?我还能做些什么来保护 APK 文件中的源代码?

众所周知,您可能知道,没有 100%的安全性。但是 Google 内置的 Android 的起点是 ProGuard。如果可以选择包含共享库 ,则可以在 C ++ 中包含所需的代码以验证文件大小,集成等。如果需要在每次构建时将外部本机库添加到 APK 的库文件夹中,则可以使用它通过以下建议。

将库放在本机库路径中,该路径默认为项目文件夹中的 “libs”。如果您为“armeabi”目标构建了本机代码,则将其放在libs / armeabi 下 。如果它是使用armeabi-v7a构建的, 则将其放在libs / armeabi-v7a 下。

<project>/libs/armeabi/libstuff.so

AFAIK,您不能再保护 / res 目录中的文件,而不能立即保护它们。

但是,您可以采取一些步骤来保护您的源代码,或者至少要保护源代码而不是全部。

  1. 使用 ProGuard 之类的工具。这些会混淆您的代码,并且即使不是不可能的话,在反编译时也很难阅读。
  2. 将服务中最关键的部分移出应用程序,并移入 Web 服务,隐藏在服务器端语言(如 PHP)的后面。例如,如果您有一种算法需要花费一百万美元来编写。您显然不希望人们从您的应用程序中窃取它。移动算法并使其在远程服务器上处理数据,并使用该应用程序简单地向其提供数据。或使用 NDK 将其本机写入. so 文件中,而与 apks 相比,它们反编译的可能性要小得多。我认为到目前为止,甚至还没有针对. so 文件的反编译器(即使确实如此,它也不如 Java 反编译器那样好)。此外,正如注释中提到的 @nikolay 一样,在服务器和设备之间进行交互时,应使用 SSL。
  3. 在设备上存储值时,请勿以原始格式存储它们。例如,如果您有一个游戏,并且要存储用户在 SharedPreferences 中拥有的游戏币数量。假设它是10000硬币。而不是直接保存10000 ,而是使用((currency*2)+1)/13类的算法进行保存。因此,您可以将1538.53846154而不是10000保存到 SharedPreferences 中。但是,上面的示例并不完美,您必须努力提出一个不会因舍入误差等因素而浪费时间的方程。
  4. 您可以对服务器端任务执行类似的操作。现在举个例子,让我们实际使用您的付款处理应用程序。假设用户必须支付$200 。而不是发送原始的$200值到服务器,发送一系列较小的,预定义值,加起来的$200 。例如,在您的服务器上有一个文件或表格将单词与值等同起来。假设Charlie对应$47John对应$3 。因此,您不必发送$200 ,而是可以发送Charlie四次和John四次。在服务器上,解释它们的含义并将其加起来。这样可以防止黑客将任意值发送到您的服务器,因为他们不知道哪个单词对应什么值。为了增加安全性,您也可以为此设置一个类似于第 3 点的公式,并每隔n天更改一次关键字。
  5. 最后,您可以将无用的随机源代码插入您的应用程序,以使黑客在大海捞针中寻找针头。插入包含来自互联网的摘要的随机类,或者仅插入用于计算诸如斐波那契数列之类的随机事物的函数。确保可以编译这些类,但应用程序的实际功能未使用这些类。添加足够多的这些错误类,黑客将很难找到您的真实代码。

总而言之,没有办法 100%保护您的应用程序。您可以使其更难,但并非没有。您的 Web 服务器可能受到威胁,黑客可能会通过监视多个交易金额和您为其发送的关键字来找出您的关键字,黑客可能会费心地查看源代码并找出哪个代码是假的。

您只能反击,但永远不会赢。

当您将软件的有效副本提供给攻击者时,在计算历史上的任何时候都不可能阻止软件的逆向工程。而且,极有可能永远不可能

据了解,有一个明显的解决方案: 不要将您的秘密透露给攻击者。虽然您无法保护 APK 的内容,但是您可以保护的是您不分发的任何内容。通常,这是服务器端软件,用于激活,付款,规则执行和其他多汁的代码。您可以通过不在 APK 中分配有价值的资产来保护它们。而是设置一个服务器来响应您的应用程序的请求,“使用” 资产(可能意味着什么),然后将结果发送回应用程序。如果此模型不适用于您所考虑的资产,那么您可能需要重新考虑您的战略。

另外, 如果您的主要目标是防止应用盗版那就不要打扰。在此问题上,您已经花费了更多的时间和金钱,而任何反盗版措施都可能希望挽救您。解决该问题的投资回报率很低,以至于甚至没有考虑。