ATTENZIONE! Non rimuovere i jump o renderli non condizionali! L'ottimizzatore si bloccherà e la patch non funzionerà su ART! Per evitarlo, usa i jump condizionali. Per esempio, se devi fare il jump, sostituiscilo con if-eq v0,v0 (bytes: 32 00 ?? ??)
. Se non dovesse esserci la necessità di fare il jump su un istruzione precisa, puoi inserire un jump nella forma if-ne v0,v0 (bytes: 33 00 ?? ??)
; o comunque un qualunque equivalente.
Il file della patch deve avere lo stesso nome dell'APK obiettivo (è case-sensitive).
Se il file è una patch specifica da sovrapporre ad una già esistente, aggiungi qualunque testo all'inizio del nome e salvalo con quello già esistente.
If you want to write a patch once a series of programs on a single firm, then the end the custom patch file name, you can use _%25ALL%25
, for example the name of the patch for all the votes SVOX
will look like this: com.svox.classic.langpack_%25ALL%25.txt
. On the _%25ALL%25
is replaced by the name part of the package, which varies depending on the application of the firm.
Do not use special characters/formatting in the patch file (single spaces only). If you need to make a patch for several programs of one firm and add a prefix at the beginning, you can use%25ALL%25_
and _%25ALL%25
. (Example name: chelpus.%25ALL%25_com.android._%25ALL%25.txt
). You can use to custom patch content %25PACKAGE_NAME%25
for path to files, this %25PACKAGE_NAME%25
replace to package name of target applications.
Per cercare modelli di byte usa IDA Pro 6.1. Può aprire la dalvik-cache, odex, librerie e classes.dex.
Se vuoi creare una patch per dalvik-cache o odex, non dimenticarti che i byte di dati possono differire nelle varie versioni dei firmware. Tieni a mente che non tutti i classes.dex nei byte coincidono con la dalvik-cache e l'odex. In questo esempio puoi vederlo, se apri classes.dex e odex-file in IDA Pro.
[INIZIA]
<i commenti per la patch sono visibili nella pre-patch dell'utente>
Patch per XYZ Pro 5.0.5
[PACCHETTO]
<spacchetta il file classes.dex e applica tutte le patch dal [CLASSI] ad esso. E genera, in base ai classes.dex modificati il file odex.>
[CLASSI]
<cerca/sostituisci pattern per classes.dex (guarda più giù)>
{"cerca":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
{"gruppo":"1"}
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"rimpiazzato":"12 00 6A W00 W01 W02 00 00 12 S0 0F 00"}
[LIB]
<cerca/sostituisci pattern per tutte le librerie con nomi nativi (guarda più giù)>
{"nome":"libtitanium.so"}
{"originale":"00 ** 50 e2"}
{"rimpiazzato":"00 00 50 e1"}
[LIB]
<cerca/sostituisci pattern per tutte le librerie native>
{"nome":"*"}
{"originale":"00 ** 50 e2"}
{"rimpiazzato":"00 00 50 e1"}
[ALTRI FILE]
<cerca/sostituisci pattern per altri files chiamati /data/data/Package_Target_APK/ (guarda sotto)>
{"nome":"/files/shell.dex"}
{"originale":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"rimpiazzato":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}
↩
[OTHER FILES]
<cerca/inserisci pattern per altri files chiamati /mnt/sdcard/ (se il percorso /mnt/sdcard/ non viene trovato, Lucky Patcher cercherà altre varianti per sdcard)>
{"nome":"/mnt/sdcard/Android/package-name/files/lives.xml"}
{"originale":"63 68 65 6C 70 61"}
{"inserisci":"63 68 65 6c 70 61 61 61"}
[FILE_IN_APK]
<cerca/sostituici pattern per file da un apk (questa patch funzionerà solo per apk ricostruiti con questa patch specifica)>
{"nome":"assets/bin/Data/Managed/O7SharpCompress.dll"}
{"originale":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"rimpiazzato":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}
[AGGIUNGI-BOOT]
<Aggiungi automaticamente la patch utente corrente alla BootList. Dovrebbe essere usata nella libreria della patch (o nella patch [CLASSES] senza [ODEX] o senza [PACKAGE])>
[FINE]
<commenti della patch che saranno visibili agli utenti nel post-patch>
Congratulazioni, l'applicazione è stata modificata!
"cerca"
- cerca, ti permette di cercare un pattern e store bytes in specifiche posizioni.
{"cerca":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
In questo esempio i bytes verdi maschereranno il pattern, mentre quelli in giallo contrassegnati con R00 -> R02 saranno memorizzati.
I byte immagazzinati devono essere in ordine R00, R01, R02, R03...
I byte immagazzinati non possono essere ripetuti.
"gruppo"
- contrassegna i pattern del gruppo (gruppi di numeri potrebbero essere di 1 o più). Probabilmente ti starai chiedendo 'Che cosa significa?'. Bene, quello che significa è che se almeno un pattern del gruppo funziona, verrà mostrato un messaggio di successo. Questo è utile quando stai cercando di fare una patch universale per varie versioni di una particolare applicazione (per esempio, patcha tutte le versioni del Google Play per disabilitare gli aggiornamenti automatici).
"originale"
- Questo è un pattern maschera usato per cercare il punto in cui la patch verrà applicata.
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
In questo esempio i bytes in verde comporranno il tuo pattern maschera, mentre i bytes in giallo saranno i jolly (??, **)
"sostituito"
- questo seguirà un modello "originale", questo sarà quello con cui sarà sovrascritto l'offset.
{"rimpiazzato":"12 00 6A W00 W01 W02 00 00 12 00 0F 00"}
In this example, bytes in green will overwrite the target location.. bytes in yellow are stored bytes from the previously executed "search"
"nome"
- questo è usato per marcare una specifica libreria con un nome (guarda sopra in [LIB])
S0 , S1, SQ - imposta la variabile minima a 0 (converti i numeri hex in: 43->03,54->04...) or 1 (converti i numeri hex in: 43->13,04->14...) rispettivamente o imposta, SQ converti gli hex 34->44, 51->11 ...
Per esempio, c'è una variabile : const/4 v?,0x00
. il punto interrogativo mostra, che i numeri di var\
sono sconosciuti (per esempio, questo è stato cambiato nella nuova versione), ma sei sicuro che questo valore è uguale a 0 e vuoi impostarlo a 1. In questo caso il pattern sarà:
{"originale":"12 ?? ?? ?? ?? ??"}
{"rimpiazzato":"12 S1 ?? ?? ?? ??"}
E viceversa, per impostare la variabile come 0:
{"originale":"12 ?? ?? ?? ?? ??"}
{"rimpiazzato":"12 S0 ?? ?? ?? ??"}
"replace_from_file"
- this will follow an "original"
statement, this is what the offset will be overwritten with bytes from the file (file must saved near custom patch).
{"replace_from_file":"array.bin"}
Questo è fatto in modo da evitare di scrivere templates molto lunghi da sostutuire.
"inserisci"
- Se vuoi inserire la lunghezza dei dati, è migliore della lunghezza del pattern originale.
(Example)file before patch contain:"chelpa end"
{"originale":"63 68 65 6C 70 61"}
{"inserisci":"63 68 65 6c 70 61 61"}
il file dopo la patch contiene:"chelpaa end"
[LIB-ARMEABI],[LIB-ARMEABI-V7A],[LIB-MIPS] o [LIB-X86] - per librerie da /lib/armeabi/, /lib/armeabi-v7a/, /lib/mips/, /lib/x86/
.
[ODEX-PATCH] - Una patch ha appena creato un file odex. per esempio, un applicazione è stata patchata con la modalità automatica per rimuovere la Verifica della Licenza, ma hai bisogno di applicare altre modifiche usando una Patch Specifica. Se usi una semplice [PACCHETTO]-[CLASSI], [ODEX] o [CLASSI]-[ODEX], il file odex sarà creato senza alcun cambiamento e solo quando patchato.
Esempio:
[INIZIA]
[PATCH-ODEX]
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"rimpiazzato":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[FINE]
Congratulazioni! ODEX modificato!
[CLASSI] senza [PACCHETTO] - Fa una patch alla dalvik-cache delle applicazioni. Non dimenticare che il sistema aggiorna periodicamente la dalvik-cache delle applicazioni e quindi tutti i cambiamenti scompariranno. Perciò dovremo aggiungere [ADD-BOOT]. La patch per la dalvik-cache non è aggiornata ed è inaffidabile. Ma è necessaria per la ROM Toolbox, perchè essa non lavora molto bene con i files odex.
Esempio:
[INIZIA]
[CLASSI]
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"rimpiazzato":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[AGGIUNGI-BOOT]
[FINE]
Congratulazioni!
[ODEX] - Copia la dalvk-cache in /data/app/ e rinominala come un file odex, quindi tutte le patch saranno applicate a questo file odex. I Cecksum del file odex saranno sbagliati e non potranno superare la verifica a differenza del file odex creato[PACKAGE] - [CLASSES].
Esempio:
[INIZIA]
[ODEX]
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"rimpiazzato":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[FINE]
Congratulazioni!
[CLASSI]-[ODEX] - Fa una patch alla dalvik-cache e copiala in /data/app/ e rinominala come file odex. I Checksum del file odex e della dalvik-cache saranno sbagliati e non potranno superare la verifica, a differenza del file odex creato [PACCHETTO] - [CLASSIO].
Esempio:
[INIZIA]
[CLASSI]
{"originale":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"rimpiazzato":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[ODEX]
[FINE]
Congratulazioni!
[COMPONENTE] - Attiva o disattiva i componenti delle Applicazioni.
Esempio:
[INIZIA]
[COMPONENTE]
{"disabilita":"com.superApp.adsActivity"}
{"abilita":"com.superApp.fullVersion.Provider"}
{"disabilita":"com.android.vending.CHECK_LICENSE"}
[FINE]
Congratulazioni!
[SQLITE] - Spesso l'applicazione bersaglio potrebbe cambiare qualcosa nel database, quindi come aiuto vi è questa possibilità:
Esempio:
[INIZIA]
Azzeramento della prova
[SQLITE]
{"database":"/data/data/com.package.megaapp/databases/settings.db"}
{"esegui":"DELETE FROM table_settings WHERE name = 'SETTING__LIC'"}
{"esegui":"UPDATE table_settings SET UsedDays=0 WHERE name='Trial_set'"}
[FINE]
Congratulazioni! Il tuo periodo di prova è stato azzerato!
database - percorso dal database nel dispositivo, oppure puoi usare solo il nome del database per far cercare a Lucky Patcher il file.
esegui - query SQLite.
[IMPOSTA_PERMESSI] - Comandi linux analoghi "chmod permissions nome_file" per file nella cartella data dell'applicazione:
Esempio:
[INIZIA]
Azzeramento della prova
[IMPOSTA_PERMESSI]
{"nome_file":"/files/stats"}
{"permessi":"777"}
[ALTRI FILE]
{"nome":"/files/stats"}
{"originale":"4D 4D 46 31"}
{"rimpiazzato":"00 4D 46 30"}
[IMPOSTA_PERMESSI]
{"nome_file":"/files/stats"}
{"permessi":"444"}
[FINE]
Congratulazioni! Il tuo periodo di prova è stato azzerato!
[COPIA_FILE] - Copia il file dalla dir di Lucky Patcher fino alla cartella con un nuovo nome file:
Esempio:
[INIZIA]
Copia file con soldi
[COPIA_FILE]
{"nome_file":"soldi_per_gioco.bin"}
{"da":"/data/data/game_package/files/settings.xml"}
[FINE]
Congratulazioni! Il tuo file è stato copiato e i tuoi soldi modificati!