Penting
Proyek ini diarsipkan dan tidak lagi dikelola.
Beberapa pertanyaan paling umum dijawab di FAQ dan pemecahan masalah.
Alat kebingungan kotak hitam untuk aplikasi Android.
Obfuscapk adalah alat Python modular untuk mengaburkan aplikasi Android tanpa memerlukan kode sumbernya, karena apktool
digunakan untuk mendekompilasi file apk asli dan untuk membangun aplikasi baru, setelah menerapkan beberapa teknik kebingungan pada kode smali
, sumber daya, dan manifes yang telah didekompilasi. Aplikasi yang dikaburkan tetap memiliki fungsi yang sama dengan aplikasi asli, namun perbedaan di balik terpal terkadang membuat aplikasi baru sangat berbeda dari aplikasi asli (misalnya, dengan perangkat lunak antivirus berbasis tanda tangan).
Obfuscapk menambahkan dukungan untuk Android App Bundle (file aab) dengan menggunakan BundleDecompiler (lihat #121). Untuk menggunakan fitur baru ini, unduh BundleDecompiler versi terbaru yang tersedia dari sini, simpan sebagai BundleDecompiler.jar
di direktori yang termasuk dalam PATH
(misalnya, di Ubuntu, /usr/local/bin
atau /usr/bin
) dan buat yakin itu memiliki set flag yang dapat dieksekusi.
Penting
BundleDecompiler belum berfungsi di Windows, jadi kebingungan bundel aplikasi tidak didukung oleh Obfuscapk di platform Windows. Selain itu, dukungan app bundle masih dalam pengembangan awal, jadi jika Anda menghadapi masalah atau ingin membantu kami meningkatkannya, silakan lihat berkontribusi.
Detail lebih lanjut tentang Obfuscapk dapat ditemukan di makalah "Obfuscapk: Alat obfuscation kotak hitam sumber terbuka untuk aplikasi Android". Anda dapat mengutip makalah tersebut sebagai berikut:
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfuscapk didesain modular dan mudah diperluas, sehingga dibangun menggunakan sistem plugin. Akibatnya, setiap obfuscator adalah plugin yang mewarisi kelas dasar abstrak dan perlu mengimplementasikan metode obfuscate
. Saat alat mulai memproses file aplikasi Android baru, alat ini akan membuat objek obfuscation untuk menyimpan semua informasi yang diperlukan (misalnya, lokasi kode smali
yang telah didekompilasi) dan keadaan internal operasi (misalnya, daftar obfuscator yang sudah digunakan) . Kemudian objek obfuscation diteruskan, sebagai parameter ke metode obfuscate
, ke semua plugin/obfuscators yang aktif (secara berurutan) untuk diproses dan dimodifikasi. Daftar dan urutan plugin aktif ditentukan melalui opsi baris perintah.
Alat ini mudah diperluas dengan obfuscator baru: cukup menambahkan kode sumber yang mengimplementasikan teknik obfuscators dan metadata plugin (file <obfuscator-name>.obfuscator
) di direktori src/obfuscapk/obfuscators
(ambil obfuscator sederhana yang sudah ada seperti Nop
sebagai contoh awal). Alat ini akan mendeteksi plugin baru secara otomatis, sehingga tidak diperlukan konfigurasi lebih lanjut (plugin baru akan diperlakukan seperti semua plugin lain yang disertakan dengan alat tersebut).
Ada dua cara untuk mendapatkan copy pekerjaan Obfuscapk di komputer Anda: baik dengan menggunakan Docker atau dengan menggunakan langsung kode sumber di lingkungan Python 3
. Dalam kedua kasus tersebut, hal pertama yang harus dilakukan adalah mendapatkan salinan lokal dari repositori ini, jadi buka terminal di direktori tempat Anda ingin menyimpan proyek dan kloning repositori tersebut:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Ini adalah cara yang disarankan untuk menginstal Obfuscapk, karena satu-satunya persyaratan adalah menginstal Docker versi terbaru:
$ docker --version
Docker version 20.10.21, build baeda1f
Image Obfuscapk Docker resmi tersedia di Docker Hub (secara otomatis dibuat dari repositori ini):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Jika Anda mengunduh image resmi dari Docker Hub, Anda siap menggunakan alat tersebut, jadi lanjutkan dan periksa petunjuk penggunaan, jika tidak, jalankan perintah berikut di direktori Obfuscapk/src/
yang dibuat sebelumnya (folder yang berisi Dockerfile
) untuk membangun Gambar buruh pelabuhan:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Saat image Docker sudah siap, lakukan tes cepat untuk memeriksa apakah semuanya telah diinstal dengan benar:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk kini siap digunakan, lihat petunjuk penggunaan untuk informasi lebih lanjut.
Pastikan versi terbaru apktool
, apksigner
dan zipalign
terinstal dan tersedia dari baris perintah:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
Untuk mendukung kebingungan bundel aplikasi, Anda juga memerlukan BundleDecompiler, jadi unduh versi terbaru yang tersedia dari sini, simpan sebagai BundleDecompiler.jar
di direktori yang termasuk dalam PATH
(misalnya, di Ubuntu, /usr/local/bin
atau /usr/bin
) dan pastikan ia memiliki set flag yang dapat dieksekusi.
Untuk menggunakan BundleDecompiler dan apktool
Anda juga memerlukan Java versi terbaru. zipalign
dan apksigner
disertakan dalam Android SDK. Lokasi executable juga dapat ditentukan melalui variabel lingkungan berikut: APKTOOL_PATH
, BUNDLE_DECOMPILER_PATH
, APKSIGNER_PATH
dan ZIPALIGN_PATH
(misalnya, di Ubuntu, jalankan export APKTOOL_PATH=/custom/location/apktool
sebelum menjalankan Obfuscapk di terminal yang sama).
Terlepas dari alat-alat di atas, satu-satunya persyaratan proyek ini adalah instalasi Python 3
(setidaknya 3.7
) yang berfungsi (bersama dengan manajer paketnya pip
).
Jalankan perintah berikut di direktori utama proyek ( Obfuscapk/
) untuk menginstal dependensi yang diperlukan:
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
Setelah persyaratan diinstal, lakukan tes cepat untuk memeriksa apakah semuanya berfungsi dengan benar:
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk kini siap digunakan, lihat petunjuk penggunaan untuk informasi lebih lanjut.
Mulai sekarang, Obfuscapk akan dianggap sebagai executable yang tersedia sebagai obfuscapk
, jadi Anda perlu menyesuaikan perintah sesuai dengan cara Anda menginstal alat tersebut:
Gambar Docker : direktori lokal yang berisi aplikasi yang akan dikaburkan harus dipasang ke /workdir
dalam wadah (misalnya, direktori saat ini "${PWD}"
), jadi perintahnya:
$ obfuscapk [params...]
menjadi:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
Dari sumber : setiap instruksi harus dijalankan dari direktori Obfuscapk/src/
(atau dengan menambahkan direktori Obfuscapk/src/
ke variabel lingkungan PYTHONPATH
) dan perintah:
$ obfuscapk [params...]
menjadi:
$ python3 -m obfuscapk.cli [params...]
Mari kita mulai dengan melihat pesan bantuan:
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
Ada dua parameter wajib: <APK_OR_BUNDLE_FILE>
, jalur (relatif atau absolut) ke file apk atau app bundle yang akan di-obfuscate, dan daftar dengan nama teknik obfuscation yang akan diterapkan (ditentukan dengan opsi -o
yang dapat digunakan lebih dari satu kali) kali, misalnya, -o Rebuild -o NewAlignment -o NewSignature
). Argumen opsional lainnya adalah sebagai berikut:
-w DIR
digunakan untuk mengatur direktori kerja tempat menyimpan file perantara (dihasilkan oleh apktool
). Jika tidak ditentukan, direktori bernama obfuscation_working_dir
dibuat di direktori yang sama dengan aplikasi masukan. Ini dapat berguna untuk keperluan debugging, tetapi jika tidak diperlukan dapat diatur ke direktori sementara (misalnya, -w /tmp/
).
-d OUT_APK_OR_AAB
digunakan untuk mengatur jalur file tujuan: file apk yang dihasilkan oleh proses kebingungan (misalnya, -d /home/user/Desktop/obfuscated.apk
atau -d /home/user/Desktop/obfuscated.aab
). Jika tidak ditentukan, file terakhir yang dikaburkan akan disimpan di dalam direktori kerja. Catatan: file yang ada akan ditimpa tanpa peringatan apa pun.
-i
adalah tanda untuk mengabaikan perpustakaan pihak ketiga yang dikenal selama proses kebingungan, untuk menggunakan lebih sedikit sumber daya, untuk meningkatkan kinerja dan mengurangi risiko kesalahan. Daftar perpustakaan yang diabaikan diadaptasi dari proyek LiteRadar.
-p
adalah tanda untuk menampilkan bilah kemajuan selama operasi kebingungan. Saat menggunakan alat ini dalam operasi batch/pembuatan otomatis, sebaiknya bilah kemajuan dinonaktifkan, jika tidak, tanda ini harus diaktifkan untuk melihat kemajuan kebingungan.
-k VT_API_KEY
hanya diperlukan saat menggunakan obfuscator VirusTotal
, untuk menyetel kunci API yang akan digunakan saat berkomunikasi dengan Virus Total.
--keystore-file KEYSTORE_FILE
, --keystore-password KEYSTORE_PASSWORD
, --key-alias KEY_ALIAS
dan --key-password KEY_PASSWORD
dapat digunakan untuk menentukan keystore khusus (diperlukan untuk penandatanganan apk). Jika --keystore-file
digunakan, --keystore-password
dan --key-alias
juga harus ditentukan, sedangkan --key-password
diperlukan hanya jika kunci yang dipilih memiliki kata sandi yang berbeda dari kata sandi keystore. Secara default (bila --keystore-file
tidak ditentukan), keystore yang dibundel dengan Obfuscapk digunakan untuk operasi penandatanganan.
--ignore-packages-file IGNORE_PACKAGES_FILE
adalah jalur ke file yang menyertakan nama paket untuk diabaikan. Semua kelas di dalam paket tersebut tidak akan dikaburkan ketika opsi ini digunakan. File tersebut harus memiliki satu nama paket per baris seperti yang ditunjukkan pada contoh di bawah ini:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
adalah tanda untuk menggunakan opsi aapt2 saat membangun kembali aplikasi dengan apktool
.
Sekarang mari kita pertimbangkan contoh kerja sederhana untuk melihat cara kerja Obfuscapk:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
Saat menjalankan perintah di atas, inilah yang terjadi di balik layar:
karena tidak ada direktori kerja yang ditentukan, direktori kerja baru ( obfuscation_working_dir
) dibuat di lokasi yang sama dengan original.apk
(ini berguna untuk memeriksa file smali
/manifest/resources jika terjadi kesalahan)
beberapa pemeriksaan dilakukan untuk memastikan bahwa semua file/executable yang diperlukan tersedia dan siap digunakan
proses kebingungan yang sebenarnya dimulai: obfuscator yang ditentukan dieksekusi (secara berurutan) satu per satu hingga tidak ada obfuscator yang tersisa atau hingga terjadi kesalahan
saat menjalankan obfuscator pertama, original.apk
didekompilasi dengan apktool
dan hasilnya disimpan ke dalam direktori kerja
karena obfuscator pertama adalah RandomManifest
, entri dalam manifes Android yang didekompilasi akan disusun ulang secara acak (tanpa merusak struktur xml
)
Rebuild
obfuscator cukup membangun kembali aplikasi (sekarang dengan manifes yang dimodifikasi) menggunakan apktool
, dan karena tidak ada file keluaran yang ditentukan, file apk yang dihasilkan disimpan di direktori kerja yang dibuat sebelumnya
Obfuscator NewAlignment
menggunakan alat zipalign
untuk menyelaraskan file apk yang dihasilkan
Obfuscator NewSignature
menandatangani file apk yang baru dibuat dengan sertifikat khusus yang terkandung dalam keystore yang dibundel dengan Obfuscapk (meskipun keystore yang berbeda dapat ditentukan dengan parameter --keystore-file
)
ketika semua obfuscators telah dijalankan tanpa kesalahan, file apk yang dikaburkan dapat ditemukan di obfuscation_working_dir/original_obfuscated.apk
, ditandatangani, disejajarkan dan siap dipasang ke perangkat/emulator
Seperti yang terlihat pada contoh sebelumnya, obfuscator Rebuild
, NewAlignment
dan NewSignature
selalu diperlukan untuk menyelesaikan operasi obfuscation, untuk membangun apk akhir yang di-obfuscated. Ini bukanlah teknik kebingungan yang sebenarnya, namun diperlukan dalam proses pembangunan, sehingga disertakan dalam daftar obfuscator untuk menjaga keseluruhan arsitektur tetap modular.
Tidak berfungsi seperti yang diharapkan? Lihat FAQ dan pemecahan masalah.
Obfuscator yang termasuk dalam Obfuscapk dapat dibagi ke dalam kategori berbeda, bergantung pada operasi yang dilakukannya:
Sepele : seperti namanya, kategori ini mencakup operasi sederhana (yang tidak banyak mengubah aplikasi aslinya), seperti menandatangani file apk dengan tanda tangan baru.
Ganti nama : operasi yang mengubah nama pengidentifikasi yang digunakan (kelas, bidang, metode).
Enkripsi : mengemas kode/sumber daya terenkripsi dan mendekripsinya selama eksekusi aplikasi. Saat Obfuscapk dimulai, secara otomatis menghasilkan kunci rahasia acak (panjang 32 karakter, menggunakan huruf dan angka ASCII) yang akan digunakan untuk enkripsi.
Kode : semua operasi yang melibatkan modifikasi kode sumber yang telah didekompilasi.
Sumber Daya : operasi pada file sumber daya (seperti memodifikasi manifes).
Lainnya
Obfuscator yang saat ini dibundel dengan Obfuscapk disajikan secara singkat di bawah ini (dalam urutan abjad). Silakan merujuk ke kode sumber proyek untuk lebih jelasnya.
Tip
Tidak semua obfuscator di bawah sesuai dengan teknik obfuscator yang sebenarnya (misalnya, Rebuild
, NewAlignment
, NewSignature
dan VirusTotal
), tetapi obfuscator diimplementasikan sebagai obfuscator untuk menjaga arsitektur tetap modular dan mudah diperluas dengan fungsionalitas baru.
Menggunakan refleksi untuk memanggil API berbahaya dari Kerangka Android. Untuk mengetahui apakah suatu metode termasuk dalam Kerangka Android, Obfuscapk mengacu pada pemetaan yang ditemukan oleh Backes dkk.
? Kode sumber AdvancedReflection
Masukkan kode sampah. Dalam hal ini, kode sampah disusun oleh perhitungan aritmatika dan instruksi cabang tergantung pada hasil perhitungan tersebut, dibuat sedemikian rupa sehingga cabang tersebut tidak pernah diambil.
? Kode sumber ArithmeticBranch
Enkripsi file aset.
? Kode sumber AssetEncryption
Teknik ini memodifikasi grafik aliran kontrol tanpa mempengaruhi semantik kode: teknik ini menambahkan metode baru yang memanggil metode asli. Misalnya, pemanggilan ke metode m1 akan digantikan dengan metode pembungkus baru m2 , yang ketika dipanggil, akan memanggil metode asli m1 .
? Kode sumber CallIndirection
Ubah nama paket dan ganti nama kelas (bahkan dalam file manifes).
? Kode sumber ClassRename
Enkripsi string konstan dalam kode.
? Kode sumber ConstStringEncryption
Hapus informasi debug.
? Kode sumber DebugRemoval
Ganti nama bidang.
? Kode sumber FieldRename
Diberikan suatu metode, ia menyisipkan instruksi
goto
yang menunjuk ke akhir metode dangoto
lain yang menunjuk ke instruksi setelahgoto
pertama; itu memodifikasi grafik aliran kontrol dengan menambahkan dua node baru.
? Kode sumber Goto
Enkripsi lib asli.
? Kode sumber LibEncryption
Ini mengeksploitasi fitur kelebihan beban dari bahasa pemrograman Java untuk menetapkan nama yang sama ke metode yang berbeda tetapi menggunakan argumen yang berbeda. Mengingat metode yang sudah ada, teknik ini menciptakan metode void baru dengan nama dan argumen yang sama, namun juga menambahkan argumen acak baru. Kemudian, isi metode baru diisi dengan instruksi aritmatika acak.
? Kode sumber MethodOverload
Ganti nama metode.
? Metode Ganti nama kode sumber
Sejajarkan kembali aplikasi.
? Kode sumber NewAlignment
Tanda tangani ulang aplikasi dengan tanda tangan khusus yang baru.
? Kode sumber NewSignature
Masukkan kode sampah. Nop, kependekan dari no-operation , adalah instruksi khusus yang tidak melakukan apa pun. Teknik ini hanya menyisipkan instruksi
nop
acak dalam setiap implementasi metode.
? Tidak ada kode sumber
Susun ulang entri dalam file manifes secara acak.
? Kode sumber RandomManifest
Bangun kembali aplikasi.
? Membangun kembali kode sumber
Teknik ini menganalisis kode yang ada untuk mencari pemanggilan metode aplikasi, mengabaikan panggilan ke framework Android (lihat
AdvancedReflection
). Jika ia menemukan instruksi dengan pemanggilan metode yang sesuai (yaitu, tidak ada metode konstruktor, visibilitas publik, cukup register gratis, dll.) pemanggilan tersebut dialihkan ke metode khusus yang akan memanggil metode asli menggunakan API Refleksi.
? Kode sumber refleksi
Teknik ini terdiri dari mengubah urutan blok dasar dalam kode. Ketika instruksi cabang ditemukan, kondisinya dibalik (misalnya, cabang jika lebih rendah dari , menjadi cabang jika lebih besar atau sama dengan ) dan blok dasar target diurutkan ulang sesuai dengan itu. Selain itu, ia juga secara acak mengatur ulang kode yang menyalahgunakan instruksi
goto
.
? Susun ulang kode sumber
Enkripsi string dalam sumber daya (hanya yang disebut kode dalam).
? Kode sumber ResStringEncryption
Kirim aplikasi asli dan aplikasi yang dikaburkan ke Virus Total. Anda harus memberikan kunci API VT (lihat opsi
-k
).
? Kode sumber VirusTotal
Anda bebas menggunakan kode ini di bawah Lisensi MIT.
Perangkat lunak ini dikembangkan untuk tujuan penelitian di Lab Keamanan Komputer (CSecLab), yang diselenggarakan di DIBRIS, Universitas Genoa.