Лаки патчер, как я могу защититься от этого? [дубликат]

этот вопрос уже есть ответ здесь:

Я знаю, что эта тема была открыта несколько раз, и я многому научился, но я наткнулся на проблему мне очень нужен совет.

Я использую LVL с обфускацией. Я изменил по умолчанию LVL много, так что anti-LVL не нарушает его. Тем не менее, Lucky Patcher одним щелчком мыши ломает его! Я попытался увидеть новый сломанный APK. Да, он просто назвал мой "метод allow".

мой вопрос в том, может ли кто-то порекомендовать способ предотвратить Lucky Patcher от его нарушения? Я знаю, что не могу сделать его пуленепробиваемым, но я хочу, чтобы это было не так просто для программного обеспечения с одним щелчком мыши.

5 ответов


код для проверки сертификата

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

чтобы избежать вызова этого кода сертификации, если в режиме отладки

и теперь счастливый patcher checker

этот код проверим его существование. Я декомпилировал все версии Lucky Patcher, и я узнал, что его создатель использовал 2 имени пакета между всеми реальностями. Таким образом, вам нужно только отслеживать новые версии и продолжать добавлять будущие имена пакетов lucky patcher в функции проверки.

также рекомендация, зашифровать строки имен пакетов вместо того, чтобы просто кодировать их, как в Примере, поэтому lucky patcher не выходит с новой версией, которая просто заменяет исправление строк их. Давайте сделаем это трудно для крекеров.

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

В текущей версии (6.4.6) Lucky Patcher генерирует очень короткий токен. Например, реальный токен покупки:

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

способ-проверить, установлен ли lucky patcher, и если да, то покажите сообщение пользователю, а затем убейте свой процесс. Если пользователь имеет его, означает, что он пытается взломать ваше программное обеспечение или другого разработчика. Поэтому лучше не разрешать использовать ваше приложение в телефоне, на котором оно установлено. Борьба с пиратством.


да, и в этом суть моего предложения. В коде реализуйте функцию, которая будет вызываться в определенных действиях, в этих действиях необходимо проверить наличие пакета lucky patcher, установлен он или нет. это довольно легко сделать, и я могу поделиться кодом, если вы не знаете как. Если вы его обнаружите, остановите приложение. Просто не позволяют использовать его, даже если пользователь заплатил за него, лучше него плохой обзор, чем 10000 экземпляров. Кроме того, даже если ваши приложения взломаны, это будет только для LVL lucky patcher не может знать каждое приложение на рынке, которое имеет такой алгоритм против него, и сделает невозможным сделать версию lucky patcher, которая охватывает все приложения на рынке, поскольку когда-либо разработчик напишет ее по-своему, чтобы обнаружить ее. Таким образом, в конце ваше приложение может быть взломано и больше не имеет защиты lvl, но вы никогда не позволите запустить его, если на телефоне установлен lucky patcher. Теперь еще дальше, держите флаг в файле настроек, чтобы определить, если сначала запуск вашего приложения вы обнаружили lucky patcher, в случае, если он взломает его, а затем удаляет lucky patcher. Таким образом, даже если после удаления luckypatcher вы все равно можете прекратить выполнение приложения, пользователю придется снова установить его. И он все время будет винить лаки патчера.


всякий раз, когда Lucky Patcher создает модифицированный файл 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.