This question already has answers here:
Way to protect from Lucky Patcher / play licensing [closed]

(8个答案)


3年前关闭。




我知道这个话题已经被打开了很多次,并且我学到了很多东西,但是我偶然发现了一个我确实需要建议的问题。

我正在将LVL与混淆结合使用。我更改了默认的LVL ALOT,以便抗LVL不会破坏它。但是,幸运的Patcher只需单击一下就可以打破它!我试图查看新的损坏的APK。是的,它简单地称为我的“允许方法”。

我的问题是,是否有人可以推荐一种方法来阻止Lucky Patcher破坏它?我知道我无法做到防弹,但我至少希望它对一键式软件不那么容易。

最佳答案

检查您的证书的代码:

public void checkSignature(final Context context) {
    try {
        Signature[] signatures = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;

        if (signatures[0].toCharsString() != <YOUR CERTIFICATE STRING GOES HERE>) {
            // Kill the process without warning. If someone changed the certificate
            // is better not to give a hint about why the app stopped working
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }
    catch (NameNotFoundException ex) {
        // Must never fail, so if it does, means someone played with the apk, so kill the process
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}
接下来如何找到您的证书。您必须在 Release模式下生成APK,因为调试证书与发布证书不同。将您的证书输出到Logcat中:
signatures[0].toCharsString();
请记住,当您返回 Debug模式时,证书再次不同。为避免调试问题,请使用下一行跳过验证:
if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
    return;
接下来是幸运的修补程序检查器。
我反编译了所有版本的Lucky Patcher,发现它的创建者在所有realease之间使用了2个软件包名称。因此,您只需要跟踪新版本并继续添加将来的软件包名称即可。
private boolean checkLuckyPatcher() {
    if (packageExists("com.dimonvideo.luckypatcher"))
        return true;

    if (packageExists("com.chelpus.lackypatch"))
        return true;

    if (packageExists("com.android.vending.billing.InAppBillingService.LACK"))
        return true;

    return false;
}

private boolean packageExists(final String packageName) {
    try {
         ApplicationInfo info = this.getPackageManager().getApplicationInfo(packageName, 0);

        if (info == null) {
            // No need really to test for null, if the package does not
            // exist it will really rise an exception. but in case Google
            // changes the API in the future lets be safe and test it
            return false;
        }

        return true;
    }
    catch (Exception ex) {
        // If we get here only means the Package does not exist
    }

    return false;
}

10-07 23:15