web-dev-qa-db-fra.com

Patcher chanceux, comment puis-je m'en protéger?

Je sais que ce sujet a été ouvert à plusieurs reprises et que j'ai beaucoup appris, mais je suis tombé sur un problème sur lequel j'ai vraiment besoin de conseils.

J'utilise LVL avec Obfuscation. J'ai changé beaucoup le LVL par défaut pour que l'anti-LVL ne le casse pas. Cependant, Lucky Patcher en un clic le casse! J'ai essayé de voir le nouveau APK cassé. Oui, il a simplement appelé ma "méthode allow".

Ma question est de savoir si quelqu'un peut recommander un moyen d'empêcher Lucky Patcher de le casser. Je sais que je ne peux pas le rendre pare-balles, mais je veux au moins que ce ne soit pas si facile pour un logiciel en un clic.

18
Snake

Code pour vérifier votre certificat

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

Et comment trouver quel est votre certificat, simple aussi. Vous devez générer un fichier APK, en mode de publication, car le certificat de débogage est toujours différent de celui de version. Exportez votre chaîne de certificat dans une vue texte temporaire pour la copier, ou dans un fichier texte lors du prochain appel. IMPORTANT: NE le transférez pas dans le logcat, car la chaîne est trop grande et le logcat ne l'affichera pas tout et coupera le dernier caractère. personnages:

signatures[0].toCharsString();

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

Maintenant, rappelez-vous que lorsque vous revenez au mode de débogage, le certificat est à nouveau différent et peut être parfois différent sur chaque génération, vous obtiendrez ainsi un enfer de débogage. Ensuite, il est préférable d’utiliser la ligne suivante pour faciliter le développement et la placer juste avant d’appeler le test de certificat:

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

Donc, évitez d'appeler ce code de certification si vous êtes en mode débogage

Et maintenant, le chanceux patcher checker

Ce code va vérifier son existence. J'ai décompilé toutes les versions de Lucky Patcher et j'ai découvert que son créateur utilisait 2 noms de paquets entre tous les vrais. Il vous suffit donc de garder trace des nouvelles versions et d’ajouter les futurs noms de paquetages Lucky Patcher aux fonctions de vérification.

Il est également recommandé de chiffrer les chaînes de noms de packages au lieu de simplement les coder comme dans l'exemple, de sorte que Lucky Patcher ne propose pas une nouvelle version qui remplace simplement les chaînes qui les corrigent. Permet de rendre difficile pour les biscuits.

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

Depuis la version actuelle (6.4.6), Lucky Patcher génère un jeton très court. Par exemple, un jeton d'achat réel:

felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW

Et c'est un coup de chance:

kvfmqjhewuojbsfiwqngqqmc

La solution assez simple consiste à vérifier la longueur de la chaîne du jeton

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

Une façon de procéder consiste à vérifier si Lucky Patcher est installé et, si tel est le cas, affichez un message à l’utilisateur puis tuez votre processus. Si un utilisateur le possède, cela signifie qu'il essaie de déchiffrer votre logiciel ou celui d'un autre développeur. Il est donc préférable de ne pas autoriser l’utilisation de votre application dans un téléphone sur lequel elle est installée. Combattre le piratage.

0
PerracoLabs

À chaque fois que Lucky Patcher crée un fichier APK modded, il se termine toujours par un nom de package différent, car vous ne pouvez pas exécuter deux applications sous le même nom. 

Voici une solution simple qui vérifie si votre code s'exécute sous le mauvais nom de package: 

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

J'appelle simplement finish(); sur mon application et je ne peux pas la casser, mais il vaut peut-être mieux utiliser Android.os.Process.killProcess(Android.os.Process.myPid()); comme @PerracoLabs l'a suggéré.

0
Epicality

Oui, et c’est le point de ma suggestion . Dans votre code, implémentez une fonction que vous allez appeler dans certaines actions. Dans cette action, vous devez vérifier le package de Lucky Patcher, que celui-ci soit installé ou non. c'est assez facile à faire et je peux partager le code si vous ne savez pas comment. Si vous le détectez, arrêtez votre application. Ne permettez pas de l'utiliser même si l'utilisateur a payé, mieux sa mauvaise critique que 10000 copies illégales . Ensuite, même si vos applications sont fissurées, ce ne sera que pour LVL, un chanceux patcher ne peut pas tout savoir. une seule application sur le marché qui a un tel algorithme, ce qui rendrait impossible la création d’une version chanceuse de patcher couvrant toutes les applications du marché, car chaque développeur l’écrirait de sa propre manière pour le détecter. Donc, à la fin, votre application pourrait être fissurée et ne plus bénéficier de la protection de niveau, mais vous ne pourrez jamais l'exécuter si le téléphone est équipé de Patcher chanceux. Maintenant encore plus loin, conservez un indicateur dans un fichier de paramètres pour détecter si, lors de la première exécution de votre application, vous avez détecté Lucky Patcher, au cas où il le craquerait, puis désinstallera Lucky Patcher. De cette façon, même si, après que l'utilisateur a désinstallé luckypatcher, vous pouvez toujours arrêter l'exécution de l'application, l'utilisateur devra réinstaller votre application non fissurée. Et il accusera tout le temps le patcher chanceux.

0
PerracoLabs