No Lintah V 1.0

By : HARI SARYONO, ST

Program AntiVirus
Untuk menghilangkan virus yang menempel di MS Word

Pengantar :

Ada beberapa virus saat ini yang berkarakter menempeli file Microsoft word / excel kita. Virus jenis ini akan dikenali baik oleh AVG maupun Norton antivirus (catatan: saya jarang sekali – boleh juga dibilang tidak pernah – menggunakan program anti virus, karena menyebabkan computer saya berjalan lambat ). Namun sayangnya, kadang-kadang (dan sering terjadi), AVG maupun Norton (atau program anti virus yang anda gunakan) tidak bisa melakukan cleaning terhadap virus tersebut, sehingga file kita dikarantina atau yang lebih ekstrem lagi DIHAPUS!!. Beberapa komentar yang saya baca untuk menangani virus jenis ini adalah : tidak ada cara lain untuk menyelamatkan file kita!. BETULKAH DEMIKIAN???

Sebetulnya, selama file kita tidak dihapus, masih ada cara untuk mengembalikannya. Bahkan sudah dihapus-pun, ada cara mengembalikannya, asalkan tidak dihapus dengan shredding (ditumpuk dengan karakter lain). Berikut ini adalah metode yang saya pakai.

  1. Strategy

Apabila anda mempunyai program Hex Workshop atau Ultra Edit, coba buka sembarang file word / excel anda dengan program tersebut. Saya menggunakan Hex Workshop 2.54, dan file word saya tampak seperti gambar berikut ini :

Gambar 1. file Word yang dilihat dengan menggunakan Hex Workshop

Pada daerah yang saya blok, terdapat tulisan D0 CF 11 E0 A1 B1 1A E1. Coba anda cek pada seluruh file word / excel yang anda punya, semuanya akan berkarakter seperti itu. Tanda diatas merupakan karakteristik file word / excel kita, sebagaimana file exe yang mempunyai tanda MZ di depannya. Lihatlah gambar 2

Gambar 2. Penanda file .Exe

Sekarang, kita coba untuk membuka file word kita yang kena virus. Yang pasti, kita akan mendapatkan tanda MZ disitu. Lihat gambar 3. Oh ya, ini contoh file exe bervirus yang saya ganti ekstensinya menjadi doc agar saya tidak salah click.

Gambar 3. Contoh file word yang ditumpangi virus.  <>Ada tanda MZ (4D 5A) menyatakan bahwa file ini adalah file berjenis .exe

Kalau file ini benar-benar ditumpangi virus, berarti file word kita ada di belakangnya. Mari kita cek dengan menggunakan find D0 CF 11 E0 A1 B1 1A E1 pada file bervirus kita.

Gambar 4. Kotak dialog Find untuk menemukan

Dan hasilnya……

Gambar 5. Awal File Word kita ketemu di alamat A800

Nah, berarti, file kita mulai pada alamat A800. Artinya mulai dari 0000 – A7FF adalah virus. Dengan demikian dapat ditarik kesimpulan bahwa :

  1. Besar file virus yang menempel = A7FFh atau 43 007 byte.
  2. File asli mulai A800 (43008) sampai End Of File (EOF)

Maka beberapa opsi langkah penyelesaian yang dapat dilakukan adalah :

  1. Membuka file terkena virus dan mendeletenya secara manual mulai alamat A7FF.
  2. Mendelete secara otomatis (dengan menggunakan program) dari alamat 0000-A7FF
  3. Mencari karakter D0CF11E0A1B11AE1 pada keseluruhan file selanjutnya mendelete file pada alamat sebelumnya.

Oke, kita telah mendapatkan 3 opsi penyelesaian. Mari kita periksa satu persatu.

  1. Mendelete secara manual?... Hah????. Mungkin nggak masalah kalau yang kena infeksi cuman 1 atau 2 file. Tapi kalau kita punya 1000 file word gimana? Dan berapa lama?... Wah, opsi yang ini sih bukan untuk programmer….
  2. Mendelete secara otomatis sampai 43 007 byte. Ide bagus, namun kita harus berpikir yang lebih general, bahwa virus yang dapat kita tangani tidak hanya jenis ini, karena virus kemungkinan dapat berkembang, yang kedua, apabila angka ini meleset sedikit saja, maka program kita harus juga diganti.
  3. Mencari karakter khusus. Mungkin cara ini yang lebih umum, sehingga virus apapun yang nempel dengan ukuran berapapun, akan dapat disikat habis. Konsekuensinya, run timenya akan lebih lambat, karena program harus membaca isi file byte demi byte.

