„DexPatcher“: pataisykite „Android“ APK naudodami „Java“.

„DexPatcher“ leidžia kūrėjams pataisyti APK naudojant „Java“. Tai turi keletą privalumų, o naudoti DexPatcher yra daug lengviau nei klasikinį Smali metodą.

Tikriausiai matėte arba įdiegėte pakeistas programas, nesvarbu, ar tai jūsų skiriamosios gebos pataisytas rinkiklis, ar tinkinta WhatsApp versija su papildomomis funkcijomis. Tačiau kaip kūrėjai tai daro? Daugeliu atvejų programų šaltinio kodas net nepasiekiamas, tad kaip visa tai veikia? Pirmiausia tai pamatysime, tada pažvelkime į naują įrankį, kuriuo siekiama žymiai palengvinti procesą, ir galiausiai palyginsime jį su populiaria Xposed sistema, kad pamatytumėte, kuo jie skiriasi.

Galbūt girdėjote apie tai, kaip paprastai modifikuojami APK – kūrėjai patys prisijungia prie matricą, pradėkite viską matyti Smalio kalba ir įgykite galimybę keisti dalykus naudodami galią Šaltinis. Pakanka telefono skambučio, kad juos ištrauktų, o tada jie bus pasirengę bendrinti blizgančius naujus APK.

Rimčiau... Pradėkime nuo pradžių. Jei nesate susipažinę su „Android“ programų modifikavimu, jums gali kilti klausimas, kas yra „smali“. Kūrėjai paprastai naudoja „Java“ programavimo kalbą „Android“ programoms koduoti. Tada programa (kompiliatorius) „išverčia“ tą kodą į kitą formatą, tinkamą jūsų įrenginiui, todėl programos pakete (arba APK) yra .dex failų.

Tuo metu nebegalėsite pasiekti pradinio šaltinio kodo (nebent esate kūrėjas arba programa yra atvirojo kodo). Tačiau tai, ką turite, yra APK, nes jis yra įdiegtas jūsų įrenginyje. Iš jo galite gauti dex failus (dažniausiai classes.dex) ir pabandyti juos išversti atgal į jums suprantamą formatą. Štai čia ir pasirodo smali, kaip skaitomesnis, bet patikimesnis vertimas. Galite žengti dar vieną žingsnį ir išversti jį atgal į Java, nors šis procesas nėra pakankamai patikimas – gausite suprantamas rezultatas, bet tikėtina, kad vėl negalėsite jo išversti atvirkščiai, nes kai kurios detalės bus prarastos pakeliui. Kitaip tariant, bet kokie pakeitimai, kuriuos galite atlikti, bus niekiniai, nes negalėsite jo vėl paversti APK, kad galėtumėte jį įdiegti savo įrenginyje... bent jau ne be didelių pastangų.

smali/baksmali iš tikrųjų yra dex formato surinkėjas/išardytojas – tai islandų kalba pažodžiui reiškia. Tačiau dažniausiai nurodome formatą, kurį supranta smali, kai sakome „Smali“ (galvokite apie tai kaip nurodymus apibrėžianti kiekvieną smulkmeną, net jei mums, žmonėms, ne visos jos reikia – todėl ji yra daug vaizdingesnė nei Java). Taip pat atkreipkite dėmesį, kad aukščiau pateiktas paaiškinimas yra šiek tiek supaprastintas, tačiau turėtų būti artimas analogas, tačiau jį vis tiek lengva suprasti.

Ką turėtų daryti kūrėjas, kad pakeistų programą (neturėdamas prieigos prie šaltinio)? Procesas yra daugiau ar mažiau toks:

  1. Gaukite APK (iš žiniatinklio arba iš įrenginio).
  2. Naudokite kažką panašaus apktool dekompiliuoti APK į Smali. (apktool naudoja smali / baksmali, bet daug lengviau dekompiliuoti ir atkurti APK, taip pat rūpinasi išteklių, pvz., XML failų, dekodavimu.)
  3. Ištraukite classes.dex iš APK, tada naudokite dex2jar ir galiausiai Java dekompiliatorius, kad gautų (neišsamų, dažnai sugedusį, bet dažniausiai suprantamą) Java kodą. (Tai neprivaloma, bet gali būti naudinga, nes Smali kalbą suprasti daug sunkiau.)
  4. Nurodykite, ką keisti.
  5. Tiesą sakant, pakeiskite jį tiesiogiai redaguodami Smali kodą.
  6. Arba parašykite modifikaciją Java, sukompiliuokite, vėl iškompiliuokite į Smali, tada nukopijuokite gautą Smali kodą.
  7. Kai viskas baigsis, naudokite apktool dar kartą, kad atkurtumėte APK.
  8. Pasirašykite APK (kad patvirtintumėte autoriaus tapatybę; visi paketai turi būti pasirašyti) ir galiausiai jį įdiekite.

Rašyti Smali kodą yra gana sunku ir dažnai pasitaiko klaidų. Smali programoje galima atlikti mažesnius pakeitimus, tačiau pridėti naujų funkcijų yra sudėtingesnė. Be to, neturėsite kompiliavimo laiko klaidų, todėl net rašybos klaidos gali būti aptiktos tik vykdymo metu. Smali pataisų išplėtimas ir bendrinimas taip pat gali būti varginantis, nes skirtumai dažniausiai būna labai specifiniai konkrečiai APK versijai. Nors yra keletas įrankių, palengvinančių aukščiau paaiškinto proceso dalis (Virtuous Ten studija ateina į galvą), tai vis tiek gali būti nuobodu.

XDA vyresnysis narys „DexPatcher“. Lanchonas siekia išspręsti šias problemas, supaprastindama procesą ir leisdama kūrėjams visiškai išvengti reikalų su Smali. Vietoj to, kūrėjai gali rašyti pataisas vien tik „Java“, o „DexPatcher“ tvarkys visa kita.

Tai turi pagrindinį pranašumą, nes yra lengvai skaitomi ir valdomi pataisų failai. APK pataisymas taip pat tampa patogesnis apskritai. Pamatysime visą pavyzdį, kaip naudoti „DexPatcher“, bet čia trumpai apžvelgiama, ką ji siūlo pirmiausia:

  • Atviro kodo.
  • Kelių platformų: ji turėtų veikti Linux, Mac ir Windows.
  • Pataisos failai: jūsų atlikti pakeitimai yra „Java“ pataisų failuose, kuriuos galite bendrinti atskirai.
  • Java: tai ne Smali.

Taip pat įgyjate kūrimo laiko klaidų tikrinimo pranašumą, todėl klaidos atsiranda kūrimo ciklo pradžioje. Sukompiliuota „Java“ suteikia įprastą kompiliavimo laiko tikrinimą (su prieiga prie originalių APK simbolių), o „DexPatcher“ vykdo šaltinio ir pataisos suderinamumas taisant, naudingos informacijos teikimas ir įspėjimai, kai atrodo, kad ką nors darote legalus, bet žiaurus.

Be to, „DexPatcher“ yra su rinkiniu pagalbiniai scenarijai (galima tik „Linux“, nors juos galima perkelti ir į kitas platformas). Jie pasirūpina darbo srities nustatymu, tikslinių APK klasių ir išteklių ištraukimu, klasių dekompiliavimu į Java ( CFR Java dekompiliatorius naudojamas pastarajam) ir galiausiai sukūrę ir pasirašę pataisytą APK, kai baigsite.

Pažvelkime į pavyzdį („Linux“):

Įdiekite „DexPatcher“ scenarijus

$# Make a directory where we can test stuff out and enter it. 

$ mkdir xda-test

$cd xda-test

$ git clone https://github.com/Lanchon/DexPatcher-scripts.git dexpatcher # Clone the DexPatcher helper scripts repo.

$cd dexpatcher

$ chmod +x dxp-* # Not necessary, but for clarity: we need to make sure the files we'll call later are executable.

Konfigūruokite DexPatcher scenarijus

Atviras dxp.config savo mėgstamoje teksto rengyklėje ir būtinai pakeiskite reikiamus kintamuosius, kad jie atitiktų jūsų sistemą. Jums tereikia pakeisti šią eilutę, kad ji būtų nukreipta į „Android“ SDK diegimo vietą:

dxp_android_sdk_dir=(~/android/sdk)

(„DexPatcher“ automatiškai pasirinks aukščiausią turimą platformos versiją. Be to, taip pat galite keisti kitas konfigūracijos parinktis, kad ji naudotų jūsų kai kurių įrankių versijas, o ne numatytuosius nustatymus.)

