Post

Decompile & Patching APK

Decompile adalah proses menggembalikan source code dari kode yang sudah di-compile. Setelah mendapatkan source code, kita dapat melakukan perubahan pada APK dan melakukan recompile, ini lah yang dinamakan patching APK.

Kegiatan patching APK ini biasanya digunakan untuk mem-bypass root dan SSL Pinning, dengan cara mengubah nilai dari kode yang dijadikan sebagai acuan pemeriksaan.

1. Scenario

Pada aplikasi diva-beta.apk terdapat soal Harcoding Issues - Part 1 yang mana kita perlu menginputkan vendor key yang valid.

Vendor key yang valid pada soal ini adalah “vendorsecretkey”, hal ini bisa diketahui karena key tersebut disimpan di source code-nya.

Ketika kita menginputkan key yang salah, akan muncul pesan:

Access denied! See you in hell :D

DIVA: Jika salah input vendor key

Ketika kita menginputkan key yang valid, akan muncul pesan:

Access granted! See you on the other side :)

DIVA: Jika input vendor key yang valid

Pada kesempatan kali ini, kita akan mempelajari tentang patching atau modifikasi APK. Kita akan mengubah nilai key yang valid sesuai yang kita inginkan.

2. Requirements

  1. Device atau emulator Android
    • Salah satu emulator Android yang saya rekomendasikan adalah Genymotion.
  2. Java
    • Java adalah salah satu bahasa pemrogramman yang sering digunakan untuk membuat APK, dan beberapa tools yang akan kita gunakan juga menggunakan bahasa Java.
    • ❯ apt-get install default-jre && apt-get install default-jdk
  3. APK Studio
    • APKStudio adalah IDE open source berbasis Qt yang digunakan untuk membantu proses reverse engineering aplikasi Android.
  4. Apktool
    • Apktool adalah alat yang digunakan untuk melakukan decompile dan recompile APK.
  5. Android Debug Bridge
    • ADB adalah command line tool serbaguna yang memungkinkan kita berkomunikasi dengan perangkat Android.
    • ❯ apt install android-tools-adb
    • Install APK yang akan digunakan sebagai bahan praktik.
    • ❯ adb install diva-beta.apk
  6. Jadx
    • Jadx adalah alat bantu untuk melakukan konversi dari Dex ke Java agar lebih mudah dibaca.
  7. Uber APK Signer

3. Setting up APKStudio

Jalankan APKStudio, pada menu Settings terdapat konfigurasi PATH dari masing-masing tools. Silahkan sesuaikan dengan kondisi Anda.

Menyiapkan APKStuido

Keretangan:

  • AAPT2 (Android Asset Packaging Tool) adalah alat yang digunakan oleh Android Studio dan Plugin Android Gradle untuk mengompilasi dan memaketkan resource aplikasi.

4. Decompile APK

Untuk melakukan decompile APK, tekan tombol Open APK dan pilih diva-beta.apk yang akan kita gunakan sebagai bahan praktik.

Decompile APK

Selanjutnya akan ada opsi seperti gambar di bawah:

Decompile APK

Keterangan:

  • Output: lokasi folder untuk menyimpan hasil decompile.
  • Decompile smali?: untuk mendapatkan .smali (apktool).
  • Decompile resource?: untuk mendapatkan resource (apktool).
  • Decompile java?: untuk mendapatkan .java (jadx).

Hasil dari decompile-nya akan terlihat seperti berikut:

Hasil Decompile

Jika Anda ingin decompile APK secara manual gunakan perintah berikut:

1
2
3
4
5
# decompile .apk
❯ java -Xmx256m -jar apktool_2.5.0.jar d -o /apk/diva-beta.apk-decompiled /apk/diva-beta.apk

# konversi .dex ke .java
❯ jadx -r -d /apk/diva-beta.apk-decompiled /apk/diva-beta.apk

4.1. Smali vs Java

Smali adalah sebuah bahasa hasil dekompilasi file berekstensi .dex yang terdapat pada file .apk. Untuk melakukan patching, kita perlu untuk mengubah isi file .smali, lalu di-recompile menggunakan apktool.

Untuk mempermudah memahami .smali, kita bisa membandingkannya terlebih dahulu dengan file .java (yang dihasilkan oleh jadx).

Sebagai contoh pada aplikasi diva-beta.apk terdapat class HardcodeActivity yang menyimpan vendor key.

HardcodeActivity.smali

