Подтвердить что ты не робот

Удачливый патчер, как я могу защитить от него?

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

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

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

4b9b3361

Ответ 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 в режиме деблокирования, поскольку сертификат отладки всегда отличается от выпуска. Выведите свою строку сертификата во временное текстовое окно, чтобы скопировать ее, или в текстовый файл со следующим вызовом. ВАЖНО: НЕ ВЫПОЛНИТЕ его логарифм, поскольку строка слишком велика, и лог-код не отобразит все это и вырезает последний char символы:

signatures[0].toCharsString();

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

Теперь помните, что когда вы вернетесь в режим отладки, сертификат снова будет другим, и иногда может быть различным в каждой сборке, поэтому вы получите отладочный ад. Тогда лучше использовать следующую строку, чтобы упростить ее разработку и разместить ее прямо перед вызовом тестирования сертификата:

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

Поэтому не вызывайте этот код сертификации, если в режиме отладки

И теперь счастливый патч-чекер

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

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

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

Ответ 2

В текущей версии (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;
    }
}

Ответ 3

Реализуйте функцию, которая вызывается при определенных действиях и которая проверяет, установлен ли на устройстве пакет LuckyPatcher.

Если найдено, выйдите из приложения. Не позволяйте использовать его независимо от того, оплачивается он или нет, лучше плохие отзывы, чем тысячи нелегальных копий. В качестве альтернативы вы можете показать сообщение о том, что LuckyPatcher был найден и приложение не может быть запущено.

Если LuckyPatcher пропатчил ваше приложение, что означает, что оно взломало вашу реализацию LVL, то, по крайней мере, ваше приложение не будет выполнено из-за обнаружения пакета LuckyPatcher.

Ответ 4

Всякий раз, когда 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.

Ответ 5

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