BAB 1 PENDAHULUAN
1.1
Latar Belakang
Java telah menjadi salah satu bahasa pemrograman yang cukup populer di industri software internasional maupun domestik. Java memiliki keuntungan bahwa banyak platform yang bisa menjalankan program yang sudah berupa bytecode, dan menjanjikan bahwa program Java bisa tetap kompatibel meskipun dipindahkan dari platform satu ke platform lain.
Banyaknya berbagai informasi tambahan disertakan dalam kelas-file Java, memudahkan untuk membuat decompiler bagi Java. Decompiler bekerja dari hasil kompilasi bytecode (yang notabene didistribusikan kepada user jika aplikasi berupa desktop application), dan menghasilkan source code Java. Karena Java menyertakan nama-nama method dan kelas di dalam file bytecodenya, decompiler ini dapat menampilkan nama-nama method secara akurat sesuai aslinya. Ini jauh lebih baik dibandingkan dengan decompiler yang bekerja dari executable binary file[4] , yang tidak dapat menebak nama-nama function kecuali function dari library standar.
Pada dekade ini, semakin sedikit orang yang masih membanggakan source code yang rumit dan membingungkan. Mayoritas pembuat software sudah sadar bahwa source yang jelas dan terstruktur akan memudahkan maintenance dan bug-fixing di masa depan. Sedangkan source code yang sama juga dapat dihasilkan sebagai hasil decompile bytecode Java (file .class). Ini memungkinkan hampir ‘semua’ orang mempelajari struktur data, algoritma, pola desain, dari file .class yang ada. Makin jelas dan terstruktur source code, makin mudah dipelajari oleh orang lain. Mudahnya properti intelektual tersebut dipelajari orang lain menjadi ancaman bagi individu ataupun perusahaan, yang tidak ingin hasil kerjanya dijiplak orang lain. Sehingga ada dua kebutuhan ke arah yang berlainan, untuk meningkatkan kualitas source
1
dibutuhkan source code yang jelas dan terstruktur, dan untuk mencegah penjiplakan dibutuhkan source code yang rumit dan membingungkan. Masalah ini makin penting terutama dalam aplikasi Java yang bersifat mobile[2] .
Sebagai kandidat solusi masalah ini, adalah melakukan transformasi pada bytecode program sebelum mengirimkan bytecode ke pengguna akhir, yang akan merumitkan hasil dekompilasi sehingga sulit dipelajari orang lain. Proses inilah yang disebut bytecode obfuscation. Alternatif lainnya untuk melindungi source code ialah sebagai berikut. 1. Enkripsi. Enkripsi (Seperti yang dibahas Herzberg[12] ) yang dilakukan pada instruksi maupun data akan berguna dalam mencegah reverse engineering. Enkripsi pada instruksi bytecode Java tidak dapat dilakukan dengan efektif, karena semua bytecode kelas pada Java harus melewati method bernama defineClass milik Java runtime sebelum dieksekusi[21] . Seorang hacker dapat mengubah Java runtime pada sistem miliknya sehingga semua bytecode yang diterima defineClass dikeluarkan dalam bentuk file yang tidak terenkripsi. Sedangkan enkripsi pada data merupakan kandidat yang menarik, yang akan dibahas sebagai bagian dari teknik obfuscation dalam tesis ini. 2. Eksekusi di server. Kode yang akan dilindungi properti intelektualnya justru tidak pernah diterima pengguna akhir, karena tersimpan dengan aman di server. Solusi ini mewajibkan pengguna akhir untuk selalu terhubung dengan server produsen perangkat lunak. Jika server ini ditempatkan di mesin milik pengguna, perlindungan yang diberikan cara ini tidak lagi berlaku karena pengguna dapat membuka bytecode Java yang tersimpan di server. 3. Bytecode to native code transformation. Kode Java dilewatkan pada native code generator, yang menghasilkan kode binary executable yang perilakunya sama dengan bytecode. Solusi ini mengorbankan portabilitas program yang dibuat, beserta hal-hal lain yang justru ditawarkan Java seperti sandbox security.
2
1.2
Rumusan masalah
Dalam riset ini dilakukan perbandingan antara beberapa program obfuscator untuk JVM bytecode, yang merubah bytecode sebuah program Java sehingga menjadi sulit untuk di-reverse engineer oleh orang lain. Tujuannya proses obfuscation yang dilakukan obfuscator ialah untuk melindungi properti intelektual yang berada di dalam sebuah kelas-kelas dari program Java. Meskipun obfuscation tidak dapat sepenuhnya mencegah proses reverse engineering, obfuscation merupakan alternatif yang cukup baik di antara usaha-usaha yang bisa dilakukan untuk tujuan itu. Ada beberapa skenario mengapa properti intelektual di dalam sebuah program berbasis Java perlu dilindungi: •
program mengandung kode pustaka dari pihak ketiga yang tidak ingin diekspos ke kalangan umum, sedangkan program hendak didistribusikan ke kalangan umum
•
program mengandung rutin yang sensitif, seperti rutin kriptografi. Pada beberapa bagian JDK terdapat rutin yang telah terobfuscate, misalnya pada jsse.jar dan jce.jar. Obfuscation dilakukan Sun untuk memenuhi peraturan pembatasan ekspor.
•
program merupakan perangkat e-commerce, dengan melakukan obfuscation akan mengurangi frekuensi kasus di mana pemakai berbuat curang dengan mengubah logika perhitungan harga.
•
Program berisi implementasi know-how dari sekelompok orang, yang merupakan keunggulan kompetitif dari pihak lain. Dengan demikian perlindungan properti intelektual menjadi semacam proteksi bagi pihak yang menemukan sesuatu inovasi.
Pada program Java, obfuscation dilakukan pada bytecode, karena dengan cara itulah proses obfuscation tidak perlu dipusingkan oleh parsing teks Java.
Beberapa hal menarik bisa dilihat dengan memperhatikan metode obfuscation yang digunakan
oleh obfuscator komersil, yaitu penggunaan metode-metode yang 3
sebenarnya tidaklah resilient tetapi efektif dalam mencegah decompiler tertentu. Resiliensi[8] didefinisikan sebagai ukuran seberapa besar usaha yang diperlukan untuk membalikkan efek sebuah transformasi obfuscation. Dalam penelitian ini akan dibuktikan beberapa metode memiliki resiliensi yang rendah karena bisa dibuatnya sebuah program yang melakukan transformasi untuk menghilangkan efek suatu metode obfuscation. 1.3
Lingkup Permasalahan
Dalam tesis ini akan dibahas perbandingan antara obfuscator-obfuscator untuk program Java, adapun obfuscator yang akan dibandingkan adalah sebagai berikut : 1. ProGuard, Obfuscator, Open Source, GPL. Versi: 4.0 beta 4 URL ke site utama : http://proguard.sourceforge.net/ URL untuk download : http://sourceforge.net/project/showfiles.php?group_id=54750 2. yGuard, Obfuscator, Open Source, GPL. Versi: 2.2.0 URL ke site utama : http://www.yworks.com/en/index.html URL untuk download : http://www.yworks.com/en/products_download.php?file=yguard-2.2.0.zip 3. Zelix KlassMaster (Evaluation), Obfuscator, Commercial. Versi: 5.0.1 URL ke site utama : http://www.zelix.com/klassmaster/index.html URL untuk download : http://www.zelix.com/klassmaster/download1.html (membutuhkan registrasi untuk bisa download versi evaluasi) 4. SmokeScreen (Evaluation), Obfuscator, Commercial. Versi: 3.5 URL ke site utama : http://www.leesw.com/smokescreen/index.html
4
URL untuk download : http://www.leesw.com/smokescreen/SmokescreenSetup35_Eval.zip 5. DashO Pro (Evaluation), Obfuscator, Commercial. Versi 3.3: URL ke site utama : http://www.preemptive.com/products/dasho/ URL untuk download : http://www.preemptive.com/downloads/RequestEvaluation.html 6. JBCO, prototype obfuscator, Open Source (LGPL), tesis master[1] , McGill University. Subversion2 URL: https://svn.sable.mcgill.ca/soot/soot/trunk/ SVN revision 2732
Perbandingan yang dilakukan akan menitik beratkan pada perubahan kompleksitas pada program setelah dilakukan proses obfuscation. Makin kompleks suatu program, maka makin sulit pula untuk dipahami oleh orang lain. Sedangkan masalah obfuscation cost tidak dibahas dalam tesis ini, baik dalam execution time ataupun memory requirement.
1.4
Metodologi
Perbandingan dilakukan dengan menggunakan beberapa buah program Java sebagai test case. Tiap test case akan di-obfuscate oleh masing-masing obfuscator, dan pada hasilnya dilakukan transformasi balik dan dekompilasi. Pada source code hasil dekompilasi akan dilakukan pengukuran metrik obfuscation, yang menunjukkan kompleksitas dari program hasil obfuscation. Metrik obfuscation menjadi faktor kuantitatif yang dibandingkan antara obfuscator-obfuscator.
2
Subversion adalah source control system yang memiliki fitur sama dan lebih dari CVS (Concurrent
Versioning System), SVN client bisa didapat dari http://subversion.tigris.org/
5
1.5
Kontribusi
Dalam rangka menunjukkan beberapa metode obfuscation tidak seefektif yang terlihat, dibuat beberapa transformasi balik untuk mengalahkan beberapa metode obfuscation. Implementasi dari masing-masing transformasi dapat dilihat pada Lampiran. Transformasi yang dibuat adalah memetakan ulang nama field, nama kelas, penggantian string terenkripsi dengan yang asli, penghapusan predikat transparan, dan penghilangan exception palsu.
Dalam penulisan tesis ini juga dibuat beberapa perubahan (patch) untuk decompiler Dava untuk meningkatkan kemampuan dekompilasinya, dan juga ditemukan pula beberapa bug dalam implementasi obfuscator open-source JBCO.
6