15

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

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

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

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

你有什么建议吗?

编辑:

这个应用程序是一个带有描述每个级别的 XML 文件的游戏。

4

4 回答 4

6

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

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

这里有一些廉价和讨厌的代码来做到这一点:

   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 许可这样的东西是否在这方面为您提供任何保护。不过我没有这方面的经验,所以你自己在那里。

于 2013-02-06T09:20:41.250 回答
2

一个答案,虽然它是否定的。

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

于 2013-01-29T04:34:24.547 回答
1

也许您可以压缩 xml 文件并将其放在 assets/data 文件夹中;然后对该.zip 进行校验和。在第一次运行时,您可以解压缩文件以获取 .xml 布局。请参阅使用 ZipFile 类从多个文件的 zip 存档中解压缩文件以解压缩存档。

于 2013-01-29T04:36:04.060 回答
0

可能最可靠的方法是在应用程序启动时从服务器下载关卡 XML 数据,并检查关卡文件的时间戳和大小。这也让您可以随时间提供关卡数据的更新。当然,这意味着您需要增加托管服务器的费用,这可能是另一个问题。

于 2013-02-05T15:44:40.013 回答