Virus Polimorfik

Bila kita berbicara tentang keamanan data, maka belum lengkap bila kita tidak membicarakan suatu fenomena dalam teknologi informasi, yaitu virus komputer. Virus komputer merupakan suatu bahaya laten yang sewaktu-waktu dapat menyerang dan merusak sistem komputer. Walaupun perkembangan perangkat keras maupun lunak sedemikian pesat, namun sebagai salah satu produk ciptaan manusia virus komputer juga senantiasa menyesuaikan diri dengan keadaan yang ada. Tak ada istilah virus komputer akan mati atau ketinggalan zaman. Ia akan selalu ada dan beraksi sebagaimana kemauan sang pembuatnya. Pada bab berikut kita akan membahas lebih lanjut tentang virus komputer ini. Catatan, tulisan ini adalah bahan skripsi gagal tahun 1997.

Apakah Virus Komputer Itu?

Dalam tulisan ini pengertian virus adalah “suatu program komputer yang mempunyai kemampuan untuk menggandakan sebagian atau seluruh kode dirinya ke suatu obyek atau program lainnya secara terprogram”. Proses penggandaan tersebut dilakukan dengan cara menginfeksi, memodifikasi, menimpa atau menambah kode obyek lainnya. Bila kemampuan utama ini tidak terpenuhi maka suatu program secara teknis tidak layak disebut virus. Begitupun bila suatu program mempunyai kemampuan menggandakan dirinya atas perintah si pemakai, hal tersebut juga tidak bisa disebut virus, karena karakteristik ‘secara terprogram’ di sini berarti segala sesuatunya berjalan otomatis tanpa membutuhkan campur tangan pemakai.

Banyak metode atau cara suatu virus untuk melakukan tugasnya. Biasanya cara ini disesuaikan pada lingkungan mana atau sistem operasi mana dia berada. Bisa pula cara ini disesuaikan dengan kemampuan maupun target yang diinginkan oleh pembuatnya.

Seperti umumnya suatu program, sebuah virus juga kadang-kadang membawa suatu misi tertentu. Misi tersebut bisa berupa efek tertentu, seperti tampilan, pesan, animasi, hingga suatu kemampuan yang dapat melumpuhkan sistem. Sebagai suatu pembawa (carrier), suatu virus bisa diibaratkan sebagai perpanjangan tangan dari si pembuat, tentang ide-ide apa yang dimiliki olehnya.

Pada cakupan tulisan ini virus komputer kita persempit hanya ke suatu obyek, yaitu file program berbasis DOS. Fokus kita hanya pada mengatasi teknik polimorfik pada virus komputer. Dengan contoh ini diharapkan bisa mewakili beberapa virus pada obyek-obyek yang lain.

Teknik Polimorfik

Pengertian polimorfik di sini adalah “mempunyai banyak bentuk”. Proses penciptaan banyak (poly) bentuk dilakukan melalui proses transformasi (morph) bentuk. Istilah polimorfik digunakan karena istilah ini telah menjadi baku dalam hal virus komputer.

Pada virus kovensional (biasa), yang hanya menerapkan pemrograman biasa, kode programnya adalah tetap. Jadi bila virus ini mampu menularkan tubuhnya ke file program yang lain, maka dengan kode-kode program yang sama. Walaupun virus ini menggunakan teknik penyandian (encrypt) pada sebagian besar kode programnya, namun ada sebagian kecil kode yang bersifat relatif tetap. Kode tersebut biasanya terletak pada bagian pembuka sandi sandi (decrypt).

Kita lihat contoh sebuah virus konvensional:

Infeksi Pertama:

1813:1500 E80000    CALL   1503

1813:1503 5B            POP      BX

1813:1504 8D7F5B   LEA     DI,[BX+5B]

1813:1507 0E            PUSH   CS

1813:1508 07            POP       ES

1813:1509 FD           STD

1813:150A AB          STOSW

Infeksi Kedua:

1813:1500 E80000    CALL   1503

1813:1503 5B            POP      BX

1813:1504 8D7F5B   LEA     DI,[BX+5B]

1813:1507 0E            PUSH   CS

1813:1508 07            POP       ES

1813:1509 FD           STD

1813:150A AB          STOSW

Pada potongan kode program di atas, terlihat bahwa ada sebuah pola atau urutan kode yang bersifat tetap. Dengan pengenalan terhadap kode-kode program tersebut, mudah bagi kita untuk mendeteksi bahwa suatu file program terserang virus di atas. Dalam menentukan awal suatu program dikenal istilah Entry Point, yang untuk selanjutnya kita singkat EP.

Sekarang kita lihat contoh virus polimorfik:

