Lindungi Pembajakan Script Oleh Pihak Ketiga dengan Obfuscation

PropellerAds
Mungkin terdengar kurang kerjaan, tetapi itulah yang dilakukan sebagian programmer yang menyamarkan kode programnya dengan teknik tertentu agar sulit dianalisis, atau disebut dengan code obfuscation. Padahal, kode-kode yang ditulis dengan baik dan terdokumentasi pun (seperti berbagai software open source) belum tentu mudah untuk dipahami, bukan? Untuk apa membuat kode program yang sudah keriting menjadi lebih keriting? Tetapi, penggunaan code obfuscation ternyata memiliki motivasi yang berbeda. Program yang ingin di-obfuscate tentunya tidak dibuat untuk dikembangkan, dan dipelajari oleh pihak lain.

Untuk Apa Code Obfuscation?

Code obfuscation merupakan implementasi dari prinsip Security Through Obscurity (STO) yang digunakan juga dalam software engineering, yang percaya bahwa keamanan dapat diraih dengan merahasiakan mekanisme sistem. Implementasi lain dari STO dalam sistem komputer adalah menyembunyikan password dalam kode biner atau mengirimkan dokumen terenkripsi.

Bagi programmer, umumnya code obfuscation digunakan untuk melindungi karya intelektualnya dari usaha reverse code engineering pihak lain. Programmer di sini termasuk juga pembuat malware, yang dari perspektifnya, digunakan untuk menghindari pendeteksian antivirus dan/atau mempersulit peneliti virus untuk menganalisis malware buatannya. Code obfuscation terkadang juga menantang jiwa programmer untuk memecahkannya, atau sebaliknya, merangsang programmer untuk membuat kode yang terlihat serumit mungkin dan susah dimengerti. Tidak jarang terdapat kontes pemrograman untuk membuat kode terlihat susah dimengerti.

Berikut salah satu contoh sederhana code obfuscation pada script PHP:

<?echo “\x68e\154l\157”;?>

PHP merupakan bahasa server side scripting dalam web development dimana source code tersimpan pada server. Jika seseorang memiliki akses masuk ke folder tempat file script PHP tersebut disimpan, maka script biasa dapat terbaca tanpa kesulitan. Kegunaan code obfuscation seperti contoh di atas dapat mempersulit pembacaan dan modifikasi script oleh pihak lain. Jika dieksekusi, script tersebut akan menampilkan kata “hello” (tanpa tanda petik) pada browser.

Tanpa di-obfuscate, script dapat dituliskan sebagai berikut:

<? echo “hello”; ?>

Apa yang dilakukan contoh script PHP yang ter-obfuscate tersebut hingga dapat menampilkan string “hello”? Ternyata, kode \x68e\154l\157 secara berurutan menyimpan arti:
  • \x68 (karakter “h” dalam hexadecimal).
  • e (karakter “e”).
  • \154 (karakter “l” dalam octal).
  • l (karakter “l”).
  • \157 (karakter “o” dalam octal).

JavaScript Obfuscation

Pada umumnya, tidak terlalu banyak programmer yang melakukan code obfuscation pada script PHP ataupun server side script lainnya, dan mempercayakan keamanan script-nya pada server. Tetapi bagaimana dengan script yang umumnya bekerja pada client side, seperti JavaScript dan VBScript? Karena dari sisi client/browser dapat melihat source code script, maka proteksi client side script sangat tergantung pada code obfuscation. Selain digunakan oleh developer yang ingin melindungi karyanya dari penggunaan ilegal, teknik ini juga terkadang digunakan untuk menyamarkan malicious code yang disisipkan pada e-mail/website, untuk itikad buruk seperti spam atau mengarahkan browser ke halaman yang mengandung exploit/ malware.

Beberapa trik yang umum dilakukan antara lain adalah:

1. Mengganti nama variabel.

Mahasiswa dan pelajar yang mempelajari bahasa pemrograman mungkin selalu disarankan untuk menggunakan nama variabel yang deskriptif. Tetapi untuk tujuan menyamarkan kode, penamaan variabel yang deskriptif justru dihindari, dan sebagai gantinya adalah nama variabel yang membingungkan seperti kombinasi huruf dan angka yang acak. Sebagai contoh, berikut adalah potongan Java- Script yang mudah dipahami, yang akan menampilkan kotak pesan bertuliskan “selamat pagi”:

<script type=”text/javascript”>
var pesan =”selamat pagi”;
alert (pesan);
</script>

Pada JavaScript, diijinkan menggunakan nama variabel yang diawali dengan karakter “_” (underscore), sehingga penulisan nama variabel seperti di bawah ini adalah valid, dan tidak mengubah output program:

