Pemrograman

Insight & Tutorials in Bahasa Indonesia

Follow publication

Mengenal IL Melalui .NET Decompiler

Equan P.
Pemrograman
Published in
5 min readDec 18, 2018

--

Photo by Chris Greenhow on Unsplash

IL atau Intermediate Language (baca: Common Intermediate Language) merupakan hasil kompilasi dari bahasa C# atau bahasa tingkat tinggi yang lain dari .NET.

Konsep IL pada .NET hampir sama dengan Byte Code di Java dan sepertinya namanya IL merupakan “bahasa tengah-tengah” yang masih membutuhkan software lain yang bernama Virtual Machine untuk menjalankannya.

Pertanyaan dasar yang timbul adalah kenapa harus capek-capek merubah C# ke IL, kenapa tidak langsung saja ke Native Code yang langsung bisa di eksekusi oleh Hardware?

Jawabannya…

“Portabilitas”

Teknologi .NET secara historis saya percaya muncul karena adanya teknologi Java yang waktu itu merupakan satu-satunya solusi untuk portabilitas dimana progamer cukup hanya sekali menulis kode dan kode tersebut bisa dikompilasi di banyak arsitektur komputer dan teknik ini sepertinya yang dipakai oleh teknologi .NET yang muncul beberapa tahun kemudian.

IL Assembly

IL Assembly bisa dibilang merupakan bahasa assembly dari C# dan untuk membaca kode-kode IL hasil kompilasi yang memang berformat biner tersebut sangat bisa dilakukan, salah satunya adalah dengan memakai ILSpy.

IL Assembly adalah bahasa IL sedangkan IL itu sendiri merupakan hasil kompilasi dari kompiler .NET dan berformat biner.

👶 Pertanyaan yang timbul lagi mungkin adalah kenapa harus mempelajari Intermediate Language?

Tentunya ada banyak alasan seperti keperluan untuk debugging, menulis custom .NET kompiler dll tetapi secara pribadi

  • Saya hanya ingin tahu apa itu IL? — Tulisan ini
  • …Hack! (😕?) — Tulisan akan datang

⚡ ILSpy ️
Tool satu ini membaca compiled library .NET dan akan men-dump semua fungsi maupun atribut dari library tersebut sehingga kita bisa mem-browse fungsi internal dari library tersebut serta tentu saja bisa menyimpannya ke berkas IL (sama seperti ILDasm.exe, CLI tool bawaan Microsoft untuk decompiler .NET ).

Kita ambil contoh misalnya pustaka _ilspy_hello.dll dan kita ingin tahu fungsi dan properti apa saja di dalam pustaka tersebut.

ILSpy membaca file _ilspy_hello.dll

ILSpy akan “membaca” _ilspy_hello.dll dalam format kode maupun IL sehingga memang peran tool ini secara esensi adalah sebagai .NET Decompiler.

Hello World

Fungsi Mendal pada pustaka _ilspy_hello.dll yang kita lihat melalui ILSpy secara sederhana hanyalah fungsi yang mengambil argumen string dan kemudian mengembalikan kembali argumen tersebut.

dan representasi kode IL untuk fungsi Mendal tersebut adalah seperti berikut

Perlu anda ketahui bahwa instruksi di IL susunannya sederhana seperti halnya kode-kode assembly kebanyakan, jadi ada Kode Operasional dan Opsional Value (bisa muncul ataupun tidak) serta untuk listing IL di ILSpy ada tambahan Baris Referensi.

Pembacaan IL oleh ILSpy

perintah IL Assembly sepertibr.s IL_0005 diartikan yaitu supaya eksekusi program meloncat ke Baris Referensi IL_0005

Daftar Kode Operasional bisa anda lihat (sebagai referensi) di Daftar Kode IL atau langsung saja klik Kode Operasional di ILSpy (warna biru)

Stack Processing

Model eksekusi dari IL adalah secara stack. Keuntungan metode ini adalah prosesnya sederhana dan sangat cepat karena pada dasarnya hanya melibatkan dua perintah yaitu push dan pop

https://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Lifo_stack.png/350px-Lifo_stack.png