Infeksi Pertama:

1813:1FCE 8BF8            MOV          DI,AX

1813:1FD0 C7C28F28    MOV          DX,288F

1813:1FD4 C7C5DB5F   MOV         BP,5FDB

1813:1FD8 81ED7456     SUB          BP,5674

1813:1FDC C7C37426    MOV         BX,2674

1813:1FE0 BEB2A8        MOV         SI,A8B2

1813:1FE3 2BF8              SUB          DI,AX

Infeksi Kedua:

1813:1FCE 81F33CC5      XOR        BX,C53C

1813:1FD2 8D2E1870      LEA         BP,[7018]

1813:1FD6 2BC0              SUB         AX,AX

1813:1FD8 81C88DCD     OR           AX,CD8D

1813:1FDC 11CE              ADC        SI,CX

1813:1FDE 8D06E207      LEA         AX,[07E2]

1813:1FE2 0BD8               OR           BX,AX

Dari contoh di atas terlihat bahwa kode virus adalah selalu berubah-ubah setiap kali menulari file program. Hal ini menimbulkan kesulitan dalam mendeteksi virus jenis ini, karena tidak ada suatu pola yang dapat digunakan sebagai bahan acuan. Kalaupun ada suatu kemungkinan kombinasi yang dapat terdeteksi, hal itu adalah suatu kebetulan. Dan dalam dunia angka-angka seperti komputer ini, sesuatu yang tidak meyakinkan haruslah benar-benar dihindari.

Tidak hanya kode-kode program yang selalu berubah, namun biasanya virus polimorfik juga mempunyai panjang kode yang selalu berubah-ubah. Akibatnya tentu alamat variabel maupun data-data selalu berubah-ubah, dilihat dari EP, sehingga tidak diketahui di mana badan asli virus sebenarnya, yang membuat upaya pembukaan sandi (lewat perkiraan) adalah sangat sulit.

Pada virus polimorfik adalah biasa membuat metode penyandian (enkripsi/dekripsi) secara acak. Jadi hasilnya adalah suatu kode program yang benar-benar tidak teratur, sehingga membuat hampir mustahil untuk mendeteksi maupun mengembalikan file program terinfeksi. Bahkan pada tingkat yang lebih kompleks, keacakan ini terjadi berlapis-lapis. Sehingga tidaklah mengherankan bila pembuatnya sendiri tidak mengetahui cara untuk mengenali virus buatannya sendiri.

Pada dasarnya suatu virus adalah sebuah program, sehingga walaupun menggunakan teknik polimorfik tapi tentu saja ia mempunyai tubuh program yang berisi kode- kode yang sama. Untuk membuat suatu virus mempunyai kode-kode yang selalu berubah-ubah adalah lewat penciptaan metode ekripsi yang berbeda-beda dan proses pengacakan rutin dekripsi. Berikut garis besar teknik polimorfik:

  • Pembuatan tubuh virus (kode-kode program tetap)
  • Pembuatan rutin ekripsi/dekripsi
  • Penyandian tubuh virus
  • Pengacakan rutin dekripsi

Tentang pembuatan tubuh virus tidak dibahas pada tulisan ini, dan kita hanya membahas 3 item terakhir.

Pembentukan Rutin Penyandian

Untuk membuat suatu kode yang berubah-ubah, maka virus harus memiliki metode perubahan bentuk pada kode asalnya atau dikenal dengan istilan penyandian. Penyandian ini terdiri dari 2 unsur, yaitu enkripsi dan dekripsi.

Proses Enkripsi berarti proses merubah suatu kode-kode tetap menjadi suatu kode tertentu lewat suatu perhitungan tertentu.

Proses Dekripsi berarti proses merubah kode-kode tertentu kembali ke kode asalnya melalui perhitungan tertentu.

Tujuan untuk melakukan proses enkripsi atau dekripsi biasanya untuk masalah keamanan data. Kode hasil enkripsi berupa kode-kode yang tidak bermakna, atau bila ditinjau dari segi program yaitu kode-kode mesin yang tidak beraturan. Kode hasil enkripsi hanya akan jadi sesuatu yang bermakna setelah melewati tahap dekripsi, atau dari segi program maka kode-kode yang tidak beraturan tadi setelah didekrip akan berubah menjadi kode-kode mesin normal yang dapat dijalankan.

Dari segi virus, tujuan dari proses enkripsi/dekripsi ini untuk menyamarkan kode-kode programnya menjadi tak terbaca sehingga menyulitkan pemeriksaan atau analisa program. Dari segi polimorfik, proses enkripsi/dekripsi ini menjadi inti dari pembentukan kode-kode program yang selalu berubah-ubah. Dengan merubah metode ekripsi/dekripsi maka dihasilkan kode-kode program yang selalu berubah-ubah, walaupun asalnya dari kode-kode yang tetap.