Tunggu…tunggu, bagaimana kalau File Exe yang ditumpangi?.

Nah, ini masalahnya. Sampai saat ini saya masih belum bisa mendapatkan karakter khusus untuk file Exe. Soalnya ketika saya coba dengan MZ, ada banyak MZ di sebuah file exe terpack (packer exe mirip dengan program zip, bedanya, kalau zip, kita butuh program unzip, sedangkan program unzip pada packer exe sudah disertakan pada exe-nya). Saya sedang memikirkan untuk mencari besar file dengan pembacaan header file, namun kadang kadang file virus selain terpack juga terprotect, dimana protector biasanya merusak header file normal. Kalau anda mempunyai ide yang lain, silahkan coba diimplementasikan.

Terus, bagaimana bisa membedakan sebuah file itu Word atau excel atau power point (barusan saya cek, ternyata powerpoint dan Publisher juga berkarakter D0 CF didepannya). Waah, saya belum  menemukan itu, tapi coba nanti kita fikirkan setelah programnya jadi. Toh, ini <>kan masih versi 1.0. Hahahaaha….

  1. Implementasi program

a.       Algoritma

Kita sudah mempunyai gambaran tentang apa yang akan kita lakukan. Sekarang tinggal merumuskannya satu per satu.

  1. Pertama, tentu saja kita harus mencari file terinfeksi. Asumsikan semua file Exe merupakan file terinfeksi, sehingga dapat menjadi target kita
  2. Yang ini masalah kecepatan. Kita tahu file exe yang kita punya  bisa terdiri dari 0 – tak berhingga ukurannya. Kita faham juga (dari pengalaman) bahwa file virus tidak akan lebih 500 kb (0.5 MB). Dan kita juga tahu bahwa file virus ada di depan file asli kita.
  3. Saat ini virus hanya menumpangi file word  dan excel saja. <>Ada beberapa virus yang menumpangi file Exe seperti Mr. Coolface. Untuk sementara kita garap saja file Word & Excel
  4. selanjutnya, baca byte 1 per satu untuk mendapatkan karakter khusus file word / excel
  5. Kalau ketemu, virusnya, bersihkan, kalau gak ketemu biarkan apa adanya
  6. Ulang untuk file exe yang lain.

Sangat Mudah bukan?.................. bukaaaan…..

b.      Implementasi

Sekarang kita lanjutkan petualangannya dengan implementasi program. Kita akan gunakan program Visual Basic for Application alias macro, karena berbagai kemudahan yang ditawarkan. Ini untuk permulaan. Masalahnya, macro kita akan menjadi target virus juga. Gimana Dooong. Kalau begitu, simpan macro anda di flash disk yang aman, khusus untuk anti virus. Sebelum menjalankan program, matikan dulu virus yang berjalan di memori. Caranya??.... lihat tulisan saya tentang mematikan virus yang jalan di memori disini. Setelah itu, baru program anda jalankan….

Nggak efektif kata anda?.. Yaa, khan masih Versi 1.0. versi berikutnya, anda yang harus mengembangkan.

1.      Membuat  program untuk mencari file terinfeksi

Langkah kita tadi, semua file exe di hard disk atau flash disk akan kita cek. Dengan demikian, kita perlu satu file yang berisi semua alamat file exe di folder target. Caranya gampang. Cukup buka Visual Basic anda, lantas buat beberapa textbar atau command bar seperti gambar dibawah ini, terus buka code window, pastekan kode dibawah ini

Gambar 6. Form Carifile yang dibuat.

