检查安卓资产的完整性

2022-09-03 15:38:26

在我的文件夹中,有很多XML文件包含我的应用程序的静态数据。assets/data

有人很容易检索APK,修改其中的一部分并安装在设备上。

我想通过检查文件夹的完整性来防止用户更改我的静态数据。assets/data

最初,我正在考虑使用MD5校验和,但对于我将要拥有的文件量(50-100)来说,它可能太慢了。

你有什么建议吗?

编辑:

这个程序是一个游戏,有一个XML文件描述每个级别。


答案 1

我将介绍如何有效地防止修改和重新打包,而不是如何单独保护资产,尽管您最终可以应用相同的技术来加密它们。它并不完美,但你可以使修改变得更加困难。

使用证书对应用程序进行签名。虽然他们可以删除您的证书,但在将其重新组合在一起时,没有其他人可以生成相同的证书。因此,您可以在运行时检查应用程序的签名,以确保它是您所期望的。

这里有一些便宜又讨厌的代码来做到这一点:

   PackageManager pm = context.getPackageManager();

   PackageInfo info = pm.getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES );

   if ( info.signatures[ 0 ].toCharsString().equals( YOUR_SIGNATURE ) )
   {
     //signature is OK
   }

其中YOUR_SIGNATURE是一个常量,通过在已签名的应用上运行此代码获得。

现在,您已经暗示了两个剩余的问题:

  1. 您如何阻止某人只是修改源代码中的常量以匹配其证书,然后重新打包并重新签名应用程序?

  2. 你怎么能阻止有人找到检查方法并删除它?

对两者的回答是:你不能,不是绝对的,但你可以通过混淆来做得很好。免费的Proguard,但更有用的是商业Dexguard,是执行此操作的工具。您可以以后者目前的350欧元成本来赚钱;另一方面,我试图对像这样受保护的应用程序进行逆向工程,除非风险非常高,否则不值得麻烦。

在某种程度上,你也可以自己做(1)的混淆;在运行时通过一些复杂的编程方法组装签名“常量”,这使得很难找到和替换。

(2)确实是软件设计问题;使其足够复杂或烦人以删除检查。混淆只会使首先更难找到。

作为进一步的注意,您可能需要查看Google许可之类的内容是否在这方面为您提供了任何保护。我没有任何经验,所以你在那里独自一人。


答案 2

有点答案,尽管它是负面的。

如果此人拥有您的apk并对其进行了解码,那么即使您使用了校验和,他们也只需使用新的校验和更新代码部分即可。我不认为你能赢得这场比赛。您可以投入大量精力来保护它,但是如果您假设有人可以获取和修改apk,那么他们也可以撤消保护。在我的商业内容上,我只是试图使解码不明显但不防弹。我知道任何事情都不值得付出努力,甚至是不可能的。


推荐