DexPatcher: labojiet Android APK, izmantojot Java

DexPatcher ļauj izstrādātājiem labot APK, izmantojot Java. Tam ir vairākas priekšrocības, un DexPatcher lietošana ir daudz vienkāršāka nekā klasiskā Smali pieeja.

Jūs, iespējams, esat redzējis vai instalējis modificētas lietojumprogrammas, neatkarīgi no tā, vai tā ir jūsu izšķirtspējai pielāgota numura sastādītāja vai pielāgota WhatsApp versija ar pievienotām funkcijām. Tomēr, kā izstrādātāji to dara? Bieži vien lietojumprogrammu pirmkods pat nav pieejams, tāpēc kā tas viss darbojas? Vispirms mēs to redzēsim, pēc tam apskatīsim jaunu rīku, kura mērķis ir padarīt procesu daudz vienkāršāku, un visbeidzot salīdzināsim to ar populāro Xposed sistēmu, lai redzētu, kā tie atšķiras.

Iespējams, esat dzirdējuši par to, kā parasti tiek pārveidoti APK faili — izstrādātāji pievienojas paši matrica, sāciet redzēt visu Smali valodā un iegūstiet iespēju mainīt lietas, izmantojot spēku Avots. Pietiek ar tālruņa zvanu, lai pēc tam tos atbrīvotu, un tad viņi ir gatavi kopīgot jaunos spīdīgos APK.

Nopietnāk... Sāksim no sākuma. Ja neesat pazīstams ar Android lietojumprogrammu modificēšanu, jums varētu rasties jautājums, kas ir smali. Izstrādātāji parasti izmanto Java programmēšanas valodu, lai kodētu Android lietotnes. Programma (kompilators) pēc tam "tulko" šo kodu citā formātā, kas ir piemērots jūsu ierīcei, kā rezultātā .dex faili atrodas lietojumprogrammas pakotnē (vai APK).

Tajā brīdī jūs vairs nevarat piekļūt oriģinālajam avota kodam (ja vien neesat izstrādātājs vai lietojumprogramma ir atvērtā koda). Tomēr jums ir APK, jo tas ir instalēts jūsu ierīcē. No tā varat iegūt dex failus (parasti classes.dex) un pēc tam mēģināt tos pārtulkot atpakaļ saprotamā formātā. Šeit parādās smali kā lasāmāks, bet uzticamāks tulkojums. Varat iet vēl vienu soli tālāk un tulkot to atpakaļ Java valodā, lai gan šis process nav pietiekami uzticams — jūs iegūsit saprotams rezultāts, taču pastāv iespēja, ka jūs nevarēsiet to vēlreiz iztulkot otrādi, jo tiks zaudēta daļa paceļam. Citiem vārdiem sakot, jebkādas izmaiņas, ko jūs varētu veikt, būs veltīgas, jo jūs nevarēsiet to atkal pārvērst par APK, lai to instalētu savā ierīcē... vismaz ne bez lielām pūlēm.

smali/baksmali patiesībā ir dex formāta montētājs/izjauktājs — tieši to tas nozīmē īslandiešu valodā. Tomēr mēs parasti atsaucamies uz formātu, ko smali saprot, kad sakām "Smali" (uztveriet to kā norādījumus definējot katru sīkumu, pat ja tas viss nav vajadzīgs mums, cilvēkiem, tāpēc tas ir daudz runīgāks nekā Java). Ņemiet vērā arī to, ka iepriekš minētais skaidrojums ir nedaudz vienkāršots, taču tam vajadzētu būt ciešai līdzībai, vienlaikus viegli saprotamam.

