【发布时间】:2016-09-29 03:02:28
【问题描述】:
我想检查并允许使用我的应用,只要它是从 Play 商店下载的,并且没有被其他用户或任何其他来源共享。如果尚未从 Google Play 商店下载该应用,如何阻止用户使用该应用?
【问题讨论】:
标签: android
我想检查并允许使用我的应用,只要它是从 Play 商店下载的,并且没有被其他用户或任何其他来源共享。如果尚未从 Google Play 商店下载该应用,如何阻止用户使用该应用?
【问题讨论】:
标签: android
此方法将检查您的应用是否已从 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(这个)。
【讨论】:
com.google.android.feedback 外,使用相同的代码快照。软件包应用程序列表显示here 显示它与安装无关。有人有同样的情况吗?
我想检查并允许使用我的应用,只要它是从 Play 商店下载的,并且没有被其他用户或任何其他来源共享。
虽然此检查可以通过编程方式实现,但也可以通过在不进行检查的情况下重新打包应用程序或在运行时使用检测框架绕过检查来绕过此检查。这种框架的一个例子是Frida:
将您自己的脚本注入黑盒进程。挂钩任何功能、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,立即查看结果。所有这些都无需编译步骤或程序重新启动。
我写了一个article 来展示如何使用 Frida 绕过 Android 应用程序中的证书固定,并且可以使用相同的方法绕过此检查。唯一的区别是您需要找到正确的 Frida 脚本或自己编写一个并使用它来代替 on 来绕过固定。 Frida 代码共享 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) 是一本用于移动应用安全开发、测试和逆向工程的综合手册。
【讨论】:
com.android.vending是play store包名,
context.packageManager.getInstallerPackageName(context.packageName) 为您获取源包名称。
华为应用库等其他来源下载该应用。但我不确定它的包名是什么
【讨论】:
com.huawei.appmarket。您可以通过以下方式验证应用程序:adb shell pm list packages -i [package name]