android - usar - como utilizar bien lucky patcher
Lucky patcher, ¿cómo puedo protegerme de él? (5)
Esta pregunta ya tiene una respuesta aquí:
Sé que este tema se ha abierto varias veces y he aprendido mucho, pero me encontré con un problema sobre el que realmente necesito consejos.
Estoy usando LVL con ofuscación. Cambié el valor predeterminado de LVL ALOT para que el anti-LVL no lo rompa. Sin embargo, Lucky Patcher con un solo clic lo rompe! Traté de ver el nuevo APK roto. Sí, simplemente se llama mi "método de permiso".
Mi pregunta es si alguien puede recomendar una manera de evitar que Lucky Patcher la rompa. Sé que no puedo hacerlo a prueba de balas, pero quiero que al menos no sea tan fácil para el software de un solo clic.
A partir de la versión actual (6.4.6), Lucky Patcher genera un token muy corto. Por ejemplo, token de compra real:
felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW
Y eso es Lucky Token:
kvfmqjhewuojbsfiwqngqqmc
La solución bastante sencilla es comprobar la longitud de la cadena del token
@Override public void onIabPurchaseFinished(IabResult result, Purchase info) {
if (info.getToken().length < 25) {
Log.wtf("PIRATE", "PIRATE DETECTED");
return;
}
}
Código para comprobar su certificado.
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());
}
}
Y cómo encontrar cuál es tu certificado, simple también. Debe producir un APK, en modo de liberación, ya que el certificado de depuración es siempre diferente del de la versión. Envíe su cadena de certificado a una vista de texto temporal para copiarla, o a un archivo de texto con la siguiente llamada, IMPORTANTE: NO envíe la logcat, ya que la cadena es demasiado grande y la logcat no lo mostrará todo y cortará la última char caracteres:
signatures[0].toCharsString();
example: YourTextView.setText(signatures[0].toCharsString());
Ahora, recuerde que cuando vuelva al modo de depuración, el certificado vuelve a ser diferente, y puede ser diferente a veces en cada compilación, por lo que obtendrá un infierno de depuración. Entonces es mejor usar la siguiente línea para que sea más fácil durante el desarrollo y colocarla justo antes de llamar a la prueba de certificado:
if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
return;
}
Así que evite llamar a este código de certificación si está en modo de depuración
Y ahora el afortunado inspector de parches.
Este código comprobará su existencia. Descompilé todas las versiones de Lucky Patcher y descubrí que su creador usó 2 nombres de paquetes entre todas las versiones. Por lo tanto, solo necesita realizar un seguimiento de las nuevas versiones y seguir agregando futuros nombres de paquetes de Lucky Patcher a las funciones de verificación.
También es una recomendación, cifrar las cadenas de nombres de paquetes en lugar de simplemente codificarlos como en el ejemplo, para que Lucky Patcher no presente una nueva versión que simplemente reemplace las cadenas que los parchean. Vamos a dificultar las galletas.
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;
}
Cada vez que Lucky Patcher crea un archivo APK modded, siempre termina con un nombre de paquete diferente, ya que no puede ejecutar dos aplicaciones bajo el mismo nombre de paquete.
Aquí hay una solución simple que comprueba si su código se está ejecutando con el nombre de paquete incorrecto:
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!
}
Acabo de llamar finish();
en mi aplicación y no puedo romperla, pero podría ser mejor usar android.os.Process.killProcess(android.os.Process.myPid());
Como sugirió @PerracoLabs.
Sí, y ese es el punto de mi sugerencia. En su código, implemente una función que le llamarán en ciertas acciones, en estas acciones debe verificar el paquete de Lucky parche, si está instalado o no. Esto es bastante fácil de hacer y puedo compartir el código si no sabes cómo hacerlo. Si lo detectas, entonces detiene tu aplicación. Simplemente no permita que lo use, incluso si el usuario lo pagó, mejor su mala crítica que las 10000 copias ilegales. Además, incluso si sus aplicaciones están dañadas, será solo para LVL, Lucky Patcher no puede conocer todas las aplicaciones en el mercado que tienen dicho algoritmo en su contra, y haría imposible crear una versión de Lucky Patcher que cubra todas las aplicaciones. En el mercado, como siempre, el desarrollador lo escribiría a su manera para detectarlo. Así que al final, su aplicación podría estar dañada y ya no tendrá la protección de lvl, pero nunca permitirá que se ejecute si el teléfono tiene instalado el parche de la suerte. Ahora aún más, mantenga una bandera en un archivo de configuración para detectar si al principio de su aplicación detectó un parche de suerte, en caso de que se rompa y luego desinstale el parche de suerte. De esta manera, incluso después de que el usuario desinstale luckypatcher, aún puede detener la ejecución de la aplicación, el usuario tendrá que volver a instalar la aplicación sin crackear de nuevo. Y él culpará a la suerte parcheador todo el tiempo.
Una forma, es verificar si el parche de suerte está instalado y, si es así, mostrarle un mensaje al usuario y luego detener el proceso. Si un usuario lo tiene, significa que está intentando descifrar su software u otro desarrollador. Por lo tanto, es mejor no permitir el uso de la aplicación en un teléfono que la tenga instalada. Lucha contra la piratería.