幸运的补丁,我怎样才能从它保护? [重复](Lucky patcher, how can I p

2019-07-03 22:33发布

This question already has an answer here:

  • Way to protect from Lucky Patcher / play licensing [closed] 8 answers

I know this topic has been opened multiple times and I learnt a lot but I stumbled across a problem I really need advice on.

I'm using LVL with Obfuscation. I changed the default LVL ALOT so that anti-LVL does not break it. However, Lucky Patcher with one click breaks it! I tried to see the new broken APK. Yes it simply called my "allow method".

My question is if someone can recommend a way to prevent Lucky Patcher from breaking it? I know I can't make it bullet-proof, but I want it at least to be not so easy for one-click software.

Answer 1:

代码来检查您的证书

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());
    }
}

而如何找到哪一个是你的证书,很简单。 你必须产生一个APK,在释放模式,如调试证书是永远释放一个不同。 输出证书串到一个临时的TextView复制它,或者在后续的调用一个文本文件,重要提示:不要将它输出的logcat中,作为字符串是太大,logcat中不会显示这一切,并切断最后一个字符特点:

signatures[0].toCharsString();

example: YourTextView.setText(signatures[0].toCharsString());

现在,请记住,当你返回到调试模式,证书又有所不同,并可能会在每个版本有时是不同的,所以你会得到一个调试地狱。 然后,它是更好地使用下一行有它更容易进行开发时,将其右调用证书测试之前:

if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
    return;
}

所以要避免在调试模式下调用此认证代码,如果

而现在的幸运补丁检查

此代码将检查它的存在。 我反编译幸运修补器的所有版本,我已经发现,它的创造者所使用的所有realeases之间2个名。 所以,你只需要跟踪的新版本,并不断增加未来的幸运补丁包名称检查功能。

另外一个建议,加密包名字符串,而不是只harcoding它们作为例子,太幸运了补丁不会用新版本刚刚替换字符串修补他们出来。 让我们很难让饼干。

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;
}


Answer 2:

由于当前版本(6.4.6),幸运修补程式产生非常短的令牌。 例如,真正的购买令牌:

felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW

这是幸运的令牌:

kvfmqjhewuojbsfiwqngqqmc

非常简单的解决办法是检查令牌的字符串长度

@Override public void onIabPurchaseFinished(IabResult result, Purchase info) {
    if (info.getToken().length < 25) {
        Log.wtf("PIRATE", "PIRATE DETECTED");
        return;
    }
}


Answer 3:

从某种意义上说,是检查是否安装补丁的幸运,如果是这样,那么显示的信息给用户,事后杀死你的进程。 如果用户拥有它,意味着他试图破解软件或其他开发人员的一个。 所以,最好不要允许使用你的应用程序中有它安装了一个电话。 打击盗版。



Answer 4:

每当幸运修补程式创建一个改装成APK文件,它总是用不同的包名结束了,因为你不能在同一个软件包名称下运行两个应用程序。

下面是一个检查,如果你的代码是错误的包名称下运行的简单的解决方案:

PackageManager pm = getPackageManager();

try {
    PackageInfo packageInfo = pm.getPackageInfo("YOUR_PACKAGE_NAME",PackageManager.GET_ACTIVITIES);
} catch (PackageManager.NameNotFoundException e){
    finish(); 
    //If you get here, your code is running under a different package name... Kill the process!
}

我只是调用finish(); 我的应用程序,我不能打破它,但它可能是最好使用android.os.Process.killProcess(android.os.Process.myPid()); 作为@PerracoLabs建议。



Answer 5:

是的,这是我的建议的尖尖的。 在你的代码,实现了将在某些操作调用的函数,这些行动必须检查包装幸运修补的,如果这是安装或没有。 这是很容易做到的,我可以共享代码,如果你不知道怎么办。 如果您发现它,然后停止你的应用程序。 只是不允许使用它,即使所支付的用户,改善自己的差评超过10000个非法拷贝。 然后还,即使您的应用程序被破解,这将是只为LVL,幸运的补丁无法知道有反对这样的算法,市场每一个应用程序,就不可能使覆盖所有的应用程序幸运的补丁版本在市场上,像以前开发商会写自己的方式来检测它。 所以在最后你的应用程序可能会被破解,并不再有LVL保护,但你永远不会允许,如果手机已经安装了补丁幸运运行它。 现在,甚至进一步,保持标志设置文件,如果在你的应用程序第一次运行你发现幸运补丁检测,万一他的裂缝,然后卸载补丁的幸运。 这样,即使用户卸载luckypatcher后,您仍然可以停止执行您的应用程序,用户将不得不再次重新安装你的未开裂的应用程序。 他会责备幸运修补所有的时间。 https://www.androidjungles.com/lucky-patcher-apk/



文章来源: Lucky patcher, how can I protect from it? [duplicate]