Kas tad izstrādātājam būtu jādara, lai modificētu lietotni (bez piekļuves avotam)? Process ir vairāk vai mazāk šāds:

  1. Iegūstiet APK (no tīmekļa vai ierīces).
  2. Izmantojiet kaut ko līdzīgu apktool lai dekompilētu APK uz Smali. (apktool izmanto smali/baksmali, taču padara daudz vienkāršāku APK dekompilēšanu un pārbūvi, kā arī rūpējas par resursu, piemēram, XML failu, atkodēšanu.)
  3. Izņemiet classes.dex no APK un pēc tam izmantojiet dex2jar un visbeidzot Java dekompilators, lai iegūtu (nepilnīgu, bieži bojātu, bet lielākoties saprotamu) Java kodu. (Tas nav obligāti, taču var būt noderīgi, jo Smali ir daudz grūtāk saprast.)
  4. Nosakiet, ko mainīt.
  5. Faktiski modificējiet to, tieši rediģējot Smali kodu.
  6. Alternatīvi, ierakstiet modifikāciju Java, kompilējiet to, vēlreiz dekompilējiet Smali un pēc tam kopējiet iegūto Smali kodu.
  7. Kad viss ir beidzies, izmantojiet apktool vēlreiz, lai atjaunotu APK.
  8. Parakstiet APK (lai pārbaudītu autora identifikāciju; visām pakotnēm jābūt parakstītām) un visbeidzot instalējiet to.

Smali koda rakstīšana ir diezgan sarežģīta un pakļauta kļūdām. Smali valodā var veikt mazākas izmaiņas, taču jaunu funkciju pievienošana ar to ir grūtāka. Turklāt jums nebūs kompilēšanas laika kļūdu, tāpēc pat drukas kļūdas var tikt atklātas tikai izpildlaikā. Smali ielāpu paplašināšana un kopīgošana var būt arī apgrūtinoša, jo atšķirības parasti ir ļoti specifiskas konkrētai APK versijai. Lai gan ir daži rīki, lai atvieglotu iepriekš aprakstītā procesa daļas (Virtuous Ten Studio nāk prātā), tas joprojām var kļūt nogurdinoši.

XDA vecākais loceklis DexPatcher Lančons mērķis ir novērst šīs problēmas, padarot procesu vienkāršāku un ļaujot izstrādātājiem pilnībā izvairīties no saskarsmes ar Smali. Tā vietā izstrādātāji var rakstīt ielāpus tikai Java valodā, un DexPatcher var rīkoties ar visu pārējo.

Tam ir galvenā priekšrocība, jo ir viegli lasāmi un pārvaldāmi ielāpu faili. Arī APK ielāpēšana kopumā kļūst ērtāka. Mēs redzēsim pilnu piemēru par to, kā lietot DexPatcher, bet šeit ir īss pārskats par to, ko tas vispirms piedāvā:

  • Atvērtais avots.
  • Vairāku platformu: tai vajadzētu darboties operētājsistēmās Linux, Mac un Windows.
  • ielāpu faili: veiktās modifikācijas ir ietvertas Java ielāpu failos, kurus varat koplietot neatkarīgi.
  • Java: tā nav Smali.

Jūs arī iegūstat izveides laika kļūdu pārbaudes priekšrocības, tāpēc kļūdas tiek parādītas izstrādes cikla sākumā. Kompilētā Java nodrošina parasto kompilēšanas laika pārbaudi (ar piekļuvi oriģinālajiem APK simboliem), un DexPatcher nodrošina avota un ielāpa saderība, veicot labošanu, sniedzot noderīgu informāciju un sniedzot brīdinājumus, ja šķiet, ka kaut ko darāt legli, bet zivju.

Papildus tam DexPatcher tiek piegādāts komplektā ar palīgskripti (pieejami tikai operētājsistēmā Linux, lai gan tos var pārnest arī uz citām platformām). Tie rūpējas par darbvietas iestatīšanu, mērķa APK klašu un resursu izvilkšanu, klašu dekompilēšanu uz Java ( CFR Java dekompilators tiek izmantots pēdējam), un visbeidzot izveidojiet un parakstiet laboto APK, kad esat pabeidzis.

