繁体   English   中英

检测是否从 Play 商店安装了应用程序

[英]Detect if an app is installed from Play store

我想检查并允许使用我的应用程序,只要它是从 Play 商店下载的,并且它没有被其他用户或任何其他来源共享。 如果尚未从 Google Play 商店下载该应用程序,如何阻止用户使用该应用程序?

此方法将检查您的应用是否已从 Play 商店安装。

boolean verifyInstallerId(Context context) {
    // A list with valid installers package name
    List<String> validInstallers = new ArrayList<>(Arrays.asList("com.android.vending", "com.google.android.feedback"));

    // The package name of the app that has installed your app
    final String installer = context.getPackageManager().getInstallerPackageName(context.getPackageName());

    // true if your app has been downloaded from Play Store 
    return installer != null && validInstallers.contains(installer);
}

几天前,我发布了一个 Android 库PiracyChecker ,它使用一些技术来保护您的应用程序,例如 Google Play 许可 (LVL)、APK 签名保护和安装程序 ID(这个)。

绕过检查

我想检查并允许使用我的应用程序,前提是它是从 Play 商店下载的,并且没有被其他用户或任何其他来源共享。

虽然此检查可以通过编程方式实现,但也可以通过在没有检查的情况下重新打包应用程序或通过在运行时使用检测框架来绕过检查来绕过。 这种框架的一个例子是Frida

将您自己的脚本注入黑盒进程。 挂钩任何函数,监视加密 API 或跟踪私有应用程序代码,无需源代码。 编辑,点击保存,并立即查看结果。 无需编译步骤或程序重新启动。

我写了一篇文章来展示如何使用 Frida 绕过 Android 应用程序中的证书锁定,并且可以使用相同的方法绕过此检查。 唯一的区别是您需要找到正确的 Frida 脚本或自己编写一个并使用它代替 on 来绕过固定。 Frida 代码共享网站是一组庞大的脚本,其中一个可能存在于此建议中,或者可以用作了解如何编写自己的脚本的起点。

保护支票

如果应用程序不是从 Google Play 商店下载的,我如何阻止用户使用该应用程序?

所以,如果你使用内置的context.getPackageManager().getInstallerPackageName(context.getPackageName()); 或任何其他方法,您将免受未从 Google Play 商店安装您的移动应用程序的普通用户的侵害,但任何想要攻击您的移动应用程序的人都可以通过多种方法绕过此保护,如上所述。

保护您的移动应用程序免受绕过检查的攻击者的一种可能解决方案是使用运行时自我防御保护或移动应用程序证明解决方案,我建议您阅读此答案,尤其是加固和屏蔽移动应用程序保护 API 部分服务器一个可能的更好的解决方案,看看当你的移动应用程序不是你真正的移动应用程序时,你可以如何阻止它正常工作。

你想走得更远吗?

在对安全问题的任何回答中,我总是喜欢参考 OWASP 基金会的出色工作。

对于移动应用程序

OWASP 移动安全项目 - 十大风险

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。 通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - 移动安全测试指南

移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。

com.android.vending是游戏商店包名,

context.packageManager.getInstallerPackageName(context.packageName)获取源包名称。

其他来源如华为应用程序库下载该应用程序。 但我不确定它的包名是什么

仅出于完整性考虑:客户端-服务器应用程序(与您自己的服务器通信的应用程序)应使用服务器端许可证验证来检查应用程序是否从 GP 安装并且有效 - 许可证验证库 (LVL) 将对此负责。

这可用于保护后端服务器免受非法客户端(例如机器人)的侵害,这些客户端必须首先通过 LVL 验证,然后才能访问其他后端功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM