DexPatcher: Menambal APK Android Menggunakan Java

Anda mungkin telah melihat atau menginstal aplikasi yang dimodifikasi, baik itu dialer yang ditambal untuk resolusi Anda atau versi WhatsApp khusus dengan fitur tambahan. Bagaimana cara pengembang melakukannya? Sering kali, kode sumber aplikasi bahkan tidak tersedia, jadi bagaimana cara kerjanya? Kita akan melihatnya terlebih dahulu, kemudian melihat alat baru yang bertujuan untuk membuat proses lebih mudah, dan akhirnya membandingkannya dengan kerangka kerja Xposed yang populer untuk melihat perbedaannya.

Anda mungkin pernah mendengar tentang bagaimana APK biasanya dimodifikasi - pengembang memasukkan diri mereka ke dalam matriks, mulai melihat segala sesuatu di Smali, dan mendapatkan kemampuan untuk memodifikasi hal-hal menggunakan kekuatan Sumber. Panggilan telepon sudah cukup untuk mengeluarkan mereka begitu selesai, pada saat itu mereka siap untuk berbagi APK baru yang mengkilap.

Lebih serius ... Mari kita mulai dari awal. Jika Anda tidak terbiasa dengan modding aplikasi Android, Anda mungkin bertanya-tanya apa itu smali. Pengembang biasanya menggunakan bahasa pemrograman Java untuk memasukkan kode aplikasi Android. Program (kompiler) kemudian “menerjemahkan” kode itu ke format lain yang cocok untuk perangkat Anda, menghasilkan file .dex yang terkandung di dalam paket aplikasi (atau APK).

Pada saat itu, Anda tidak dapat lagi mengakses kode sumber asli (kecuali jika Anda adalah pengembang atau aplikasinya adalah open source). Namun, yang Anda miliki adalah APK, karena itulah yang diinstal pada perangkat Anda. Dari sana, Anda bisa mendapatkan file dex (biasanya classes.dex) dan kemudian mencoba menerjemahkannya kembali ke format yang dapat Anda pahami. Di situlah smali masuk, sebagai terjemahan yang lebih mudah dibaca tetapi setia. Anda dapat melangkah lebih jauh dan menerjemahkannya kembali ke Jawa, meskipun proses itu tidak cukup beriman - Anda akan mendapatkan hasil yang dapat dimengerti, tetapi kemungkinan Anda tidak akan bisa menerjemahkannya sebaliknya karena beberapa detail akan hilang di sepanjang jalan. Dengan kata lain, modifikasi apa pun yang mungkin Anda buat akan sia-sia karena Anda tidak akan dapat mengubahnya kembali menjadi APK untuk menginstalnya di perangkat Anda ... setidaknya tidak tanpa banyak usaha.

smali / baksmali sebenarnya adalah assembler / dissembler untuk format dex - itulah arti harfiahnya dalam bahasa Islandia. Namun, kami biasanya merujuk pada format yang dimengerti smali ketika kami mengatakan 'Smali' (menganggapnya sebagai instruksi yang mendefinisikan setiap detail kecil, bahkan jika itu tidak semua dibutuhkan oleh kita manusia - karena itu lebih verbose daripada Jawa). Juga perhatikan bahwa penjelasan di atas sedikit disederhanakan, tetapi harus analogi dengan erat sementara masih mudah dimengerti.

Apa yang perlu dilakukan pengembang untuk memodifikasi aplikasi (tanpa akses ke sumbernya)? Prosesnya kurang lebih sebagai berikut:

  1. Dapatkan APK (dari web atau dari perangkat).
  2. Gunakan sesuatu seperti apktool untuk mendekompilasi APK ke Smali. (apktool memanfaatkan smali / baksmali, tetapi membuatnya lebih mudah untuk mendekompilasi dan membangun kembali APK, dan juga menangani sumber daya decoding seperti file XML.)
  3. Ekstrak class.dex dari APK, kemudian gunakan dex2jar dan akhirnya decompiler Java untuk mendapatkan (tidak lengkap, sering rusak, tetapi sebagian besar dapat dimengerti) kode Java. (Ini opsional, tetapi dapat membantu karena Smali jauh lebih sulit untuk dipahami.)
  4. Identifikasi apa yang harus dimodifikasi.
  5. Sebenarnya memodifikasinya dengan mengedit kode Smali secara langsung.
  6. Atau, tulis modifikasi di Jawa, kompilasi, dekompilasi lagi ke Smali, lalu salin kode Smali yang dihasilkan.
  7. Setelah semua selesai, gunakan apktool lagi untuk membangun kembali APK.
  8. Tanda tangani APK (untuk memverifikasi identitas penulis; semua paket harus ditandatangani) dan akhirnya pasang.