Apskatīsim piemēru (operētājsistēmā Linux):

Instalējiet DexPatcher skriptus

$# 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.

Konfigurējiet DexPatcher skriptus

Atvērt dxp.config savā iecienītākajā teksta redaktorā un noteikti mainiet nepieciešamos mainīgos, lai tie atbilstu jūsu sistēmai. Lai norādītu uz Android SDK instalēšanas vietu, ir jāmaina tikai šī rindiņa:

dxp_android_sdk_dir=(~/android/sdk)

(DexPatcher automātiski izvēlēsies augstāko pieejamo platformas versiju. Turklāt varat arī modificēt citas konfigurācijas opcijas, lai komplektā iekļauto noklusējuma iestatījumu vietā tiktu izmantotas jūsu dažu rīku versijas.)

Lai atvieglotu piekļuvi, mēs varam pievienot dekspečers direktoriju mūsu PATH, vai pat saiti ar atšķirīgo dxp-* skriptus uz vietu, kas jau ir jūsu PATH, piemēram, ~/bin:

export PATH=$PWD:$PATH

Modificēt pieteikumu

Šajā piemērā mēs izmantosim vienkāršu un atvērtā koda lietojumprogrammu. Protams, šajā konkrētajā gadījumā būtu iespējams tieši labot avota kodu, taču tas nav nekāds prieks!

Mēs izmantosim lietojumprogrammu “Iegūt ID” no basil2style — lietojumprogrammas, kas parāda detalizētu informāciju par jūsu ierīci. Mūsu mērķis ir modificēt ierīces ID pogu “Kopēt” un likt tai koplietot šo ID:

  • Vispirms lejupielādēsim APK, kuru plānojam modificēt: Iegūstiet ID.
  • Dekompilē lietojumprogrammu.
  • Izveidojiet parakstīšanas atslēgu, ko vēlāk izmantosim APK parakstīšanai.

To visu varam izdarīt arī, izmantojot čaulu, izmantojot palīgskriptus:

$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".

Jūs pamanīsit dažus dažādus direktorijus:

  • atšifrēt: šeit atradīsit resursus un Smali, kā to atšifrējis apktool.
  • src: Tukšs direktorijs. Šeit mēs ievietosim savus ielāpu failus.
  • src-cfr: lūk, kur sk dekompilēja lietotni (kopā ar kļūdām). Laba vieta, kur meklēt, lai izlemtu, ko mainīt (iespējams, jums būs nepieciešami arī resursi un to ID no iepriekš norādītā dekodēšanas direktorija, taču ne šim konkrētajam piemēram).
  • src-cfr-nodecode: tāds pats kā iepriekš, bet satur tikai tukšus stubs (bez koda, tikai skeleti). Varat izmantot šos failus kā pamatu savam ielāpam, kā mēs to redzēsim vēlāk.

Kā jau minēts iepriekš, mēs vēlamies mainīt ierīces ID pogu "Kopēt", lai tā vietā kopīgotu ID tekstu. Ja apskatīsimies avota kodā, pamanīsim, ka poga Device ID Copy (device_copy) onClick notikumu apstrādā anonīma klase src-cfr/makeinfo/com/getid/MainActivity.java. Lai gan mēs to varētu modificēt šeit, parasti ir labāk atrast alternatīvu veidu, kā to izdarīt, jo anonīmajām klasēm ir skaitļu nosaukumi (MainClassName$SomeNumber, piem. Galvenā darbība $3), kas var neparedzami mainīties starp versijām.

Tā vietā mēs reģistrēsim savu klasi pasākumam, pārveidojot Galvenā darbība klasē. Vispirms nokopēsim "skeleta" versiju no src-cfr-nocode/makeinfo/com/getid/MainActivity.java uz src/makeinfo/com/getid/MainActivity.java (atcerieties, ka src ir vieta, kur dzīvos mūsu ielāps). (Ja vēlaties, varat arī kopēt versiju ar pilnu kodu, tas ir tikai gaumes jautājums.)

