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

Posted

技术标签:

【中文标题】检测是不是从 Play 商店安装了应用程序【英文标题】:Detect if an app is installed from Play store检测是否从 Play 商店安装了应用程序 【发布时间】:2016-05-31 07:53:03 【问题描述】:

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

【问题讨论】:

How to know an application is installed from google play or side-load?的可能重复 【参考方案1】:

此方法将检查您的应用是否已从 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(这个)。

【讨论】:

这还能用吗?当我的用户侧载我的应用程序时,我向他们显示一个弹出窗口,其中一些人抱怨他们看到了弹出窗口,即使他们通过 Playstore 安装了该应用程序。 如何检测到该应用是从华为商店安装的? 我仍然很少有用户报告此问题。除了添加com.google.android.feedback 外,使用相同的代码快照。软件包应用程序列表显示here 显示它与安装无关。有人有同样的情况吗? 虽然不是一个强大的解决方案。见***.com/a/36299631/1159930【参考方案2】:

绕过检查

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

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

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

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

保护支票

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

因此,如果您使用内置的 context.getPackageManager().getInstallerPackageName(context.getPackageName()); 或任何其他方法,您将受到保护,不会受到不从 Google Play 商店安装您的移动应用的普通用户的攻击,但任何想要攻击您的移动应用的人都会有几个我上面提到的绕过这种保护的方法。

保护您的移动应用免受攻击者绕过您的检查的一种可能的解决方案是使用运行时自我防御保护或移动应用证明解决方案,我建议您阅读this answer,尤其是强化和屏蔽部分移动应用保护 API 服务器一种可能的更好的解决方案,了解如何阻止您的移动应用在不是您的真正移动应用时正常工作.

你想加倍努力吗?

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

对于移动应用

OWASP Mobile Security Project - Top 10 risks

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

OWASP - Mobile Security Testing Guide:

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

【讨论】:

【参考方案3】:

com.android.vending是play store包名,

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

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

【讨论】:

Huawei AppGallery 是:com.huawei.appmarket。您可以通过以下方式验证应用程序:adb shell pm list packages -i [package name]

以上是关于检测是不是从 Play 商店安装了应用程序的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在运行时可靠地检测到哪个商店安装了 Android 应用程序(Google Play 或亚马逊市场)?

检测当前订阅是不是为 Google Play 商店的试用版?

从 Play 商店安装应用时缺少拆分 APK

在Play商店中正确跟踪安装推介

从 Play 商店安装时,Android Cordova 应用程序崩溃

用户从 Play 商店安装后从应用发送欢迎通知?