防止应用程序克隆者克隆Android应用程序

ABI*_*ABI 5 android

创建了一个使用设备的uniqueID的应用程序,该应用程序由以下代码片段提取

String deviceId = Settings.Secure.getString(getContentResolver(),
            Settings.Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

当用户尝试通过app cloner克隆应用程序时,它会创建不同的deviceID,并且不允许应用程序工作

有没有办法让我们的应用程序不可克隆或

即使克隆了应用程序实例,任何可能的方法都有相同的deviceId?

有没有办法找出应用程序是否在克隆实例中运行?

Ami*_*min 8

像 Cloner 这样的应用程序通常会更改应用程序的包名称,以便您可以检索包名称并检查它是否已更改。

if (!context.getPackageName().equals("your.package.name")){
    // close the app or do whatever
}
Run Code Online (Sandbox Code Playgroud)

此外,他们通常会对克隆的 apk 进行签名,因此签名可能与您的不同,您可以检查签名是否已更改。我通常使用这个功能:

@SuppressLint("PackageManagerGetSignatures")
public static int getCertificateValue(Context ctx){
    try {
        Signature[] signatures = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            try {
                signatures = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNING_CERTIFICATES).signingInfo.getApkContentsSigners();
            }catch (Throwable ignored){}
        }
        if (signatures == null){
            signatures = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
        }
        int value = 1;

        for (Signature signature : signatures) {
            value *= signature.hashCode();
        }
        return value;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 0;
}

public static boolean checkCertificate(Context ctx, int trustedValue){
    return getCertificateValue(ctx) == trustedValue;
}
Run Code Online (Sandbox Code Playgroud)

在发布您的应用程序调用getCertificateValue(context)并记下该值以及包名称之前,请检查该值是否与您在运行时获得的值匹配。

PS:正如@vladyslav-matviienko 所说,黑客总会找到一种方法,因此尝试通过对硬编码的包名称和该值进行一些混淆来使克隆变得更加困难。还要尝试在源代码周围纠缠和传播这些逻辑。