Menulis kode Smali cukup sulit dan rawan kesalahan. Perubahan yang lebih kecil dapat dilakukan di Smali, tetapi menambahkan fitur baru dengan itu lebih menantang. Selain itu, Anda tidak akan memiliki kesalahan waktu kompilasi, sehingga kesalahan ketik pun hanya dapat dideteksi saat runtime. Memperluas dan berbagi tambalan Smali juga bisa merepotkan, karena diffs cenderung sangat spesifik untuk versi APK tertentu. Meskipun beberapa alat ada untuk membuat bagian dari proses yang dijelaskan di atas lebih mudah (Virtuous Ten Studio datang ke pikiran), itu masih bisa melelahkan.

DexPatcher oleh Anggota Senior Lanchon bertujuan untuk memperbaiki masalah ini, dengan membuat proses lebih sederhana dan memungkinkan pengembang untuk sepenuhnya menghindari berurusan dengan Smali. Sebagai gantinya, devs dapat menulis tambalan di Jawa sendiri dan membuat DexPatcher menangani yang lainnya.

Ini memiliki keuntungan utama memiliki file tambalan yang mudah dibaca dan dikelola. Menambal APK juga menjadi lebih nyaman secara umum. Kita akan melihat contoh lengkap tentang cara menggunakan DexPatcher dalam sedikit, tetapi inilah gambaran umum singkat tentang apa yang ditawarkan pertama kali:

  • Sumber terbuka.
  • Cross-platform: itu harus berjalan di Linux, Mac dan Windows.
  • File tambalan: modifikasi yang Anda buat terdapat dalam file tambalan Java yang dapat Anda bagikan secara independen.
  • Java: bukan Smali.

Anda juga mendapatkan keuntungan dari pengecekan error build-time, jadi bug muncul di awal siklus pengembangan. Java yang dikompilasi menyediakan pengecekan waktu kompilasi yang biasa (dengan akses ke simbol APK asli), dan DexPatcher memberlakukan kompatibilitas sumber dan patch ketika menambal, memberikan informasi yang bermanfaat dan memberikan peringatan ketika Anda tampaknya melakukan sesuatu yang legal tetapi mencurigakan.

Selain itu, DexPatcher hadir dengan sekumpulan skrip pembantu (hanya tersedia di Linux, meskipun bisa juga porting ke platform lain). Ini mengatur ruang kerja, mengekstraksi kelas dan sumber daya APK target, mendekompilasi kelas ke Java (CFR Java decompiler digunakan untuk yang terakhir), dan akhirnya membangun dan menandatangani APK yang ditambal setelah Anda selesai.

Mari kita lihat sebuah contoh (di Linux):

Instal Script DexPatcher

 $ # Buat direktori tempat kita bisa menguji barang-barang dan memasukkannya. $ mkdir xda-test $ cd xda-test $ git clone //github.com/Lanchon/DexPatcher-scripts.git dexpatcher # Klon the DexPatcher helper scripts repo. $ cd dexpatcher $ chmod + x dxp- * # Tidak perlu, tetapi untuk kejelasan: kita perlu memastikan file yang akan kita panggil nanti dapat dieksekusi. 

Konfigurasikan Script DexPatcher

Buka dxp.config di editor teks favorit Anda dan pastikan untuk mengubah variabel yang diperlukan agar sesuai dengan sistem Anda. Anda hanya perlu mengubah baris berikut untuk menunjuk ke lokasi instalasi Android SDK Anda sebagai gantinya:

 dxp_android_sdk_dir = (~ / android / sdk) 

(DexPatcher akan secara otomatis memilih versi platform tertinggi yang tersedia. Selain itu, Anda juga dapat memodifikasi opsi konfigurasi lainnya agar dapat menggunakan versi Anda sendiri dari beberapa alat alih-alih bawaan yang dibundel.)

Untuk kemudahan akses, kami dapat menambahkan direktori dexpatcher ke PATH kami, atau bahkan menghubungkan tautan skrip dxp- * yang berbeda ke lokasi yang sudah ada di PATH Anda, seperti ~ / bin:

 export PATH = $ PWD: $ PATH 