Analogi umum pemrosesan secara stack yaitu seperti tumpukan kartu deck dimana kartu yang paling terakhir ditaruh di atas tumpukan kartu akan selalu diambil pertama kali atau istilahnya LIFOLast In First Out.

Ok. mari kita lihat proses eksekusi dari IL Assembly untuk fungsi Mendal

IL_0000: nop

nop (atau no operation) secara teknis assembly ini tidak melakukan apa-apa kecuali memang tetap membutuhkan clock cycle [ref_nop]

IL_0001: ldarg.0

ldarg.0 operasi ini akan mengambil argumen dari index 0 dan kemudian akan me-push argumen tersebut ke stack. [ref_ldarg.0]. Perintah ini ada karena fungsi Mendal memang membutuhkan argumen berupa String.

IL_0002: stloc.0

stloc.0 proses berikutnya yaitu perintah ini akan memindahkan (pop) data dari stack dan kemudian menyimpan data tersebut ke variabel lokal dengan index 0.

— — 🌞

Pertanyaan mendasar yang timbul adalah apa itu index 0? dan dimana variabel lokal itu disimpan?

Jawabannya sangat bergantung pada kompiler .NET dan implementasi dimana kompiler .NET itu ditargetkan. Meskipun IL memakai metode pemrosesan secara stack tetapi tetap saja masih membutuhkan misalnya register CPU untuk penyimpanan data-data (khususnya yang bertipe referensi). Untuk lebih jelasnya lihat [Stackoverflow].

— — ⭐️

IL_0003: br.s IL_0005

br.s merupakan kode operasional yang menunjukkan supaya eksekusi program meloncat tidak bersyarat ke baris referensi IL_0005 [ref_br.s]

IL_0005: ldloc.0

ldloc.0 artinya ambil data pada variabel lokal dengan index 0 dan taruh (push) ke stack [ref_ldloc.0]

IL_0006: ret

ret merupakan kode operasional terakhir dimana eksekusi akan keluar dari fungsi Mendal dan operasi ini akan mengambil (pop) data dari stack, karena ada kode C# return str dan kemudian selanjutnya akan mem-push data ke stack dimana fungsi Mendal ini di panggil. [ref_ret]

Untuk fungsi sederhana sepertinya proses stack sangat banyak dan cukup melelahkan, mungkin benar kalau itu dilihat dari sudut kita sebagai programer tetapi dari sisi mesin, proses ini sangat efisien karena proses push dan pop selain cukup sederhana juga cepat apalagi ditambah dengan speed dari CPU maupun waktu akses RAM saat ini.

Debugging Dengan dnSpy

ILSpy tidak mempunyai fitur debugging kalau anda ingin fitur debugging bisa memakai tool yang bernama dnSpy yang juga adalah pembaca IL, jadi fitur dnSpy jauh lebih banyak dibandingkan ILSpy hanya saja ILSpy saya pikir jauh lebih sederhana fungsinya dan cocok kalau anda hanya membutuhkan fitur dimana anda membutuhkan pembacaan IL saja.

Untuk eksekusi fungsi Mendal seperti contoh diatas anda bisa melihat proses debugging seperti di video berikut

Debugging IL

🍧🍧🍧

Sangat menarik mempelajari IL terutama teknologi .NET Core (kenapa?) dan Microsoft pun sepertiya sudah jauh lebih “friendly” seperti mulai adanya WSL (Windows Subsytem for Linux), open-source-nya WPF dan Windows Form yang juga mendukung platform .NET Core dan masih banyak alasan kenapa Windows sekarang (10) sangat bisa sebagai mesin utama bagi developer.

Happy Hacking!

Referensi

Tentang Saya
Programer yang tidak terlalu bertendensi ke bahasa pemrograman tertentu, meskipun saya termasuk fans berat dari Node.js tetapi selama problem terselesaikan, ok saja kalau harus memakai teknologi lain — Github, Twitter

Sepertinya tepuk tangan 👏 pengganti LIKE bisa sampai 50, jadi kalau tepuk tangan atau clap cuman 1 akan kelihatan sangat aneh 😆 (Gak..maksud saya clap akan membantu supaya yang lain bisa lebih mudah menemukan artikel ini. Trims)-
-

--

--

No responses yet