Visualizzazione dei risultati da 1 a 1 su 1
  1. #1
    MobiMart Dipendente Staff Collaboratori
    by MobiMart Italia
    500 post500 post

    Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione
    Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione Reputazione
    (1238537)

    User Info Menu

    Smile Creare patch per Lucky Patcher

    Guida per creare patch per Lucky Patcher
    In assenza di una guida in italiano, e dato che anche quella in inglese non è delle migliori, ho riscritto la guida ufficiale di Lucky Patcher completamente in italiano, confrontando le versioni in inglese, russo e spagnolo. Ho aggiunto alcuni chiarimenti nei punti in cui la guida dava troppo per scontato. Spero che possa così essere sufficientemente esaustiva.
    Questa guida spiega esclusivamente la sintassi delle patch e le possibilità offerte da Lucky Patcher. Per poterne fare un uso proficuo, è necessario essere in grado di leggere il codice smali. Inoltre serve sapere come i comandi smali vengono rappresentati nel bytecode dalvik: a questo proposito, l'articolo "Dalvik Opcodes" di Gábor Paller riporta una utile tabella di conversione da dalvik a smali. Per una guida più aggiornata, anche se a mio parere meno immediata, si può fare riferimento a "Dalvik bytecode" sul sito di Android.


    Alcune note preliminari:

    • ATTENZIONE! Non rimuovere i salti e non renderli acondizionali! L'ottimizzatore si bloccherà e la tua patch non funzionerà su ART! Per evitare questo, usa i salti condizionali. Ad esempio, se c'è bisogno che un salto venga sempre effettuato, sostituisci il salto con if-eq v0,v0 (bytes: 32 00 ?? ??). Se al contrario in un punto in particolare non si vuole mai saltare, si può inserire un salto come if-ne v0,v0 (bytes: 33 00 ?? ??); in ogni caso sentitevi liberi di usare un vostro equivalente.
    • La patch deve avere lo stesso nome dell'identificativo del pacchetto da patchare (tenendo conto di maiuscole e minuscole): ad esempio com.android.vending.txt sarà una patch per il Play Store.
    • Se esiste già una patch per la stessa applicazione, puoi semplicemente aggiungere un qualsiasi testo all'inizio del nome del file e salvarlo a fianco della patch esistente.
    • Se vuoi scrivere una patch per un gruppo di applicazioni dello stesso produttore, allora puoi aggiungere _%ALL% al nome del file; per esempio una patch per tutte le voci SVOX avrà questo nome: com.svox.classic.langpack_%ALL%.txt. _%ALL% sostituisce la parte del nome del pacchetto che varia a seconda dell'applicazione. Non usare caratteri speciali o formattazione nel nome del file (solo spazi singoli). Nel contenuto della patch puoi usare %PACKAGE_NAME% nei percorsi dei files al posto del nome dell'applicazione, indipendentemente da quale sia la specifica applicazione dello stesso produttore che si sta patchando.
    • Se vuoi cercare sequenze di bytes, usa IDA Pro 6.1. Può aprire i files di dalvik-cache, ODEX, librerie e DEX.
    • Se vuoi applicare patch alla dalvik-cache o ad un ODEX, non dimenticare che i bytes di dati in diversi firmware potrebbero variare. E ricorda che non tutti i bytes in classes.dex concidono con quelli nella dalvik-cache e nell'ODEX. Puoi rendertene conto aprendo classes.dex e il corrispondente file ODEX con IDA Pro.
    • Da Lucky Patcher v.6.5.4 è stata aggiunta la possibilità di creare files LPZIP. Sono archivi ZIP che possono contenere l'APK e la patch. L'APK sarà installato, mentre la patch sarà aggiunta a Lucky Patcher.


    Vediamo un primo esempio:

    codice:
    [BEGIN]
    Patch per XYZ Pro 5.0.5
    
    [PACKAGE]
    
    [CLASSES]
    {"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"}
    
    {"group":"1"}
    {"original":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
    {"replaced":"12 10 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??"}
    
    {"original":"0F 00 00 00 1A 00 00"}
    {"replaced":"?? ?? ?? ?? 12 10 ??"}
    
    {"apk_build":604-}
    {"original":"0F 00 00 00 1A 00 00"}
    {"replaced":"?? ?? ?? ?? 12 10 ??"}
    
    {"classes_name":"classes2.dex"}
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    {"replaced":"12 00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ??"}
    
    [LIB]
    {"name":"libtitanium.so"}
    {"apk_build":604+}
    {"original":"00 ** 50 e2"}
    {"replaced":"00 00 50 e1"}
    
    [LIB]
    {"name":"*"}
    {"original":"00 ** 50 e2"}
    {"replaced":"00 00 50 e1"}
    
    [OTHER FILES]
    {"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]
    {"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"}
    
    [OTHER FILES]
    {"name":"/mnt/sdcard/Android/package-name/files/settings.bin"}
    {"offset":"6CF0"}
    {"replaced":"99 99 65 FF"}
    
    [FILE_IN_APK]
    {"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]
    
    [END]
    Congratulazioni, l'applicazione è stata patchata!
    [BEGIN] - Commenti della patch visibili all'utente prima di applicarla.

    [PACKAGE] - Apre classes.dex e applica ad esso tutte le patch indicate in [CLASSES]. E genera, basandosi sulle modifiche al file classes.dex, il rispettivo file ODEX.

    [CLASSES] - Indica il file classes.dex. Il comando dispone di ulteriori parametri per specificare altri files DEX o determinate condizioni per applicare la patch (vedi sotto).

    [LIB] - Indica le librerie native (vedi sotto).

    [OTHER FILES] - Indica altri files che non siano classi DEX o librerie: puoi indicare files contenuti in /data/data/com.nomepacchetto/ oppure in /mnt/sdcard/ (se /mnt/sdcard/ non viene trovato, Lucky Patcher cercherà in altre varianti del percorso della memoria interna).

    [FILE_IN_APK] - Indica un file contenuto nell'APK (questo tipo di patch viene applicato solo se si sta ricostruendo un nuovo APK, altrimenti verrà ignorato).

    [ADD-BOOT] - Aggiunge automaticamente la patch corrente all'elenco di avvio in modo che la patch venga applicata ad ogni riavvio. Va usato quando si patcha una libreria (o si patcha [CLASSES] senza [ODEX] o senza [PACKAGE]).

    [END] - Commenti alla patch mostrati solo dopo che la patch è stata applicata correttamente.

    "search" - Cerca un pattern di bytes e salva i bytes specificati con R.
    codice:
    {"search":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
    In questo esempio, i bytes esadecimali verranno solo cercati, mentre quelli preceduti da R (R00 -> R02) verranno memorizzati.
    I bytes vanno memorizzati in ordine nelle rispettive celle: R00, R01, R02, R03...
    Le celle dove memorizzare i bytes non vanno ripetute.

    "classes_name" - Usata all'interno di [CLASSES], applica la patch ad uno specifico file DEX (ad esempio: {"classes_name":"classes2.dex"}, {"classes_name":"classes3.dex"}, {"classes_name":"classes.dex"} ...).

    "group" - Denota i pattern di un gruppo (i numeri dei gruppi vanno da 1 in su). Ti potresti chiedere: "Che significa?". Bene, ciò che significa è che se un pattern del gruppo viene trovato, un messaggio di patch correttamente applicata viene mostrato. Questo è utile quando si crea una patch universale per diverse versioni di un'applicazione (ad esempio, una patch per Google Play per disattivare gli aggiornamenti automatici).

    "apk_build" - Si applica solo per le app ove build=apk_build. Puoi applicare la patch anche per build>=apk_build (Es. {"apk_build":"206+"}) o build<=apk_build (Es. {"apk_build":"206-"}).

    "original" - Questa è una maschera per un pattern usato per trovare i bytes da sostituire nel file originale.
    codice:
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    In questo esempio, i bytes esadecimali devono essere uguali a quelli indicati, mentre ?? e ** sono usati come bytes jolly.

    "offset" - Questo è l'offset rispetto all'inizio del file da usare per applicare la patch, espresso in formato esadecimale.
    codice:
    {"offset":"42F6B"}
    "replaced" - segue un pattern "original", ed è quello con cui verrà sostituito. In questo caso, la lunghezza di "original" e "replaced" deve essere identica. In alternativa, "replaced" può seguire anche "offset": in tal caso, la sequenza di bytes in "replaced" verrà applicata a partire dall'offset indicato.
    codice:
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    {"replaced":"12 00 6A W00 W01 W02 00 00 12 10 0F 00"}
    In questo esempio, i bytes esadecimali sostituiranno quelli presenti alla stessa posizione in "original". I bytes preceduti da W saranno presi da quelli memorizzati con la funzione "search" (vedi sopra).
    codice:
    {"original":"12 ?? ?? ?? ?? ??"}
    {"replaced":"12 S1 S0 SQ ?? ??"}
    In questo esempio S0 , S1 e SQ impostano una variabile smali rispettivamente a 0 (converte il numero in: 43->03,54->04...), 1 (converte il numero in: 43->13,04->14...) o nel caso di SQ veranno allineati i numeri (34->44, 51->11). Questo è utile perché in diverse istruzioni i primi 4 bit del byte rappresentano il valore, e gli ultimi 4 bit il registro in cui salvare il valore.
    Ad esempio, c'è questa variabile: const/4 v?,0x00 . Il punto di domanda mostra che non conosciamo il numero della variabile (potrebbe variare a seconda della versione dell'applicazione), ma siamo sicuri che abbia un valore di 0, e vogliamo impostarla a 1. In questo caso inseriremo in "replaced" S1 al posto dei ?? in "original".
    Se al contrario volessimo impostare la stessa variabile a 0, inseriremmo S0.
    Ricordiamoci che i bytes della dalvik-cache e di classes.dex non sono tutti uguali.

    "name" - Serve a specificare il nome di una libreria (vedi sopra in [LIB]). Puoi usare anche "*" come carattere jolly per applicare la patch a più librerie.

    "replace_from_file" - Questo segue una dichiarazione "original" e sostituisce i bytes a partire dalla posizione trovata (con "original" o "offset") con il contenuto di un file specificato, da distribuire insieme alla patch.
    Esempio:
    codice:
    {"replace_from_file":"array.bin"}
    Questo serve a evitare di scrivere modelli di sostituzione lunghissimi se devi sostituire lunghe sequenze di bytes.

    "insert" - Se vuoi inserire dati di lunghezza maggiore o minore di quella del pattern "original". Questo è spesso necessario in vari files di testo. Ad esempio, se il file XML contiene "lives=9", e hai bisogno di cambiarlo in "lives=999", con "insert" lo potrai fare senza modificare ciò che segue "lives=9".
    codice:
    {"original":"63 68 65 6C 70 61"}
    {"insert":"63 68 65 6c 70 61 61"}
    Nell'esempio il file originale contiene: "chelpa end"; dopo la patch conterrà: "chelpaa end"

    Altri comandi:

    [LIB-ARMEABI],[LIB-ARMEABI-V7A],[LIB-ARM64-V8A],[LIB-MIPS] o [LIB-X86] - Specifica l'architettura della libreria da patchare: /lib/armeabi/, /lib/armeabi-v7a/, /lib/arm64-v8a/, /lib/mips/, /lib/x86/.

    [ODEX-PATCH] - Usato per applicare patch a un'applicazione già patchata. Ad esempio, se un'applicazione è stata precedentemente patchata con la modalità automatico di rimozione della verifica della licenza, ma vuoi fare modifiche addizionali con un'altra patch. Se usassi semplicemente [PACKAGE]-[CLASSES], [ODEX] o [CLASSES]-[ODEX], verrebbe ricreato un nuovo file ODEX senza le precedenti modifiche, a cui verrebbe applicata solo l'ultima patch.
    Ad esempio:
    codice:
    [BEGIN]
    [ODEX-PATCH]
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    {"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
    [END]
    Congratulatzioni! ODEX modificato!
    [CLASSES] senza [PACKAGE] - Applica la patch solo alla dalvik-cache. Non dimenticare che il sistema aggiorna periodicamente la dalvik-cache e tutti i cambiamenti spariscono. Per questo è opportuno aggiungere [ADD-BOOT]. La patch per la dalvik-cache è obsoleta poiché è inaffidabile, ma serve per ROM Toolbox, perché non lavora bene con i files ODEX.
    Esempio:
    codice:
    [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]
    Congratulazioni!
    [ODEX] - Copia l'archivo dalvik-cache in "/data/app/" e lo rinomina come file ODEX. Poi applica i cambiamenti al file ODEX. Il checksum dell'archivo ODEX sarà errato e non potrà passare l'ispezione, al contrario del nuovo file ODEX creato con [PACKAGE] - [CLASSES].
    Esempio:
    codice:
    [BEGIN]
    [ODEX]
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    {"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
    [END]
    Congratulazioni!
    [CLASSES]-[ODEX] - Applica la patch alla dalvik-cache. Poi lo copia in "/data/app/" e lo rinomina come file ODEX. I checksums dell'ODEX e della dalvik-cache saranno differenti e non potranno passare l'ispezione, al contrario del nuovo file ODEX creato con [PACKAGE] - [CLASSES].
    Esempio:
    codice:
    [BEGIN]
    [CLASSES]
    {"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
    {"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
    [ODEX]
    [END]
    Congratulazioni!
    [COMPONENT] - Abilita o disabilita le componenti dell'applicazione. A volte le applicazioni disabilitano alcune attività e altre componenti per limitare le funzionalità, perciò questa funzione è utile per riattivarle. Puoi indicare attività, servizi, provider di contenuti e altre componenti. Devi prestare attenzione a rispettare maiuscole e minuscole quando scrivi i nomi delle componenti.
    Esempio:
    codice:
    [BEGIN]
    [COMPONENT]
    {"disable":"com.superApp.adsActivity"}
    {"enable":"com.superApp.fullVersion.Provider"}
    {"disable":"com.android.vending.CHECK_LICENSE"}
    [END]
    Congratulazioni!
    [SQLITE] - A volte è necessario apportare cambiamenti ad un database dell'applicazione, per questo è disponibile la seguente opzione:
    Esempio:
    codice:
    [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]
    Congratulazioni! Il periodo di prova è stato resettato!
    "database" - Puoi inserire il percorso del database sul dispositivo, oppure puoi usare solo il nome del database e lasciare che Lucky Patcher cerchi il file da solo.
    "execute" - Query SQLite.

    [SET_PERMISSIONS] - Analogo al comando Linux "chmod permissions file_name" per i files nella cartella dei dati dell'applicazione (ad esempio per rendere di sola lettura un file dopo averlo modificato).
    Esempio:
    codice:
    [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]
    Congratulazioni! Il periodo di prova è stato resettato!
    [COPY_FILE] - Copia un file dalla cartella delle patch a una cartella del dispositivo, dandogli un nuovo nome:
    Esempio:
    codice:
    [BEGIN]
    Copia il file con il denaro
    [COPY_FILE]
    {"file_name":"money_for_game.bin"}
    {"to":"/data/data/game_package/files/settings.xml"}
    [END]
    Congratulazioni! Il tuo file è stato copiato e il conto aggiornato!
    [SHARED-PREFERENCES] - Usato per modificare i files XML delle impostazioni condivise (shared preferences) inserendo o rimuovendo variabili.
    Esempio:
    codice:
    [BEGIN]
    Imposta più soldi
    [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]
    Congratulazioni! Le impostazioni condivise sono state modificate e il conto aggiornato!
    [PATCH ALL FILES] - Applica una patch a più files in una cartella.
    Esempio:
    codice:
    [BEGIN]
    Modifica i files dell'applicazione
    
    [PATCH ALL FILES]
    
    {"dir":"/data/data/com.jakyl.aftermathxhd/files"}
    {"template":"*.txt"}
    {"original":"63 68 65 6C 70 75 73"}
    {"replaced":"63 68 65 6C 70 75 73"}
    
    {"dir":"/data/data/com.jakyl.aftermathxhd/files"}
    {"template":"*data*.bin"}
    {"original":"63 68 65 6C 70 75 73"}
    {"replaced":"63 68 65 6C 70 75 73"}
    
    {"dir":"/data/data/com.jakyl.aftermathxhd/files"}
    {"template":"settings*"}
    {"original":"63 68 65 6C 70 75 73"}
    {"replaced":"63 68 65 6C 70 75 73"}
    
    [END]
    Congratulazioni!
    "dir" - Cartella dei files da patchare.
    "template" - Maschera per i files da patchare (solo "*" può essere usato come carattere jolly).

    [BLOCK HOSTS] - Blocca gli host specificati.
    Esempio:
    codice:
    [BEGIN]
    Modifica gli host
    
    [BLOCK HOSTS]
    
    {"host":"ya.ru"}
    {"host":"google.com"}
    {"host":"adobe.com"}
    
    [END]
    Congratulations!
    "host" - L'host che si vuole bloccare.

    [ADD_FILE_IN_APK] - Aggiungi un file dalla cartella di Lucky Patcher all'archivio APK. Si applica solo alla ricostruzione dell'APK.
    Esempio:
    codice:
    [BEGIN]
    [ADD_FILE_IN_APK]
    
    {"file_name":"file_for_add.bin"}
    {"to":"asset/start_money.xml"}
    
    {"file_name":"file_for_add_2.bin"}
    {"to":"armeabi-v7a/game.lib"}
    
    [END]
    [RENAME_FILE_IN_APK] - Rinomina un file all'interno dell'archivio APK. Si applica solo alla ricostruzione dell'APK.
    Esempio:
    codice:
    [BEGIN]
    [RENAME_FILE_IN_APK]
    
    {"file_name":"lib/armeabi-v7a/libcr3engine-3-2-X.so"}
    {"new_file_name":"lib/armeabi-v7a/temp.so"}
    
    {"file_name":"res/raw/doc.css"}
    {"new_file_name":"res/raw/pro.css"}
    
    [END]
    [DELETE_FILE_IN_APK] - Elimina un file dall'archivio APK. Si applica solo alla ricostruzione dell'APK.
    Esempio:
    codice:
    [BEGIN]
    [DELETE_FILE_IN_APK]
    
    {"file_name":"res/raw/video_ads.css"}
    
    {"file_name":"res/raw/ads.css"}
    
    [END]
    Dopo aver modificato il tutto, salva e metti il file nella cartella di Lucky Patcher (/sdcard/Android/data/<cartella_di_LuckyPatcher/Files/LuckyPatcher; il percorso varia a seconda del sistema operativo e della versione di Lucky Patcher).
    Ora il programma verrà evidenziato in giallo in Lucky Patcher e potrai applicargli la patch.

    Se hai dubbi, non esitare a fare domande. Buona fortuna!




    Ultima modifica di mrkarim;Ieri a 09:00

    "As I was going over the far famed Kerry mountains..." [Whiskey in the Jar, Canzone popolare irlandese]

    Quota Quota    

  2. Benvenuto

    Per vedere di più di questa discussione, per favore fai il login o registrati.
  3. I seguenti 2 utenti ringraziano stephenp per questo post utile da Tapatalk:


Permessi di invio