Kad būtų lengviau pasiekti, galime pridėti dexpatcher katalogas mūsų KELIAS, arba net susieti skirtingą simbolį dxp-* scenarijus į vietą, kuri jau yra jūsų KELIAS, toks kaip ~/bin:

export PATH=$PWD:$PATH

Pakeiskite programą

Šiame pavyzdyje naudosime paprastą atvirojo kodo programą. Žinoma, šiuo konkrečiu atveju būtų galima pataisyti šaltinio kodą tiesiogiai, bet tai visai nėra smagu!

Mes paimsime programą „Gauti ID“ iš basil2style, programos, kuri parodys tam tikrą informaciją apie jūsų įrenginį. Mūsų tikslas yra modifikuoti mygtuką „Kopijuoti“, skirtą „Įrenginio ID“ ir vietoj jo bendrinti šį ID:

  • Pirmiausia atsisiųskite APK, kurį ketiname modifikuoti: Gaukite ID.
  • Dekompiliuoti programą.
  • Sukurkite pasirašymo raktą, kurį vėliau naudosime pasirašydami APK.

Taip pat visa tai galime padaryti naudodami apvalkalą, naudodami pagalbinius scenarijus:

$cd dexpatcher # Go to our working directory. 

$ curl -O https://f-droid.org/repo/makeinfo.com.getid_1.apk # Download the APK.

$ dxp-setup-for-apk makeinfo.com.getid_1.apk # Unpack and decompile the APK.

$cd makeinfo.com.getid_1 # Go to the newly created directory where everything is unpacked/decompiled to.

$ dxp-create-keystore # Create the APK signing key. Press 6 times (or fill out the info), then "yes".

Pamatysite keletą skirtingų katalogų:

  • dekoduoti: čia rasite išteklius ir Smali, kaip iššifravo apktool.
  • src: Tuščias katalogas. Čia patalpinsime pataisos failus.
  • src-cfr: štai kur plg dekompiliavo programą (kartu su klaidomis). Gera vieta, kur galima apsispręsti, ką keisti (taip pat gali prireikti išteklių ir jų ID iš aukščiau esančio dekodavimo katalogo, bet ne šiam konkrečiam pavyzdžiui).
  • src-cfr-mazgo kodas: tas pats, kaip ir aukščiau, bet yra tik tuščios šaknelės (be kodo, tik skeletai). Šiuos failus galite naudoti kaip pataisos pagrindą, kaip pamatysime netrukus.

Kaip jau minėjome anksčiau, norime pakeisti įrenginio ID mygtuką „Kopijuoti“, kad vietoj jo būtų bendrinamas ID tekstas. Jei apžvelgsime šaltinio kodą, pastebėsime, kad įrenginio ID kopijavimo mygtukas (įrenginio_kopija) paspaudus įvykį tvarko anoniminė klasė src-cfr/makeinfo/com/getid/MainActivity.java. Nors galime jį modifikuoti čia, paprastai geriau rasti kitą būdą tai padaryti, nes anoniminės klasės turi skaitinius pavadinimus (MainClassName$SomeNumber, pvz. Pagrindinė veikla 3 USD), kurios gali nenuspėjamai keistis įvairiose versijose.

Vietoj to, mes užregistruosime savo klasę renginiui pakeisdami Pagrindinis užsiėmimas klasė. Pirmiausia nukopijuokime „skeleto“ versiją iš src-cfr-nocode/makeinfo/com/getid/MainActivity.java į src/makeinfo/com/getid/MainActivity.java (Prisiminti, kad src ten gyvens mūsų pleistras). (Jei norite, taip pat galite nukopijuoti versiją su visu kodu, tai yra tik skonio reikalas.)

Dabar galime jį redaguoti taip:

  • Pridėkite būtiną DexPatcher anotacijos importą:
importlanchon.dexpatcher.annotation.*;
  • Pridėkite žymą, nurodydami, kad redaguojame kursą. Taip pat nustatome numatytąjį pataisų klasės narių veiksmą į Ignoruoti, o tai reiškia, kad kompiliuojant „Java“ nariai turi būti nurodyti mūsų kodu, tačiau DexPatcher į juos nepaisys.