'Create a form with a command button (command1), a list box (list1)
           'and four text boxes (text1, text2, text3 and text4).
           'Type in the first textbox a startingpath like c:\
           'and in the second textbox you put a pattern like *.* or *.txt
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" 
(ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA"
(ByVal lpFileName As String) As Long Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Const MAX_PATH = 260
           Const MAXDWORD = &HFFFF
           Const INVALID_HANDLE_VALUE = -1
           Const FILE_ATTRIBUTE_ARCHIVE = &H20
           Const FILE_ATTRIBUTE_DIRECTORY = &H10
           Const FILE_ATTRIBUTE_HIDDEN = &H2
           Const FILE_ATTRIBUTE_NORMAL = &H80
           Const FILE_ATTRIBUTE_READONLY = &H1
           Const FILE_ATTRIBUTE_SYSTEM = &H4
           Const FILE_ATTRIBUTE_TEMPORARY = &H100
           Dim NamaFile
           Private Type FILETIME
   dwLowDateTime As Long
   dwHighDateTime As Long
   End Type
Private Type WIN32_FIND_DATA
   dwFileAttributes As Long
   ftCreationTime As FILETIME
   ftLastAccessTime As FILETIME
   ftLastWriteTime As FILETIME
   nFileSizeHigh As Long
   nFileSizeLow As Long
   dwReserved0 As Long
   dwReserved1 As Long
   cFileName As String * MAX_PATH
   cAlternate As String * 14
   End Type
   Function StripNulls(OriginalStr As String) As String
   If (InStr(OriginalStr, Chr(0)) > 0) Then
   OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
   End If
   StripNulls = OriginalStr
   End Function
Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
   'KPD-Team 1999
   'E-Mail: KPDTeam@Allapi.net
   'URL: http://www.allapi.net/
 Dim FileName As String ' Walking filename variable...
   Dim DirName As String ' SubDirectory Name
   Dim dirNames() As String ' Buffer for directory name entries
   Dim nDir As Integer ' Number of directories in this path
   Dim i As Integer ' For-loop counter...
   Dim hSearch As Long ' Search Handle
   Dim WFD As WIN32_FIND_DATA
   Dim Cont As Integer
   
   If Right(path, 1) <> "\" Then path = path & "\"
   ' Search for subdirectories.
   nDir = 0
   ReDim dirNames(nDir)
   Cont = True
   hSearch = FindFirstFile(path & "*", WFD)
   If hSearch <> INVALID_HANDLE_VALUE Then
   Do While Cont
   DirName = StripNulls(WFD.cFileName)
   ' Ignore the current and encompassing directories.
   If (DirName <> ".") And (DirName <> "..") Then
   ' Check for directory with bitwise comparison.
   If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
   dirNames(nDir) = DirName
   DirCount = DirCount + 1
   nDir = nDir + 1
   ReDim Preserve dirNames(nDir)
   End If
   End If
   Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
   
   Loop
   Cont = FindClose(hSearch)
   End If
   ' Walk through this directory and sum file sizes.
   hSearch = FindFirstFile(path & SearchStr, WFD)
   Cont = True
   If hSearch <> INVALID_HANDLE_VALUE Then
   While Cont
   FileName = StripNulls(WFD.cFileName)
   If (FileName <> ".") And (FileName <> "..") Then
   FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
   FileCount = FileCount + 1
   List1.AddItem path & FileName
   NamaFile = NamaFile + path & FileName + Chr(13)
   End If
   Cont = FindNextFile(hSearch, WFD) ' Get next file
   Wend
   Cont = FindClose(hSearch)
   End If
   ' If there are sub-directories...
   If nDir > 0 Then
   ' Recursively walk into them...
   For i = 0 To nDir - 1
   FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) 
& "\", SearchStr, FileCount, DirCount) Next i End If End Function Sub Command1_Click() Dim SearchPath As String, FindStr As String Dim FileSize As Long Dim NumFiles As Integer, NumDirs As Integer Screen.MousePointer = vbHourglass List1.Clear NamaFile = "" SearchPath = Text1.Text FindStr = Text2.Text FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs) Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories" Text4.Text = "Size of files found under " & SearchPath & " = "
& Format(FileSize, "#,###,###,##0") & " Bytes" Screen.MousePointer = vbDefault End Sub
Private Sub Command2_Click()
         
 If List1.ListCount <> 0 Then
   FileSimpan = InputBox("Nama File?? :")
   Open FileSimpan For Output As #1
   Print #1, NamaFile
   MsgBox ("sudah disimpan...")
   Else
   MsgBox ("Lho..." + Chr(13) + "Khan Gak ada yang perlu disimpan!")
   Exit Sub
   End If
   
   Close #1
End Sub
Private Sub Command3_Click()
           End
           End Sub

>>>>>>>>>>> lanjut ke halaman berikutnya
 


Kemana Setelah Ini?

Selanjutnya
Halaman Bantuan Umum