<script type=”text/javascript”>
var _ =”selamat pagi”;
alert (_);
</script>

2. Melakukan encoding string. Seperti contoh script PHP sebelumnya, string ASCII dapat kita encode ke dalam bentuk lain yang dipahami komputer, yaitu hexadecimal atau lainnya. Masih dengan contoh JavaScript yang sama, kita dapat melakukan encode string sehingga potongan kode menjadi seperti di bawah ini:

<script type=”text/javascript”>
var __ = [“\x73\x65\x6C\x61\x6D\x61\ x74\x20\x70\x61\x67\x69”];
var _ =__[0];
alert (_);
</script>

Perubahan yang dilakukan adalah membuat variabel baru bertipe array, dengan nama “__” (dua underscore) dan mengisi array pertama dengan kode hexadecimal dari string “selamat pagi”. Variabel “_” (satu underscore) kemudian menyimpan nilai ini, lalu program menampilkan string tersebut dengan perintah alert.

3. Ubah format penulisan.

Membuat indent, spasi, enter (line feed/ new line), umumnya digunakan agar kode program rapi dan mudah terbaca mata manusia, tetapi dapat juga digunakan untuk membingungkan mata manusia dengan memberi jarak penulisan yang terlalu jauh, atau bahkan tanpa jarak sama sekali. Tentunya selama bahasa pemrograman yang digunakan mengizinkan hal tersebut. Jika kode JavaScript dituliskan tanpa jarak, akan terlihat sebagai berikut:

<script type=”text/javascript”>var _=[“\x73\x65\x6C\x61\x6D\x61\x74\x20\ x70\x61\x67\x69”];var __=_[0];alert (__);</script>

Trik-trik di atas juga dapat digunakan pada bahasa pemrograman lain dengan tujuan yang sama, yaitu menjadikan source code sulit dipahami. Lebih jauh contoh code obfuscation dengan cara string encoding/decoding akan dibahas sebagai berikut.

String Encoding/Decoding

Ini merupakan sebuah contoh dalam Visual Basic yang awalnya relatif mudah dipahami, kemudian dimodifi kasi menjadi lebih sulit terbaca, tanpa mengubah fungsi program itu sendiri.

Perhatikan potongan kode berikut:

Dim MyString As String
MyString = “password saya: nopass”
MsgBox MyString

Masih mudah memahami kode di atas, yang akan menghasilkan kotak pesan bertuliskan “password saya: nopass”. String ini dapat di-encode agar menghasilkan string yang tidak mudah terbaca, misalnya mengubahnya menjadi bentuk hexadecimal/octal seperti pada contoh script PHP sebelumnya. Agar tidak meng-encode manual, Anda dapat membuat sebuah function yang berfungsi untuk mengubah string (karakter ASCII) menjadi hexa seperti berikut:

Function String2Hex(ByVal st As String) As String
Dim HexStr As String
Dim I As Long
HexStr = “”
For I = 1 To Len(st)
HexStr = HexStr & Hex$(Asc(Mid$(st, I, 1)))
Next
String2Hex = HexStr
End Function

Function di atas akan mengonversi karakter demi karakter dari string yang diberikan dalam bentuk hexadecimal. Contoh penggunaan:

Debug.Print String2Hex(“password saya: nopass”)

Akan menampilkan:

70617373776F726420736179613A206E6F706 17373

Dengan demikian, string tidak akan mudah terbaca. Hanya saja Anda perlu membuat function untuk mengembalikan (decode) hexadecimal kembali menjadi karakter ASCII, sebagai berikut:

Function Hex2String(ByVal HexToStr As String) As String
Dim st As String
Dim I As Long
st = “”
For I = 1 To Len(HexToStr) Step 2
st = st & Chr$(Val(“&H” & Mid$(HexToStr, I, 2))) Next
Hex2String = st
End Function

Sekarang, lihat kode utama yang telah dimodifi kasi menjadi seperti di bawah ini:

Dim MyString As String
MyString = “70617373776F72642073617961 A206E6F70617373”
MsgBox Hex2String(MyString)

Hasil kode di atas akan sama dengan kode sebelumnya, tetapi kode program yang kedua lebih membutuhkan waktu untuk menguraikannya, baik dalam bentuk source code, ataupun setelah melalui proses kompilasi menjadi binary code dan di-dissasembler. Kode kedua jelas memiliki instruksi dan algoritma yang lebih kompleks, walaupun hasil akhir yang didapatkan sama.

Reversing Script

Cakupan reverse code engineering sangat luas, dan erat kaitannya dengan bidang lain seperti bahasa pemrograman low level, cryptography, dan lain sebagainya. Tetapi khusus untuk melakukan reversing pada kode berupa script, dapat dilakukan relatif lebih mudah dengan beberapa panduan, logika, dan pemahaman terhadap cara kerja script itu sendiri.

