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