Dalam membentuk rutin penyandian, secara garis besar dapat dibagi sbb:

  • Memilih acak dari sekumpulan metode sandi
  • Menciptakan acak parameter-parameter sandi
  • Memilih acak dari sekumpulan metode sandi,

Pada suatu virus, biasanya sudah ditentukan metode-metode apa yang akan dijadikan cara penyandian. Metode ini bisa dalam bentuk per instruksi sederhana, contoh:

Enkriptor: XOR   SUB   ADD   ROL   ROR   NOT   NEG   INC   DEC

Dekriptor: XOR   ADD   SUB   ROR   ROL   NOT   NEG   DEC   INC

Namun kebanyakan virus juga memiliki kumpulan logika rutin penyandian yang akan digabungkan dengan instruksi sandi. Misal:

Acak 1:

@@L1:

POP AX                      ;pengambilan nilai dari stack

XOR AX,1000h         ;instruksi enkripsi/dekripsi

MOV CS:[BX],AX

INC BX

INC BX

PUSH AX

PUSH AX

LOOP @@L1

Acak 2:

@@L1:

LODSW                      ;pengambilan nilai dari ops string

XOR AX,1000h         ;instruksi enkripsi/dekripsi

MOV CS:[BX],AX

ADD BX,0002h

DEC DX

JNZ @@L1

 

Kadangkala suatu virus juga memiliki logika program yang juga diciptakan secara acak. Atau metode ekripsi/dekripsi yang tidak sekedar pilihan dari sejumlah kumpulan, namun dibuat acak secara berulang-ulang dan urutan berbeda-beda. Contoh:

Acak 1:

XOR AX,1000h

SUB AX,1234h

ROL AX,1

DEC AX

ROR AX,1         ;jenis instruksi dipilih acak

Acak 2:

SUB AX,3456h

ROR AX,1

ROR AX,1

DEC AX

ADD AX,5555h

ROL AX,1         ;panjang instruksi tidak tentu

  • Menciptakan acak parameter sandi,

Parameter ini erat kaitannya dalam instruksi sandi. Jadi dalam instruksi misal SUB AX,1234h, maka 1234h adalah parameternya. Virus harus mempunyai cara supaya suatu kode tersandi dapat kembali ke bentuk asalnya. Jadi dari contoh di atas, maka untuk mengembalikan kode ke kode asalnya dengan instruksi ADD AX,1234h. Contoh dalam bentuk yang lebih panjang:

Enkrip:

ADD AX,1234h     ;1234h diciptakan acak

ROL AX,1

INC AX

XOR AX,3456h

NEG AX

NOT AX

Dekrip:

NOT AX

NEG AX

XOR AX,3456h

DEC AX

ROR AX,1

SUB AX,1234h     ;urutan pembalik perlu diperhatikan

 

Penyandian Tubuh Virus

Setelah didapat metode atau rutin penyandian, tahap berikutnya adalah menyandi tubuh virusnya. Penyandian dilakukan lewat metode yang telah disusun. Pada virus-virus yang tidak kompleks, di mana intruksi penyandiannya relatif pendek, proses ini dapat dilakukan lewat percabangan. Misal, suatu virus hanya tinggal memilih dari 3 intruksi sandi, XOR, ADD atau SUB. Sedang pada virus-virus yang lebih rumit, dengan banyak susunan instruksi, maka virus perlu memanggil rutin yang telah disusunnya untuk proses penyandian tubuh virusnya.

Cara Sederhana:

 CMP DL,1                              ;seleksi metode enkripsi

JZ __XOR

CMP DL,2

JZ __ADD

CMP DL,3

JZ __SUB

JMP __END

__XOR:

XOR AX,BX                          ;1 pilihan per instruksi

JMP __END

__ADD:

ADD AX,BX

JMP __END

__SUB:

SUB AX,BX

__END:

Cara Kompleks:

__Rutin_Enkripsi:

ADD   AX,1234h       ;instruksi enkripsi didapat secara acak

ROL    AX,1

INC     AX

XOR   AX,3456h

NEG    AX

NOT    AX

NOP                             ;sisa buffer diisi intruksi tak berarti

NOP

NOP

RET

__PROSES:

@@L1:

LODSW

CALL             __RUTIN_ENKRIPSI           ;untuk menyandi dengan memanggil buffer

MOV   [BX],AX                                 ;yang berisi rutin enkripsi

LOOP             @@L1