Obfuscation sederhana umumnya dilakukan pada variabel dan kontennya, sementara yang termasuk dalam reserved word tidak ikut tersamar, karena dari reserved word inilah bahasa pemrograman tersebut dibangun. Beberapa contoh reserved word dalam Visual Basic, antara lain: For (perintah loop), If (perintah kondisi), Function, Sub, dan seterusnya.

Sekalipun reserved word tidak ikut tersamarkan, tetapi dimungkinkan mempersulit analisis program dengan mengubah struktur maupun alur program, tanpa mengubah fungsi awalnya. Misalnya dengan mengganti perulangan for yang relatif mudah dipahami, dengan memanggil function tertentu secara rekursif, dan menghasilkan fungsi perulangan yang sama.

Jika Anda menemukan sebuah script yang telah di-obfuscated sedemikian rupa sehingga susah terbaca, Anda dapat membuka script tersebut dengan text editor yang dapat menandai/highlight reserved word dengan warna tertentu sehingga lebih mudah terlihat. Memperlihatkan sebuah malware bertipe VBScript dengan script yang tampak sulit terbaca, karena telah dilakukan code obfuscation, dibuka dengan text editor Notepad++ dengan highlight reserved word dengan warna biru.

Beri perhatian lebih pada functionfunction yang terdapat pada script, karena bisa saja function tersebut adalah fungsi untuk encode/decode atau enkripsi/ dekripsi string. Untuk fi le VBScript yang tersamar, akan relatif lebih mudah men-debug potongan-potongan kode VBScript jika Anda menggunakan IDE Visual Basic, dan telah terbiasa bekerja di dalam lingkungan GUI tersebut.

Obfuscation pada Kode Biner

Selain melakukan obfuscation dengan melakukan modifikasi source code, teknik obfuscation juga dapat dilakukan pada kode biner (istilah lain adalah code morphing), antara lain dengan membungkus file executable dengan runtime packer. Teknik lainnya yang kerap digunakan malware adalah menyisipkan kode sampah, atau menggunakan teknik/engine polymorphic maupun metamorphic yang juga sering kali didukung teknik-teknik cryptography. Teknik-teknik ini membuat usaha reverse engineering dengan melakukan disassembly pada program executable menjadi lebih sulit. Tentunya, pemahaman pemrograman low level dan bahasa assembly akan membantu dalam melakukan obfuscation ataupun dalam usaha memahami kode yang telah diobfuscated.

Pembuat malware mempelajari bahwa antivirus berusaha mendeteksi operasioperasi yang mencurigakan, seperti operasi file, registry, ataupun network, dan mencoba mendapatkan informasi tersebut dari pemanggilan instruksi call pada kode biner yang terdapat di dalam tubuh malware. Salah satu teknik obfuscation yang digunakan malware untuk menyamarkan instruksi call xxx (dimana xxx alamat tertentu) adalah dengan menggantinya dengan dua instruksi push, masing-masing untuk memasukkan alamat instruksi dan alamat xxx tersebut, dilanjutkan dengan instruksi ret (return). Kode ini dapat disamarkan lebih jauh dengan memperluas tiga instruksi tersebut menjadi lebih kompleks lagi. Hal ini tentu mempersulit analisis manual, ataupun analisis statis yang dilakukan oleh software antivirus.

Penutup

Tergantung dari bahasa pemrograman yang digunakan, teknik obfuscation sangat bervariasi. Bahkan tidak terbatas mengganti variabel atau format string, melainkan juga dengan mengubah perintah/instruksi, yang walaupun berbeda tetapi tetap dapat berfungsi sama. Melakukan code obfuscation umumnya membuat programer memelihara dua jenis kode, yang original dan yang di-obfuscated untuk dirilis. Selain melakukan obfuscation secara manual, beberapa aplikasi/tool juga dapat menghasilkan code obfuscation, atau sebaliknya, berusaha melakukan deobfuscation.

Baik digunakan untuk melindungi hak cipta ataupun menyamarkan malware, code obfuscation tidak menjamin kode akan aman dari usaha reverse engineering. Hal ini juga yang mendorong programmer untuk terus melahirkan teknik baru yang menambah level keamanan, walaupun barangkali, tidak ada batas akhirnya.

Tutorial singkat tentang Lindungi Pembajakan Script Oleh Pihak Ketiga dengan Obfuscationini saya ambil dari PCM Edisi 02 2011, Mudah-mudahan bisa diambil manfaatnya, terima aksih.

Share this with short URL:

You Might Also Like:

Use parse tool to easy get the text style on disqus comments:
Show Parser Hide Parser