幸运的补丁,我该怎样保护呢? [重复]

问题描述 投票:21回答:5

这个问题在这里已有答案:

我知道这个主题已多次打开,我学到了很多,但我偶然发现了一个我真正需要建议的问题。

我正在使用LVL和Obfuscation。我更改了默认的LVL ALOT,以便防LVL不会破坏它。但是,Lucky Patcher只需点击一下即可打破它!我试图看到新破坏的APK。是的,它只是简称为“允许方法”。

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

android android-lvl
5个回答
37
投票

用于检查证书的代码

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,因为调试证书总是与发行版证书不同。将证书字符串输出到临时文本视图以将其复制,或者输出到下一次调用的文本文件,重要信息:不要将其输出到logcat,因为字符串太大而且logcat不会显示所有内容并删除最后一个字符串特点:

signatures[0].toCharsString();

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

现在,请记住,当您返回调试模式时,证书会再次出现不同,有时可能会在每次构建时有所不同,因此您将获得调试地狱。然后最好使用下一行在开发时更容易,并在调用证书测试之前将其放置正确:

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

因此,如果处于调试模式,请避免调用此认证码

现在是幸运的补丁检查员

此代码将检查其存在。我反编译所有版本的Lucky Patcher,我发现它的创建者在所有版本之间使用了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;
}

4
投票

截至当前版本(6.4.6),Lucky Patcher生成非常短的令牌。例如,真实购买令牌:

felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW

那就是Lucky Token:

kvfmqjhewuojbsfiwqngqqmc

非常直接的解决方案是检查令牌的字符串长度

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

0
投票

一种方法是检查是否安装了幸运的修补程序,如果是,则向用户显示消息,然后终止您的进程。如果用户拥有它,则意味着他正试图破解您的软件或其他开发人员的软件。所以最好不要在安装了它的手机中使用你的应用程序。打击盗版。


0
投票

每当Lucky Patcher创建一个modded 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建议。


0
投票

是的,这是我的建议的尖锐。在您的代码中,实现一个您将在某些操作中调用的函数,在这些操作中,您必须检查幸运补丁程序包(如果已安装)。这很容易做到,如果你不知道怎么做,我可以分享代码。如果您检测到它,请停止您的应用。只是不允许使用它,即使用户付费,更好的是他的不良评论比10000非法拷贝。然后,即使您的应用程序被破解,它也只适用于LVL,幸运的修补程序无法知道市场上每个具有此类算法的应用程序,并且无法制作涵盖所有应用程序的幸运修补程序版本在市场上,开发人员会以自己的方式来检测它。所以最后你的应用程序可能会破解并且不再具有lvl保护,但如果手机安装了幸运的修补程序,你永远不会允许它运行它。现在更进一步,在设置文件中保留一个标志,以检测您是否在第一次运行应用程序时检测到幸运的修补程序,以防他破解并卸载幸运的修补程序。这样,即使在用户卸载luckypatcher之后,您仍然可以停止执行应用程序,用户将不得不再次重新安装未破解的应用程序。他会一直责怪幸运的补丁.https://www.androidjungles.com/lucky-patcher-apk/

© www.soinside.com 2019 - 2024. All rights reserved.