Untuk lebih memahami kode tersebut, sebaiknya kita lihat isi file .java.

HardcodeActivity.java

Terlihat pada gambar di atas, terdapat pemeriksaan string yang diinputkan. String atau key yang valid adalah vendorsecretkey.

Untuk memahami lebih lanjut tentang .smali dan reverse engineering APK Android, Anda bisa membaca artikel berikut:

5. Patching APK

Setelah mengetahui bahwa terdapat key yang disimpan di source code, kita akan mengubah nilai key tersebut menjadi “BelajarPatchingAPK1337”.

Untuk melakukannya, cukup mengubah isi file .smali menjadi seperti berikut:

Mengubah nilai vendor key pada file .smali

Jangan lupa untuk menyimpan perubahan (CTRL+S) dan recompile, seperti berikut:

Recompile APK

Jika Anda ingin recompile APK secara manual gunakan perintah berikut:

1
java -Xmx256m -jar apktool_2.5.0.jar b /apk/diva-beta.apk-decompiled --use-aapt2

Hasil recompile APK akan tersedia pada folder /dist/, seperti berikut:

Result Recompile APK

Kita akan mendapatkan pesan kesalahan ketika ingin menginstall APK yang telah kita patching sebelumnya, seperti berikut:

1
2
3
❯ adb install diva-beta.apk
Performing Streamed Install          
adb: failed to install diva-beta.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl749566934.tmp/base.apk: Attempt to get length of null array]

Hal ini karena tidak ada sertifikat pada APK tersebut. Maka dari itu, kita akan menambahkan sertifikat baru menggunakan Uber-Apk-Signer.

6. Adding Certificates to APK

Pertama-tama, kita buat terlebih dahulu sertifikatnya menggunakan keytool, seperti berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ keytool -genkey -v -keystore tryn3wbye.key -alias tryn3wbye -keyalg RSA -keysize 2048 -validity 365
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Enter keystore password:  
Re-enter new password:
What is your first and last name?
  [Unknown]:  n3wbye
What is the name of your organizational unit?
  [Unknown]:  
What is the name of your organization?
  [Unknown]:  
What is the name of your City or Locality?
  [Unknown]:  Jakarta
What is the name of your State or Province?
  [Unknown]:  Jateng
What is the two-letter country code for this unit?
  [Unknown]:  ID
Is CN=n3wbye, OU=Unknown, O=Unknown, L=Jakarta, ST=Jateng, C=ID correct?
  [no]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 365 days
        for: CN=n3wbye, OU=Unknown, O=Unknown, L=Jakarta, ST=Jateng, C=ID
[Storing tryn3wbye.key]

Keterangan:

  • Keytool: alat bantu untuk mengelola sertifikat.
  • -genkey: membuat atau menambah data ke keystore.
  • -v: mode verbose.
  • -keystore: lokasi keystore.
  • -alias: sebagai nama entri untuk diproses.
  • -keysize: ukuran key dalam bit.
  • -validity: validitas jumlah hari.

Setelah sertifikat baru berhasil dibuat, kita akan melakukan konfigurasi untuk signing pada APKStudio, seperti berikut:

Setting Sertifikat

Selanjutnya, pada APKStudio pilih menu Project > Sign / Export untuk menambahkan sertifikasi ke dalam APK.

Menambahkan Sertifikat pada APK

Jika Anda ingin signing APK secara manual gunakan perintah berikut:

1
java -Xmx256m -jar uber-apk-signer-1.2.1.jar -a /apk/diva-beta.apk-decompiled/dist/diva-beta.apk --allowResign --overwrite --ks <namacert>.key --ksPass <password> --ksAlias <namacert> --ksKeyPass <password>

7. Install and try the App

Sekarang APK dapat diinstall dan digunakan.

1
2
3
❯ adb install diva-beta.apk
Performing Streamed Install
Success

Terlihat pada gambar di bawah ini, ketika kita mencoba menggunakan key lama, akan muncul pesan:

Access denied! See you in hell :D

DIVA-Patching: Menggunakan key lama

Dan jika kita menginputkan BelajarPatchingAPK1337, akan muncul pesan:

Access granted! See you on the other side :)

DIVA-Patching: Menggunakan key baru


Kita telah berhasil melakukan decompile dan patching APK. Semoga artikel ini bermanfaat untuk teman-teman.

Happy Hacking!

This post is licensed under CC BY 4.0 by the author.