桌游“Hitster”的运作方式是为玩家提供包含 QR 码的实体卡片。当通过 Hitster 移动应用扫描这些代码时,这些代码会触发通过 Spotify 或 Apple Music 订阅播放特定的歌曲。由于该应用需要有效的订阅才能正常运行,一名研究人员着手调查卡片 ID 与音乐轨道之间的映射关系是如何在软件中存储和保护的。

实体卡片上 QR 码的特写
Hitster 移动应用扫描实体卡片上的 QR 码以触发音乐播放。wuemeli.com

研究人员调查了应用如何将这些扫描的 QR 码映射到特定的音乐轨道。

Hitster 桌游的一张实体卡片
实体卡片是 Hitster 游戏音乐选择的主要界面。wuemeli.com

该游戏通过为玩家提供包含 QR 码的实体卡片来运行。

通过使用 `jadx` 对 Android APK 进行反编译,研究人员在应用的资源中识别出多个 JSON 文件,其中包括一个名为 `gameset_database_4.json` 的文件。该文件似乎使用了 Base64 编码后接 AES(高级加密标准)加密。通过分析 Java 源代码——特别是一个标记为 `k43.java` 的文件——研究人员绘制出了解密逻辑。该过程揭示了应用使用 AES-GCM 模式,其中它从一个硬编码字符串与剩余数据长度的哈希值结合中推导出密钥。通过与开发者社区中的其他人合作,研究人员最终通过对代码库中发现的两个字节数组进行 XOR 运算找回了这个隐藏字符串,从而允许他们编写自定义的 Rust 脚本在本地解密数据库。

这一努力产生了一个包含约 31,000 个跨多个区域的卡片 ID 到音乐轨道映射的文件。然而,调查最终揭示了一条更简单的路径:虽然本地应用程序试图通过复杂的加密来隐藏这些资源,但相同的信息在公共服务器上是可以无需任何安全措施获取的。通过导航到特定的资源 URL (`hitster.jumboplay.com/hitster-assets/`),研究人员发现整个 `gameset_database.json` 文件处于未加密状态。这突显了客户端混淆与服务器端暴露之间的常见差异,即开发者可能专注于隐藏应用程序二进制文件中的数据,却将其留在 Web 基础设施上公开可用。