Tagad mēs varam to rediģēt šādi:

  • Pievienojiet nepieciešamo importu DexPatcher anotācijai:
importlanchon.dexpatcher.annotation.*;
  • Pievienojiet atzīmi, lai norādītu, ka mēs rediģējam mācību priekšmetu. Mēs arī iestatījām ielāpu klases dalībnieku noklusējuma darbību uz Ignorēt, kas nozīmē, ka Java kompilācijas laikā uz dalībniekiem ir jāatsaucas mūsu kodā, taču DexPatcher tos ignorēs.
@DexEdit(defaultAction=DexAction.IGNORE)

publicclassMainActivity

// The reference to ActionBarActivity will be satisfied by symbols

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

extendsActionBarActivity{

  • Turklāt konstruktoram pievienojiet tukšus korpusus un onIzveidot metodi, kā arī visas pārējās metodes, ko plānojam izmantot (atcerieties, ka tās tiks ignorētas, kad mūsu ielāps faktiski tiks lietots — mēs tās tikai pievienojam, lai vajadzības gadījumā varētu uz tām atsaukties šeit). Varat arī vienkārši pievienot dzimtā atslēgvārdu vietā.
  • Mēs jau varam izveidot ielāpu šajā brīdī, ja jūs interesē:
    $ dxp-make # Output: `patched.apk`.
    Diezgan vienkārši, vai ne? Tomēr turpināsim — mēs joprojām neesam pabeiguši.
  • Rediģēsim onIzveidot tagad doties ceļā OnClickListener lai mēs varētu koplietot ierīces ID, nevis kopēt to starpliktuvē:
    // 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();}}}
  • Šķiet, ka esam pabeiguši! Pilnam plāksterim vajadzētu izskatīties šādi šis. Tagad mēs varam izveidot laboto APK un instalēt to:
    $ dxp-make$ adb install patched.apk
  • Apskatīsim rezultātu:

(Paldies Lanchon par palīdzību ar parauga kodu!)

Xposed ir ārkārtīgi populārs, un tas ir pamatota iemesla dēļ — tas padara modifikāciju izveidi, kopīgošanu un instalēšanu daudz vienkāršāku gan izstrādātājiem, gan lietotājiem. Starp DexPatcher un Xposed ir dažas atšķirības, kuru dēļ daži var dot priekšroku vienam, nevis otram:

  1. Xposed paveic savu burvību, izpildes laikā piesaistot metodes un ļaujot izstrādātājiem kaut ko darīt pirms, pēc jebkuras metodes vai tās vietā. No otras puses, DexPatcher modificē visu pirms izpildlaika un izveido atsevišķu, modificētu APK. -- Joprojām ir iespējama koda palaišana pirms, pēc vai to vietā, un jums faktiski ir daži papildu līdzekļi brīvība.
  2. Atsevišķa APK faila izveide nozīmē, ka tas nav atkarīgs no ārējas sistēmas. Tas arī nozīmē, ka lietotāja lietotņu modificēšanai nav nepieciešama root.
  3. Tā kā esat izveidojis jaunu APK, izmantojot DexPatcher, tas tiks parakstīts citādi. Tas nozīmē, ka lietotāji nevar saņemt oficiālus atjauninājumus no sākotnējā autora un var radīt problēmas ar tādām lietotnēm kā Google Apps, ja tiek pārbaudīti paraksti.
  4. Gan moduļu, gan DexPatcher ielāpu pirmkodu var viegli izplatīt un modificēt. Viņiem ir arī daudz līdzību, ja jūs ar katru mazliet iepazīstaties.

Mēs esam pietiekami runājuši par DexPatcher. Tagad ir jūsu kārta izmēģināt, tāpēc dodieties uz DexPatcher foruma pavediens lai sāktu uzreiz!