¡ATENCIÓN!: No elimine los saltos de línea ni los haga incondicionales. El Optimizador podría bloquearse y su Parche podría no trabajar en el Tiempo de Ejecución ART. Para evitar este inconveniente, utilice saltos de línea condicionales. Por ejemplo, si hubiera necesidad de un salto, reemplácelo con: "if-eq v0,v0 (bytes: 32 00 ?? ??)". Si no hay necesidad de un salto de línea en un lugar particular, entonces se puede insertar un salto como el del siguiente ejemplo: "if-ne v0,v0 (bytes: 33 00 ?? ??"). También, Ud. tiene la libertad de usar un código equivalente de su propia creación.

– El Parche debe tener el mismo nombre que el del Paquete (APK) al que va dirigido (CUIDADO: Se distingue entre mayúsculas y minúsculas).

– Si el archivo fuera destinado a crear un Parche Personalizado para una Aplicación ya existente, Ud. puede añadir, simplemente, al principio del nombre del archivo cualquier texto, y guardarlo cerca del Parche que ya existe.

– Si Ud. desea crear un Parche que de una sola vez cubra una serie de Aplicaciones en una sola firma, entonces, en el final del nombre de archivo del Parche Personalizado puede utilizar algo similar a este ejemplo, sin las comillas: "_%25ALL%25". Como ejemplo práctico, el nombre de archivo de todos los paquetes de voz de SVOX se vería así: "com.svox.classic.langpack_%25ALL%25.txt" (sin las comillas). Como se puede observar, el texto "_%25ALL%25" reemplaza parte del nombre del archivo, lo cuál, como es lógico, variará dependiendo de la Aplicación a la que se destine el Parche.

– No utilice caracteres o formatos especiales en el nombre del archivo (sólo caracteres y espacios sencillos). Si se necesitara crear un Parche para cubrir varias Aplicaciones con una sola firma, se debe añadir un prefijo al principio del nombre de archivo, como por ejemplo, algo similar a esto: "%25ALL%25_", o bién, "_%25ALL%25". (Un ejemplo más para el nombre: chelpus.%25ALL%25_com.android._%25ALL%25.txt). Para el contenido del Parche Personalizado se podría utilizar, por ejemplo: "%25NOMBRE_DELPAQUETE%25". Como ejemplo para enrutar los archivos, esto otro: "%25NOMBRE_DELPAQUETE_%25", que reemplazaría al nombre original del APK de las Aplicaciones a las que el Parche iría destinado.

– Para buscar Patrones de bytes, utilice el programa "IDA Pro 6", que puede abrir archivos "dalvik-cache", archivos "odex", así como Bibliotecas y archivos "classes.dex".

– Si quiere parchear archivos "dalvik-cache" o archivos "odex", no olvide que los bytes de datos pueden variar dependiendo de las diferentes versiones de Firmware. Además, tenga en cuenta también que no todos los archivos "classes.dex" coinciden tampoco en bytes con los archivos "dalvik-cache" y "odex". En un caso como el de este ejemplo, esto se podría verificar fácilmente si se abrieran los archivos "classes.dex" y "odex" con el programa "IDA Pro".



– EJEMPLOS PRÁCTICOS –

[BEGIN]

– Aquí se podrán mostrar descripciones del Parche o comentarios adicionales que serán visibles para el Usuario antes de aplicarlo.

•Ejemplo:

Parche para: XYZ Pro 5.0.5


[PACKAGE]

– Descomprime el archivo "classes.dex" y le aplica todos los Parches de [CLASSES]. También genera (basado en los "classes.dex") archivos "odex" modificados.


[CLASSES]

– Patrón: Buscar/Reemplazar "classes.dex" (Ver debajo).

• Ejemplo:

