我正在开发适用于 Android 的付款处理应用 ,并且希望防止黑客访问APK文件中的任何资源,资产或源代码。
如果有人将. apk 扩展名更改为. zip,那么他们可以将其解压缩并轻松访问所有应用程序的资源和资产,并且使用dex2jar和 Java 反编译器,他们还可以访问源代码。对 Android APK 文件进行反向工程非常容易 - 有关更多详细信息,请参见 Stack Overflow 问题: 从 APK 文件反向工程到项目 。
我已经使用了 Android SDK 随附的 Proguard 工具。当我反向工程使用签名的密钥库和 Proguard 生成的 APK 文件时,我得到的代码很混乱。
但是,Android 组件的名称保持不变,某些代码(如应用中使用的键值)保持不变。根据 Proguard 文档,该工具不能混淆清单文件中提到的组件。
现在我的问题是:
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 目录中的文件,而不能立即保护它们。
但是,您可以采取一些步骤来保护您的源代码,或者至少要保护源代码而不是全部。
10000
硬币。而不是直接保存10000
,而是使用((currency*2)+1)/13
类的算法进行保存。因此,您可以将1538.53846154
而不是10000
保存到 SharedPreferences 中。但是,上面的示例并不完美,您必须努力提出一个不会因舍入误差等因素而浪费时间的方程。 $200
。而不是发送原始的$200
值到服务器,发送一系列较小的,预定义值,加起来的$200
。例如,在您的服务器上有一个文件或表格将单词与值等同起来。假设Charlie
对应$47
, John
对应$3
。因此,您不必发送$200
,而是可以发送Charlie
四次和John
四次。在服务器上,解释它们的含义并将其加起来。这样可以防止黑客将任意值发送到您的服务器,因为他们不知道哪个单词对应什么值。为了增加安全性,您也可以为此设置一个类似于第 3 点的公式,并每隔n
天更改一次关键字。 总而言之,没有办法 100%保护您的应用程序。您可以使其更难,但并非没有。您的 Web 服务器可能受到威胁,黑客可能会通过监视多个交易金额和您为其发送的关键字来找出您的关键字,黑客可能会费心地查看源代码并找出哪个代码是假的。
您只能反击,但永远不会赢。
当您将软件的有效副本提供给攻击者时,在计算历史上的任何时候都不可能阻止软件的逆向工程。而且,极有可能永远不可能 。
据了解,有一个明显的解决方案: 不要将您的秘密透露给攻击者。虽然您无法保护 APK 的内容,但是您可以保护的是您不分发的任何内容。通常,这是服务器端软件,用于激活,付款,规则执行和其他多汁的代码。您可以通过不在 APK 中分配有价值的资产来保护它们。而是设置一个服务器来响应您的应用程序的请求,“使用” 资产(可能意味着什么),然后将结果发送回应用程序。如果此模型不适用于您所考虑的资产,那么您可能需要重新考虑您的战略。
另外, 如果您的主要目标是防止应用盗版 , 那就不要打扰。在此问题上,您已经花费了更多的时间和金钱,而任何反盗版措施都可能希望挽救您。解决该问题的投资回报率很低,以至于甚至没有考虑。