Jika Anda pernah memikirkan keamanan aplikasi Anda, atau entah bagaimana ingin mengoptimalkan kode Anda, maka, yang pasti, Anda tahu apa itu ProGuard. Mungkin Anda sudah menderita atau berhasil mengatasi dokumentasi, beberapa artikel di tempat yang luas dan menemukan apa yang terjadi.
Dalam artikel ini saya tidak akan berbicara tentang bagaimana menjaga aturan atau tentang beberapa opsi yang bermanfaat. Menurut pendapat saya, untuk menyeret ProGuard ke dalam suatu proyek, cukup untuk melihat tutorial yang terlampir padanya. Saya akan menganalisis cara ProGuard bekerja dalam hal kode. Dan jika Anda tertarik - selamat datang di kucing.
Banyak yang salah tentang ProGuard, secara keliru percaya bahwa itu adalah obfuscator, yang bukan karena beberapa alasan:
- Itu tidak mencampur kode
- Itu tidak mengenkripsi kode.
Tugas utama ProGuard adalah mengubah nama objek, kelas, metode, sehingga mempersulit analisis kode untuk insinyur balik. Selain itu, ia juga mengoptimalkan kode, menghilangkan sumber daya yang tidak digunakan dalam program. Tetapi, pada akhirnya, dalam pengertian klasik, itu tidak bisa disebut obfuscator.
Jadi apa yang kita hadapi?
Secara umum, ProGuard adalah utilitas open-source yang bekerja dengan kode java. Ya, dan itu juga ditulis dalam java. Orang-orang yang menghadapinya juga mengembangkan DexGuard, yang juga dapat ditemukan di ruang terbuka, jika Anda berdesir, saat mereka bergabung secara berkala. Tetapi secara umum, DexGuard dianggap berbayar, bahkan menjadi versi yang lebih sulit dari ProGuard yang sama.
Jadi kita dapat menyimpulkan bahwa ProGuard adalah file jar yang mengatur ulang karakter dalam kode kita, mengoptimalkannya dan, tampaknya, meningkatkan keamanan. Secara default, ProGuard berfungsi dengan 26 huruf besar dan kecil.
Aturan untuk proguard diseret dari proyek ke proyek dan dianggap tidak dapat diganggu gugat, karena jangan menyentuhnya - itu berfungsi, atau beberapa garis merah neraka mungkin mulai, yang tidak ada yang tahu untuk memperbaikinya dan tidak ingin tahu. Dan beberapa oracle menyusun aturan-aturan ini, untuk sampai ke mana Anda perlu berbalik tujuh kali, berubah menjadi burung dan terbang ke barat daya selama dua jam empat puluh tiga menit.
Yah, karena tidak ada yang ingin pergi ke sana dan tidak ada yang perlu pergi ke sana, mari kita mulai.
Jika Anda melihat direktori proyek proguard, Anda dapat segera mengidentifikasi fungsi utamanya.
Sejauh ini, semuanya tampak jelas. Jadi mari kita lihat kelas utama.
public class ProGuard {
Baiklah, mari kita jalankan ke metode utama yang jelas di sini, di mana kita melihat bagaimana aturan default diatur dan yang ditetapkan oleh pengembang sendiri diuraikan.
Selain itu, ada objek yang diharapkan injectedClassNameMap, yang dengannya kita mendapatkan file build / outputs / proguard / release / mapping.txt yang terlihat seperti ini:
Jadi jika kita tiba-tiba ingin membuka kode kita sendiri dan membuatnya dapat dibaca, menggunakan mapping.txt kita bisa melakukan ini. Untuk melakukan ini, saat menerbitkan file apk, Anda perlu mengunduh versi mapping.txt di Google Play Console.
Sekarang Anda dapat melihat parser konfigurasi yang ditetapkan pengembang.
public class ConfigurationParser {
Eh, saya tidak mengatakan obfuscator, itu tidak mengaburkan, tetapi di sini Anda dapat melihat seluruh direktori obfuscate. Bagaimana bisa begitu?
Jika Anda melihat layar di atas, Anda dapat dengan mudah menemukan kelas yang bertanggung jawab untuk mengganti nama objek (SimpleNameFactory, ClassRenamer ...). Seperti yang saya katakan di atas, 26 karakter Latin digunakan secara default.
public class SimpleNameFactory implements NameFactory { private static final int CHARACTER_COUNT = 26; private static final List cachedMixedCaseNames = new ArrayList(); private static final List cachedLowerCaseNames = new ArrayList(); private final boolean generateMixedCaseNames; private int index = 0;
Di kelas SimpleNameFactory, ada metode khusus untuk memeriksa printNameSamples () yang akan memberi kita nilai yang diharapkan
public static void main(String[] args) { System.out.println("Some mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 60); System.out.println("Some lower-case names:"); printNameSamples(new SimpleNameFactory(false), 60); System.out.println("Some more mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 80); System.out.println("Some more lower-case names:"); printNameSamples(new SimpleNameFactory(false), 80); } private static void printNameSamples(SimpleNameFactory factory, int count) { for (int counter = 0; counter < count; counter++) { System.out.println(" ["+factory.nextName()+"]"); } }
Some mixed-case names: [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] ...
Kelas Obfuscator bertanggung jawab untuk "kebingungan", di mana ada satu metode eksekusi tunggal, di mana seluruh kumpulan kelas yang dikumpulkan dari proyek itu sendiri dan semua perpustakaan yang ditambahkan ke dalamnya ditransfer.
public class Obfuscator { private final Configuration configuration;
Selain ProGuard, ada optimasi yang diluncurkan oleh kelas Pengoptimal, sehingga menjalankan fungsi yang sangat penting untuk membersihkan sumber daya non-operasional. Ini juga memperhitungkan parameter yang ditetapkan oleh pengembang. Jadi, jika Anda ingin memastikan keamanan kode, maka Anda selalu dapat meresepkan aturan untuk itu. Optimasi diluncurkan dari kelas ProGuard.
private boolean optimize(int currentPass, int maxPasses) throws IOException { if (configuration.verbose) { System.out.println("Optimizing (pass " + currentPass + "/" + maxPasses + ")..."); }
Pekerjaan proguard dapat dibagi menjadi beberapa tahap:
- Baca aturan yang telah ditetapkan
- Optimasi
- Menghapus aset yang ditandai untuk optimisasi
- Ganti nama objek
- Catat proyek di direktori yang ditentukan dalam bentuk revisi
Anda dapat memulai proguard secara manual dengan perintah:
java -jar proguard.jar @android.pro
Di mana proguard.jar adalah proyek yang dirakit oleh ProGuard, dan android.pro adalah aturan untuk bekerja dengan parameter input dan output.
Mengapa menulis ProGuard sendiri terlalu menyakitkan
Bahkan, ketika saya sedang memanjat kode ProGuard, saya hanya melihat satu nama di kolom penulis - Eric Lafortune. Dengan cepat googling, saya menemukan
situs pribadinya , jika ada yang tertarik, Anda bisa membiasakan diri dengannya.
Google menempatkan ProGuard kepada kami sebagai satu-satunya solusi untuk mengoptimalkan dan melindungi kodenya, dan faktanya itu satu-satunya. Semua solusi lain dibayar atau di github dan ditutup dengan debu, dan secara pribadi saya tidak akan menyarankan Anda untuk mencoba menggunakannya dalam proyek Anda, karena masalah utama dengan minifikasi, kebingungan, pengemasan ulang dan optimalisasi adalah bahwa setiap saat mungkin ada tabrakan, karena sulit untuk meramalkan semua opsi yang mungkin terjadi pada kode. Selain itu, utilitas seperti itu perlu dicakup seketat mungkin dengan tes, dan siapa yang suka melakukan ini? :) Sayangnya, semua orang suka berbicara tentang tes, tetapi tidak untuk menulisnya.
Mengapa menggunakan ProGuard tidak ada gunanya
ProGuard bekerja sesuai dengan aturan yang diketahui diketahui, dan jika Anda tidak menetapkan aturan dan hanya memasukkannya ke dalam proyek Anda, mengakses kode untuk penyerang tidak akan sulit, karena inverter telah ditulis untuk waktu yang lama dan berada dalam domain publik. Tentu saja, jika Anda mempelajari topik secara lebih rinci dan menambahkan aturan, itu akan lebih sulit, tetapi sangat sedikit. Apa jalan keluarnya?
Perusahaan yang menyembunyikan kode mereka adalah prioritas, tetap menggunakan ProGuard dan memodifikasinya agar sesuai dengan kebutuhan mereka, sehingga mendapatkan solusi yang unik.
Mengapa, mengapa, Anda tidak ada hubungannya?
Secara umum, proguard bukan utilitas besar dan tidak ada supranatural yang terjadi di sana, jadi sangat mungkin untuk mempelajari sumbernya dengan menghabiskan beberapa malam dengan secangkir teh dan membelai kucing. Mengapa Anda membutuhkan ini? Untuk mengetahui secara lebih rinci alat yang Anda gunakan dan memahami apa yang mereka lakukan dengan kode Anda, apakah Anda benar-benar membutuhkannya. Ini tidak hanya berlaku untuk ProGuard, tetapi juga untuk kode pihak ketiga lain yang Anda gunakan dalam proyek Anda. Kode Anda adalah bidang tanggung jawab Anda dan bersih di dalamnya, jika tidak, apa gunanya melakukan pengembangan?
Artikel itu ditulis sekitar enam bulan lalu, dan proguard terus berkembang, karena beberapa fragmen mungkin tidak lagi bertepatan.
PS Saya menerbitkan semua koleksi seperti biasa di saluran telegram
@paradisecurity , dan tautannya dapat ditemukan di profil saya, atau ditemukan dalam pencarian telegram dengan nama.