Ubah Aplikasi

Untuk contoh ini, kami akan menggunakan aplikasi sumber terbuka dan sederhana. Tentu saja, menambal kode sumber secara langsung akan dimungkinkan dalam kasus khusus ini, tapi itu tidak menyenangkan sama sekali!

Kami akan mengambil aplikasi "Dapatkan ID" oleh basil2style, sebuah aplikasi yang menunjukkan beberapa detail tentang perangkat Anda. Tujuan kami adalah untuk memodifikasi tombol "Salin" untuk "Device ID" dan minta ia membagikan ID ini:

  • Pertama, mari kita unduh APK yang akan kita modifikasi: Dapatkan ID.
  • Dekompilasi aplikasi.
  • Buat kunci masuk yang nantinya akan kita gunakan untuk menandatangani APK.

Kami juga dapat melakukan semuanya melalui shell, menggunakan skrip pembantu:

 $ cd dexpatcher # Buka direktori kerja kami. $ curl -O //f-droid.org/repo/makeinfo.com.getid_1.apk # Unduh APK. $ dxp-setup-for-apk makeinfo.com.getid_1.apk # Buka paket dan dekompilasi APK. $ cd makeinfo.com.getid_1 # Pergi ke direktori yang baru dibuat tempat semuanya dibongkar / didekompilasi ke. $ dxp-create-keystore # Buat kunci penandatanganan APK. Tekan 6 kali (atau isi info), lalu "ya". 

Anda akan melihat beberapa direktori berbeda di sana:

  • decode : Anda akan menemukan sumber daya dan Smali di sini, seperti yang diterjemahkan oleh apktool.
  • src : Direktori kosong. Di sinilah kami akan menempatkan file tambalan kami.
  • src-cfr : ini adalah tempat cfr mendekompilasi aplikasi (bersama dengan kesalahan). Tempat yang bagus untuk melihat untuk memutuskan apa yang harus diubah (Anda mungkin juga membutuhkan sumber daya dan ID mereka dari direktori decode di atas, tetapi tidak untuk contoh khusus ini).
  • src-cfr-nodecode : sama seperti di atas, tetapi hanya berisi bertopik kosong (tanpa kode, hanya kerangka). Anda dapat menggunakan file-file ini sebagai dasar untuk tambalan Anda seperti yang akan kita lihat sebentar lagi.

Seperti yang telah kami sebutkan sebelumnya, kami ingin mengubah tombol “Salin” ID Perangkat untuk berbagi teks ID. Jika kita melihat-lihat kode sumber, kita akan melihat bahwa tombol Salin ID Perangkat (device_copy) pada acara Klik ditangani oleh kelas anonim di src-cfr / makeinfo / com / getid / MainActivity.java. Walaupun kita dapat memodnya di sini, biasanya lebih baik untuk menemukan cara alternatif untuk melakukannya karena kelas anonim memiliki nama numerik (MainClassName $ SomeNumber, misalnya MainActivity $ 3) yang mungkin berubah secara tak terduga antar versi.

Sebagai gantinya, kami akan mendaftarkan kelas kami sendiri untuk acara tersebut dengan memodifikasi kelas MainActivity. Pertama, mari kita salin versi "skeleton" dari src-cfr-nocode / makeinfo / com / getid / MainActivity.java ke src / makeinfo / com / getid / MainActivity.java (ingat bahwa src adalah tempat patch kita akan hidup). (Anda juga dapat menyalin versi dengan kode lengkap jika Anda mau, ini murni masalah selera.)