{"search":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
{"group":"1"}
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A W00 W01 W02 00 00 12 S0 0F 00"}


[LIB]

– Patrón: Buscar/Reemplazar el nombre de las Bibliotecas nativas llamadas (ver debajo).

•Ejemplo:

{"name":"libtitanium.so"}
{"apk_build":604+}
{"original":"00 ** 50 e2"}
{"replaced":"00 00 50 e1"}

[LIB]
– Patrón: Buscar/Reemplazar todas las Bibliotecas nativas.
{"name":"*"}
{"original":"00 ** 50 e2"}
{"replaced":"00 00 50 e1"}


[OTHER FILES]

– Patrón: Buscar/Reemplazar otros archivos con otros nombres en: "/data/data/Package_Target_APK/" (Ver debajo).

•Ejemplo:

{"name":"/files/shell.dex"}
{"original":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"replaced":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}


[OTHER FILES]

– Patrón: Buscar/Reemplazar otros archivos con otros nombres en: "/data/data/Package_Target_APK/" (Ver debajo).

•Ejemplo:

{"name":"/mnt/sdcard/Android/package-name/files/lives.xml"}
{"original":"63 68 65 6C 70 61"}
{"insert":"63 68 65 6c 70 61 61 61"}


[FILE_IN_APK]

– Patrón: Buscar/Reemplazar archivo del paquete APK. Este Parche sólo trabajará en APKs recompilados con ese Parche Específico. (Ver debajo).

•Ejemplo:

{"name":"assets/bin/Data/Managed/O7SharpCompress.dll"}
{"original":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"replaced":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}


[ADD-BOOT]

– Añade automáticamente el destinatario actual del Parche a la Lista de Inicio (BootList). Debería usarse para el parcheado de Bibliotecas (O en el Parche [CLASSES] sin [ODEX] o sin [PACKAGE]).


[END]

– Aquí se podrán mostrar comentarios del Parche o de otro tipo y que serán mostrados después de aplicarlo. (Ver debajo)

•Ejemplo:

¡Felicidades! - ¡Enhorabuena, Programa Crackeado! - ¡El Parche ha sido aplicado con éxito! , etc.


– "search" –
– Permite buscar un Patrón de bytes y guardarlo en posiciones determinadas. (Ver debajo)

•Ejemplo:

{"search":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}

* En este ejemplo, los bytes en verde enmascaran su Patrón, mientras que los bytes en amarillo y etiquetados como R00 -> R02 se almacenarán.
* Los bytes almacenados deben seguir un orden; p.ej: R00, R01, R02, R03, etc.
* Los bytes almacenados NO pueden repetirse.


– "group" –
– Marca los Patrones del Grupo (El número del Grupo debería ser igual a [1], o mayor). Ud. se puede estar preguntando; "¿Pero, y qué significa esto?". Bien; lo que significa es, que si por lo menos, un Patrón del Grupo ha conseguido su propósito, se mostrará un mensaje comunicando que el parcheado se ha realizado con éxito. Esto es útil cuando se intenta crear un Parche Universal apto para múltiples versiones de una determinada Aplicación (Por ejemplo, un Parche para todas las versiones de Google Play con el fin de deshabilitar las Actualizaciones Automáticas).


– "apk_build" –
– Aplicar este Patrón únicamente para apk's con recompilado=apk_build. Ud. puede aplicar el Patrón para recompilar>=apk_build (Ejemplo: {"apk_build":"206+"}) o puede aplicarlo para recompilar<=apk_build (Ejemplo: {"apk_build":"206-"}).


– “original” –
– Esto es una máscara para el Patrón, que se utiliza para encontrar el Offset desde dónde el Parche será aplicado. (Ver debajo)

•Ejemplo:

{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}

*En este caso, los bytes en verde enmascaran su Patrón, mientras que los bytes en amarillo son comodines, como por ejemplo: (??, **)


– "replaced" –
– Esto, seguirá a un estado “original”, y es en lo que el Offset será sobreescrito. (Ver debajo)

•Ejemplo:

{"replaced":"12 00 6A W00 W01 W02 00 00 12 00 0F 00"}

* En este ejemplo, los bytes en verde sobreescribirán la ubicación del objetivo. Los bytes en amarillo se almacenan para ser ejecutados previamente.


– "name" –
– Esto se usa para ubicar por su nombre una Biblioteca específica (Ver más abajo en "[LIB]")

•Ejemplo:

S0, S1, SQ

- Estos pares establecen la variable Smali en 0 (convierte el número en: 43-> 03, 54-> 04...) o en 1 (convierte el número hex en: 43-> 13, 04-> 14...) o en SQ (convierte el número hex en: 34-> 44, 51-> 11...) respectivamente.

*Por ejemplo, aquí hay una muestra de esta variable:
const/4 v?,0x00

– El signo de interrogación muestra que el número de variables \var\ es desconocido (como por ejemplo, si éste hubiera sido cambiado en alguna versión más reciente). Pero de lo que sí está Ud. seguro es de que esa variable equivale a [0], y lo que Ud. querría es establecerlo en [1].

En ese caso, el Patrón vendría a ser algo similar a esto:

{"original":"12 ?? ?? ?? ?? ??"}
{"replaced":"12 S1 ?? ?? ?? ??"}

* Y viceversa, para establecer la variable en 0:

{"original":"12 ?? ?? ?? ?? ??"}
{"replaced":"12 S0 ?? ?? ?? ??"}


–"replace_from_file"–
– Esto seguirá a una declaración del "original", y es en lo que el offset se sobreescribirá con bytes desde el archivo. (El archivo debe guardarse cerca del Parche ya existente).

•Ejemplo:

{"replace_from_file":"array.bin"}

* Esto se hace para evitar escribir plantillas muy largas como reemplazo.


– "insert" –
– Se usará en el caso de que Ud. quiera insertar una longitud de datos mayor (o menor) que la longitud de datos del Patrón original. (Ver dabajo)

•Ejemplo:


– 1. El archivo, antes de parchearlo contenía: "chelpa end"
{"original":"63 68 65 6C 70 61"}
– 2. El archivo, después de parchearlo contiene: "chelpaa end"
{"insert":"63 68 65 6c 70 61 61"}


[LIB-ARMEABI], [LIB-ARMEABI-V7A], [LIB-ARM64-V8A], [LIB-MIPS] o [LIB-X86]
–Para Bibliotecas desde: /lib/armeabi/, /lib/armeabi-v7a/, /lib/arm64-v8a/, /lib/mips/, /lib/x86/.


[ODEX-PATCH]
– Es utilizado por el Parche que ya tiene el odex creado. Por ejemplo, una Aplicación ha sido parcheada con el Modo Automático para eliminar la Verificación de Licencias, pero se necesita hacerle cambios adicionales utilizando para ello un Parche Específico. Si utilizamos un Parche simple [PACKAGE]-[CLASSES], [ODEX] o [CLASSES]-[ODEX], el archivo "odex" será creado sin cambios, y a continuación, será re-parcheado.

Ejemplo:

[BEGIN]
[ODEX-PATCH]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[END]
¡Felicidades, ODEX modificado!


[CLASSES] sin [PACKAGE]
– Parchea la Dalvik-Caché de las Aplicaciones. No olvide que de forma predeterminada, el propio Sistema, periodicamente, actualiza la Dalvik-Caché de las Aplicaciones. Al hacer esto, todos los cambios efectuados con anterioridad desaparecerán. Por lo tanto, debemos añadir la secuencia [ADD-BOOT]. Tenga en cuenta que parchear la Dalvik-Caché desactualizada es poco fiable.

•Ejemplo:

[BEGIN]
[CLASSES]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[ADD-BOOT]
[END]
¡Enhorabuena!


[ODEX]
– Copia el archivo "dalvik-cache" en "/data/app/" y lo renombra como "odex-file". Entonces, todos los cambios serán aplicados al odex-file. El checksum del archivo odex será incorrecto y no podrá pasar la inspección, al contrario que el nuevo archivo "odex-file" creado [PACKAGE] - [CLASSES].

•Ejemplo:

[BEGIN]
[ODEX]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[END]
¡Felicidades!


[CLASSES]-[ODEX]
– Parchea el archivo "dalvik-cache". Luego lo copia en "/data/app/" y lo renombra como "odex-file". Los checksums del odex y del dalvik-cache serán diferentes y no podrán pasar la inspección, al contrario que el nuevo archivo "odex-file" creado [PACKAGE] - [CLASSES].

•Ejemplo:

[BEGIN]
[CLASSES]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[ODEX]
[END]
¡Felicidades!


[COMPONENT]
– Habilita o deshabilita componentes de las Aplicaciones.

•Ejemplo:

[BEGIN]
[COMPONENT]
{"disable":"com.superApp.adsActivity"}
{"enable":"com.superApp.fullVersion.Provider"}
{"disable":"com.android.vending.CHECK_LICENSE"}
[END]
¡Enhorabuena!


[SQLITE]
– A veces, la Aplicación de destino puede diferir en algo en su Base de Datos. Entonces, esta secuencia podría ser de ayuda.

•Ejemplo:

[BEGIN]
Trial Reset
[SQLITE]
{"database":"/data/data/com.package.megaapp/databases/settings.db"}
{"execute":"DELETE FROM table_settings WHERE name = 'SETTING__LIC'"}
{"execute":"UPDATE table_settings SET UsedDays=0 WHERE name='Trial_set'"}
[END]
¡Enhorabuena! Ya tiene otro nuevo Periodo de Prueba.


– "database" –
–Es la Ruta hacia la Base de Datos en el Dispositivo. Aunque si lo prefiere, puede utilizar un nombre distinto para la Base Datos con el propósito de que únicamente sea Lucky Patcher quien haga la búsqueda de ese archivo.

– "execute" –
– Consulta o hace una petición a la Base de Datos SQLite.


[SET_PERMISSIONS]
– Análogo al comando de Linux "chmod permissions file_name" para archivos ubicados en el Directorio de Datos de la Aplicación.

•Ejemplo:

[BEGIN]
Trial Reset
[SET_PERMISSIONS]
{"file_name":"/files/stats"}
{"permissions":"777"}

[OTHER FILES]
{"name":"/files/stats"}

{"original":"4D 4D 46 31"}
{"replaced":"00 4D 46 30"}

[SET_PERMISSIONS]
{"file_name":"/files/stats"}
{"permissions":"444"}

[END]
¡Enhorabuena! Ya tiene otro nuevo Periodo de Prueba.


[COPY_FILE]
– Copia el archivo desde el Directorio de Lucky Patcher para enrutarlo con un nuevo nombre de archivo

•Ejemplo:

[BEGIN]
Copy file with money
[COPY_FILE]
{"file_name":"money_for_game.bin"}
{"to":"/data/data/game_package/files/settings.xml"}

[END]
¡Felicidades! Se ha copiado su archivo y su crédito ha sido modificado.


[SHARED-PREFERENCES]
– Editor del archivo "shared preferences.xml" (permite insertar o eliminar variables):
•Ejemplo:

[BEGIN]
Set more money
[SHARED-PREFERENCES]

{"file_name":"hillclimbprefs.xml"}
{"insert":"int"}
{"pref_name":"coins"}
{"value":"550000"}

{"insert":"string"}
{"pref_name":"license_status"}
{"value":"licensed"}

{"insert":"long"}
{"pref_name":"time_for_license_verify"}
{"value":"365000"}

{"delete":"boolean"}
{"pref_name":"unlicensed"}

{"file_name":"hillclimbprefs_config.xml"}
{"insert":"float"}
{"pref_name":"result_table"}
{"value":"123.4"}

[END]
¡Felicidades! Su archivo se ha copiado y la suma de dinero se ha modificado.