Monday, December 14, 2015

Android Proguard

Pada sesi kali ini kita akan sharing tentang android proguard. Apa itu Proguard ?.
Proguard adalaha tool proteksi yang diperuntukkan untuk java class digunakan untuk shrink (memperkecil ukuran), optimasi dan obfuscate code (menyembunyikan class).
Biasanya digunakan untuk mencegah decompile java class (mengubah *.class kembali menjadi *.java). Dengan proguard class name, variable dan method name bisa disamarkan.
Pada kasus ini akan dicoba untuk aplikasi android. Jika suatu aplikasi sudah beredar ke public (sudah masuk di google play) maka orang akan dengan mudah mendapatkan file APK dari aplikasi itu.
File apk sebenarnya sama seperti file zip yang berisi file *.class dan file resourse android lain (image, xml layout). Karena itu file class akan mudah di decompile dan orang akan mudah melakukan reverse-engineering.
Sekarang akan kita coba di android. Buat satu android project dan jalankan sampai terbentuk file apk.
Kemudian coba kita decompile apk itu menggunakan online decompiler ini (http://www.decompileandroid.com). download hasil decompilernya (berupa zip file kemudian extact). Di folder src package akan muncul file-file class.


Kalau classnya dibuka pun isinya akan sama seperti yang kita coding.


Tentu hal ini akan berbahaya karena code kita bisa dicuri orang.
Untuk mengaktifkan proguard di android studio ->  di build.gradle minifyEnabled di set true.

 ......................... 
 buildTypes {  
     debug {  
       minifyEnabled true  
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
     }  
     release {  
       minifyEnabled true  
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
     }  
   }  
 ...........................

Kemudian kita coba decompile lagi file apk nya.



Class name sudah berubah menjadi acak (termasuk nama method dan variable), untuk class activity yang merefer ke androidManifest name nya tidak diacak. tapi method name dan varible name di dalamnya sudah diacak.

 // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.  
 // Jad home page: http://www.geocities.com/kpdus/jad.html  
 // Decompiler options: braces fieldsfirst space lnc   
 package characters.gameofcharacters;  
 import android.view.View;  
 import android.widget.EditText;  
 import android.widget.ImageView;  
 import android.widget.RadioButton;  
 import android.widget.RadioGroup;  
 // Referenced classes of package characters.gameofcharacters:  
 //      AddCharacterActivity  
 class b  
   implements android.view.View.OnClickListener  
 {  
   final AddCharacterActivity a;  
   b(AddCharacterActivity addcharacteractivity)  
   {  
     a = addcharacteractivity;  
     super();  
   }  
   public void onClick(View view)  
   {  
     view = (RadioButton)a.findViewById(a.m.getCheckedRadioButtonId());  
     if (a.i.getTag() == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060018));  
       return;  
     }  
     if (a.j.getText().toString().trim().isEmpty())  
     {  
       a.j.setError("Cannot be empty");  
       return;  
     }  
     if (view == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060017));  
       return;  
     } else  
     {  
       a.a(view);  
       return;  
     }  
   }  
 }  

Kalau name nya sudah diacak tentu kan sedikit menyulitkan orang lain saat membacanya dan mentrace nya.
Kadang ada beberapa class yang tidak boleh di obfuscated, tinggal tambahkan konfigurasi di file proguard-rule.pro.
-keep <class> : class name
-keepclassmember <class> : varible dan method name
-keepclasseswithmember <class> : class beserta variable, method name

Contoh :

 -keep class * extends android.app.Application{  
   *;  
 }  
 -keep class characters.gameofcharacters.model.** {  
   *;  
 }  
 -keepclassmembers class characters.gameofcharacters.DBHelper {  
   *;  
 }  

Ulangi proses decompiler lagi. maka class yang didefinisikan di proguard-rule akan diskip

Kelemahan

Proguard ini hanya bisa menyamarkan name nya saja tidak bisa obfuscate isi code atau algoritma kita secara utuh. Dan juga tidak bisa obfuscate untuk file file resources seperti layout xml, values xml, image, dan file assets lainnya

Sebenarnya untuk melakukan full obfuscate (full protection) kita bisa menggunakan Dex-Guard. Tapi feature ini sayangnya tidak gratis alias berbayar. Biasanya dipakai untuk aplikasi yang enterprice kelasnya. Berikut ini perbandingan antara ProGuard dan Dex-Guard.

Alternatif yang lain adalah coding menggunakan android NDK (berbasis C++) untuk beberapa code logic yang dirasa rahasia. Code yang ditulis dengan C++ akan lebih sulit didecompiler dibandingkan java.



Selamat mencoba dan semoga bermanfaat.

Terima kasih

Referensi :
1. http://developer.android.com/tools/help/proguard.html
2. https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/usage.html

No comments:

Post a Comment