Kami sekarang dapat mengeditnya sebagai berikut:

  • Tambahkan impor yang diperlukan untuk anotasi DexPatcher:
 import lanchon.dexpatcher.annotation. *; 
  • Tambahkan tag untuk menunjukkan kami sedang mengedit kelas. Kami juga mengatur tindakan default untuk anggota kelas patch ke IGNORE, yang berarti bahwa anggota di sana akan dirujuk oleh kode kami selama kompilasi Java, tetapi akan diabaikan oleh DexPatcher.
 @DexEdit (defaultAction = DexAction. IGNORE) kelas publik MainActivity // Referensi ke ActionBarActivity akan dipenuhi oleh simbol // diekstraksi dari aplikasi ketika kita membangun patch. memperpanjang ActionBarActivity { 
  • Selain itu, tambahkan benda kosong ke konstruktor dan metode onCreate, serta semua metode lain yang kami rencanakan untuk digunakan (ingat bahwa mereka akan diabaikan ketika tambalan kami benar-benar diterapkan - kami hanya menambahkannya sehingga kami dapat merujuknya di sini jika perlu). Anda juga bisa menambahkan kata kunci asli saja.
  • Kami sudah dapat membangun tambalan pada titik ini, jika Anda penasaran:
     $ dxp-make # Output: `patched.apk`. 

    Cukup sederhana, bukan? Mari kita terus berjalan - kita masih belum selesai.

  • Mari kita edit onCreate sekarang untuk menetapkan OnClickListener sendiri sehingga kita dapat membagikan ID perangkat alih-alih menyalinnya ke clipboard:
     // Ganti nama metode target sehingga kita masih bisa menyebutnya (asli) // jika perlu. @DexEdit (target = "onCreate") protected void source_onCreate (Bundle var1) {} // Tambahkan metode khusus kami. @Override @DexAdd void onCreate yang dilindungi (Bundle var1) {// Panggil metode asli: source_onCreate (var1); // Ganti teks dan penangan: device_copy. setText ("Bagikan"); device_copy. setOnClickListener (DeviceCopyOnClick () baru); } // Perhatikan bahwa kita tidak menggunakan kelas anonim untuk menghindari penamaan dengan // MainActivity $ 1, yang sudah ada. // Kita juga bisa mendefinisikan kelas MainActivity.Patch bersarang dan menggunakan // kelas anonim di MainActivity.Patch.onCreate (), dan kemudian memanggil // MainActivity.Patch.onCreate () dari MainActivity.onCreate (). @DexAdd class DeviceCopyOnClick mengimplementasikan View. OnClickListener {@Override public void onClick (Lihat objek) {if (MainActivity. This. Val) {Intent intent = new Intent (Intent. ACTION_SEND); niat. setType ("text / plain"); niat. putExtra (Intent. EXTRA_SUBJECT, "Device ID"); niat. putExtra (Intent. EXTRA_TEXT, perangkat. getText (). toString ()); startActivity (Intent. createChooser (maksud, "Bagikan Device ID")); } else {Bersulang. makeText (MainActivity. this. getApplicationContext (), "Nothing to Share", 0). tampilkan (); }}} 
  • Sepertinya kita sudah selesai sekarang! Tambalan lengkap akan terlihat seperti ini. Kami sekarang dapat membangun APK yang ditambal dan menginstalnya:
     $ dxp-make $ adb install patched.apk 
  • Mari kita lihat hasilnya:

(Terima kasih kepada Lanchon untuk membantu dengan kode sampel!)

Xposed sangat populer, dan untuk alasan yang bagus - itu membuat membangun, berbagi, dan memasang mod jauh lebih mudah bagi pengembang dan pengguna. Ada beberapa perbedaan antara DexPatcher dan Xposed yang mungkin membuat beberapa orang lebih suka satu daripada yang lain:

  1. Xposed melakukan keajaibannya dengan mengaitkan metode pada saat runtime dan memungkinkan pengembang untuk melakukan sesuatu sebelum, setelah atau sebaliknya metode apa pun. DexPatcher, di sisi lain, memodifikasi segalanya sebelum runtime dan menghasilkan kode berjalan-mandiri APK yang dimodifikasi sebelum, setelah atau alih-alih metode masih dimungkinkan, dan Anda benar-benar memiliki kebebasan ekstra.
  2. Memproduksi APK mandiri berarti tidak bergantung pada kerangka eksternal apa pun. Ini juga berarti root tidak diperlukan untuk memodifikasi aplikasi pengguna.
  3. Karena Anda membuat APK baru dengan DexPatcher, itu akan ditandatangani secara berbeda. Ini berarti pengguna tidak dapat menerima pembaruan resmi dari penulis asli, dan dapat menyebabkan beberapa masalah dengan aplikasi seperti Google Apps jika tanda tangan diperiksa.
  4. Kode sumber modul dan patch DexPatcher dapat dengan mudah didistribusikan dan dimodifikasi. Mereka juga memiliki banyak kesamaan jika Anda sedikit mengenal keduanya.

Kami sudah cukup banyak berbicara tentang DexPatcher. Sekarang giliran Anda untuk mencobanya sekarang, jadi pergilah ke DexPatcher Forum Thread untuk segera mulai!