@DexEdit(defaultAction=DexAction.IGNORE)

publicclassMainActivity

// The reference to ActionBarActivity will be satisfied by symbols

// extracted from the app when we build the patch.

extendsActionBarActivity{

  • Be to, pridėkite tuščius korpusus prie konstruktoriaus ir onCreate metodas, taip pat visi kiti metodai, kuriuos planuojame naudoti (atminkite, kad jie bus ignoruojami, kai iš tikrųjų bus pritaikytas pleistras – mes juos tik pridedame, kad prireikus galėtume į juos kreiptis). Taip pat galite tiesiog pridėti gimtoji vietoj raktinio žodžio.
  • Šiuo metu jau galime sukurti pataisą, jei jums įdomu:
    $ dxp-make # Output: `patched.apk`.
    Gana paprasta, tiesa? Vis dėlto eikime toliau – dar nebaigėme.
  • Redaguojame onCreate dabar išsikelti savo OnClickListener kad galėtume bendrinti įrenginio ID, o ne kopijuoti jį į mainų sritį:
    // Rename the target method so that we can still call it (the original)// if needed.@DexEdit(target="onCreate")protectedvoidsource_onCreate(Bundlevar1){}// Add our new custom method.@Override@DexAddprotectedvoidonCreate(Bundlevar1){// Call the original method:source_onCreate(var1);// Replace the text and handler:device_copy.setText("Share");device_copy.setOnClickListener(newDeviceCopyOnClick());}// Note that we don't use an anonymous class to avoid nameclashing with// MainActivity$1, which already exists.// We also could've defined a nested MainActivity.Patch class and used// an anonymous class in MainActivity.Patch.onCreate(), and then called// MainActivity.Patch.onCreate() from MainActivity.onCreate().@DexAddclassDeviceCopyOnClickimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewobject){if(MainActivity.this.val){Intentintent=newIntent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT,"Device ID");intent.putExtra(Intent.EXTRA_TEXT,device.getText().toString());startActivity(Intent.createChooser(intent,"Share Device ID"));}else{Toast.makeText(MainActivity.this.getApplicationContext(),"Nothing to Share",0).show();}}}
  • Atrodo, kad jau baigėme! Visas pleistras turėtų atrodyti taip tai. Dabar galime sukurti pataisytą APK ir jį įdiegti:
    $ dxp-make$ adb install patched.apk
  • Pažiūrėkime į rezultatą:

(Ačiū Lanchon, kad padėjo gauti pavyzdinį kodą!)

„Xposed“ yra nepaprastai populiarus ir dėl geros priežasties – dėl to kūrėjams ir vartotojams daug lengviau kurti, dalytis ir įdiegti modifikacijas. Yra keletas skirtumų tarp DexPatcher ir Xposed, dėl kurių kai kurie gali teikti pirmenybę vienam kitam:

  1. „Xposed“ atlieka savo magiją, pajungdama metodus vykdymo metu ir leisdama kūrėjams ką nors padaryti prieš, po ar vietoj bet kurio metodo. Kita vertus, „DexPatcher“ viską modifikuoja prieš vykdymo laiką ir sukuria atskirą modifikuotą APK. -- vis dar galima paleisti kodą prieš, po arba vietoj metodų, ir jūs iš tikrųjų turite šiek tiek papildomų laisvė.
  2. Atskiro APK kūrimas reiškia, kad jis nepriklauso nuo jokios išorinės sistemos. Tai taip pat reiškia, kad norint keisti vartotojo programas, nereikia root.
  3. Kadangi sukūrėte naują APK naudodami „DexPatcher“, jis bus pasirašytas kitaip. Tai reiškia, kad naudotojai negali gauti oficialių naujinių iš pirminio autoriaus ir gali sukelti problemų su programomis, pvz., „Google Apps“, jei parašai bus patikrinti.
  4. Tiek modulių, tiek „DexPatcher“ pataisų šaltinio kodą galima lengvai platinti ir modifikuoti. Jie taip pat turi daug panašumų, jei su kiekvienu susipažinsite.

Mes pakankamai kalbėjome apie DexPatcher. Dabar jūsų eilė pabandyti, todėl eikite į DexPatcher forumo tema kad pradėtumėte iš karto!