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

Man*_*tel 8 android

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

Jav*_* S. 23

此方法将检查您的应用是否已从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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这仍然有效吗?当我的用户侧载我的应用程序时,我向他们显示一个弹出窗口,其中一些人抱怨即使他们通过 Playstore 安装了应用程序,他们也会看到弹出窗口。 (2认同)
  • 如何检测该应用程序是从华为商店安装的? (2认同)

Exa*_*a37 5

绕过检查

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

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

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

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

保护支票

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

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

保护您的移动应用程序免受攻击者绕过您的检查的一个可能的解决方案是使用运行时自我防御保护或移动应用程序证明解决方案,我建议您阅读此答案,特别是“强化和屏蔽移动应用程序” 、“保护 API”部分服务器可能的更好解决方案,了解如何防止您的移动应用程序在不是正版移动应用程序时正常工作。

您想加倍努力吗?

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

对于移动应用程序

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

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

OWASP - 移动安全测试指南

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