Pada virus polimorfik rutin enkripsi atau dekripsi biasanya memiliki panjang yang tidak tetap. Oleh karena itu lokasi variabel atau data-data tersandi tidaklah tetap. Biasanya pada rutin pembuka sandinya (dekrip) memiliki rutin pencari alamat mula, baik untuk programnya sendiri maupun bagian kode yang tersandi. Bisa pula dengan selalu mengganti referensi alamat pada kode program setiap kali tercipta rutin dekripsi baru. Cara lain dengan memakai rujukan yang bersifat semacam pointer, jadi dengan menggunakan pengalamatan tidak langsung. Dengan mengganti tabel alamat, otomatis lokasi variabel yang dituju juga akan berubah.

Mencari Alamat Awal:

CALL @@LOK_IP     ;alamat mulai = 100h

@@LOK_IP:

POP BX

ADD BX,0004h

. . .

@@DATA_TERSANDI:       ;alamat tersandi = 107h

DB 01,02,03 …

Perubahan Pada Kode:

MOV BX,107h            ;parameter alamat dapat diganti-ganti

. . .

@@DATA_TERSANDI:

DB 01,02,03 …

Memakai Pointer:

            MOV BX,[@@PTR1]   ;lokasi alamat secara tidak langsung

. . .

@@PTR1:

DW 107h

@@DATA

DB 01,02,03 …

 

Pengacakan Rutin Dekripsi

Bagian dekripsi memegang peranan penting dalam proses polimorfik pada virus. Setelah mampu menyamarkan kode program ke dalam bentuk yang berbeda-beda, maka sangat penting untuk mampu mengembalikan kode program tersebut ke bentuk asalnya, sekaligus mampu dijalankan seperti semula. Rutin dekripsi biasanya tercipta bersamaan pembuatan rutin enkripsi, atau merupakan operasi berlawanan terhadap operasi enkripsi. Pada beberapa contoh di atas dapat dilihat bagaimana operasi berlawanan tersebut.

Walaupun telah didapat suatu rutin dekripsi yang relatif acak, namun itu saja masih kurang berarti. Perlu tambahan kode-kode ‘pembingung’ yang dapat disisipkan tanpa merusak jalannya logika program. Kode-kode ini biasa disebut kode sampah (junk). Ada beberapa cara dalam mendapatkan kode sampah ini:

  1. Lewat instruksi yang tidak berpengaruh terhadap isi register/memori atau operasi logika/perhitungan. Biasanya ini ditujukan terhadap intruksi yang besarnya 1 byte.

Misal:

NOP    ;no operation

CLC    ;clear carry

CLD    ;clear direction flag

CLI    ;clear interrupt flag

STD    ;set direction

STI      ;set interrupt

CMC   ;complement carry

  1. Lewat operasi register/memori yang diyakini tidak mempengaruhi logika program. Untuk ini sebuah virus harus mempunyai semacam tabel register yang digunakan dalam membuat rutin dekrip acakan. Hasil cara ini memang menghasilkan kombinasi yang sangat beragam, tergantung banyaknya instruksi acak yang didukung suatu virus.

Misal:

MOV   DI,1000h         ;sederetan instruksi sampah

SUB    BX,1234h

CMP    DI,[0050h]

XOR   CX,[0055h]

ROL    CX,1                ;hingga

SUB    AX,4455h        ;register AX yang berpengaruh

 

  1. Lewat upaya menjaga program tetap berjalan walaupun melewati setumpukan data sampah. Umumnya ini dilakukan lewat instruksi-instruksi yang bersifat percabangan (branch) atau pelompatan (jump).

Misal:

JMP @@L1                ;lewati

DB 01,02,03 …           ;sampah

@@L1:

LOOP @@L2            ;lewati

DB 01,02,03 …           ;sampah

@@L3:

XOR AX,4455h         ;instruksi dekrip

 

Dari beberapa penjelasan di atas, dapat kita ambil kesimpulan bahwa virus dengan teknik polimorfik, selain bertujuan untuk mempersulit pendeteksian, namun juga berusaha agar program asalnya tetap berjalan. Jadi seacak apapun kode program yang dihasilkan, namun tetap dijaga agar itu dapat berjalan dengan baik.

Jadi bila kita ingin membuat suatu cara agar dapat mendeteksi suatu virus yang polimorfik, tak bisa lain kecuali kita harus ‘menjalankannya’. Atau dengan kata lain kita harus menelusurinya dari level yang terendah, yaitu level prosesor. Kita harus menirukan cara kerja prosesor, mensimulasikan tiap-tiap instruksi, hingga didapat rutin asli virus yang sesungguhnya. Pada bab-bab selanjutnya kita akan banyak berbicara tentang hal ini.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s