Kod polimorf

Dalam terminologi komputer, **kod polimorf** merupakan kod yang mutasi tetapi mengekalkan algoritma asal. Teknik ini kadang-kala digunakan oleh virus komputer, kod kerangka (*shellcode*) dan cecacing komputer bagi menyembunyikan kehadiran mereka. 

Kebanyakan perisian anti-virus dan sistem pengesanan pencerobohan (*intrusion detection system*) cuba untuk mengesan kod jahat dengan menapis fail komputer dan paket data yang dihantar menerusi jaringan komputer. Sekiranya perisian keselamatan menjumpai pola yang sama dengan virus komputer atau cecacing yang dikenali, ia mengambil langkah sewajarnya bagi menangani ancaman tersebut. Algoritma polimorf menjadikannya sukar bagi perisian sebegini bagi mencari kod tersebut kerana ia sentiasa berubah.

Penyulitan merupakan kaedah paling banyak digunakan bagi mencapai polimorf bagi kod. Bagaimanapun, bukan semua kod boleh disulitkan kerana ia akan menjadikannya tidak boleh digunakan langsung. Sebahagian kecil darinya kekal tidak disulitkan dan digunakan bagi memulakan perisian penyahsulitan. Perisian anti-virus mensasarkan kod kecil yang tidak disulitkan ini.

Pengaturcara berniat jahat cuba melindungi kod polimorf dari strategi pengimbasan virus dengan menulis semula enjin yang tidak disulitkan setiap kali virus atau cecacing membiak. Perisian anti-virus menggunakan penganalisa pola rumit bagi mencari pola dasar dalam pelbagai mutasi enjin penyahsulit yang berlainan, dengan harapan dapat mengesan perisian perosak (*malware*) sebegini.

Virus polimorf pertama yang diketahui ditulis oleh oleh Mark Washburn. Virus ini dikenali sebagai virus komputer 1260, ditulis pada 1990. Virus polimorf yamh lebih terkenal dicipta pada 1992 oleh seorang perekah keselamatan (*security cracker*) Bulgaria yang menggunakan nama samaran (*pseudonym*) Dark Avenger sebagai cara mengelakkan pengecaman pola oleh perisian anti-virus.

## Contoh
Algoritma yang menggunakan, sebagai contoh, pemboleh ubah A dan B tetapi bukan pemboleh ubah C mampu kekal walaupun anda memasukkan banyak kod yang mengubah kandungan kepada pemboleh ubah C.

Algoritma asal:

 Start:
 GOTO Decryption_Code
 Encrypted:
     ...
     lots of encrypted code
     ...
 Decryption_Code:
     A = Encrypted
 Loop:
     B = *A
     B = B XOR CryptoKey
     *A = B
     A = A + 1
     GOTO Loop IF NOT A = Decryption_Code
     GOTO Encrypted
  CryptoKey:
     some_random_number

Algoritma yang sama, tetapi dengan banyak perubahan kod C yang tidak diperlukan:

 Start:
 GOTO Decryption_Code
 Encrypted:
     ...
     lots of encrypted code
     ...
 Decryption_Code:
     C = C + 1
     A = Encrypted
 Loop:
     B = *A
     C = 3214 * A
     B = B XOR CryptoKey
     *A = B
     C = 1
     C = A + B
     A = A + 1
     GOTO Loop IF NOT A = Decryption_Code
     C = C^2
     GOTO Encrypted
  CryptoKey:
     nombor_rawak

Kod dalam "Encrypted" ("banyak kod disulitkan") kemudian boleh mencari kod antara Decryption_Code dan CryptoKey dan menyingkir kesemua kod yang menukar pemboleh ubah C. Sebelum enjin penyulit digunakan sekali lagi, ia boleh meletakkan kod baru yang tidak diperlukan yang menukar C, malah menukar kod dalam algoritma dengan kod baru yang melakukan perkara yang sama. Biasanya penulis kod menggunakan kunci sifar (sebagai contoh; A XOR 0 = A) bagi virus generasi pertama, menjadikannya mudah baginya kerana dengan kunci ini kod tidak disulitkan. Dia kemudiannya melaksanakan algoritma kunci meningkat atau secara rawak.

Teknik polimorf lain adalah dengan memasukkan secara automatik NOP (*No Operation*) atau kod operasi (*opcodes*) lain yang tidak menukar algoritma asas.

## Lihat juga
* Garis masa virus komputer dan cecacing yang terkenal
* Kod metamorf
* Kod ubah sendiri (*Self-modifying code*)
* Kod alphanumerik (*alphanumeric code*)
* Kod kerangka (*shellcode*)
* Perekahan perisian (*software cracking*)
* Perekahan keselamatan (*security cracking*)

## Rujukan
* Diomidis Spinellis. Reliable identification of bounded-length viruses is NP-complete. *IEEE Transactions on Information Theory*, 49(1):280–284, January 2003. doi:10.1109/TIT.2002.806137