Serum Virus Hare

virus_multi Virus multipartit nampaknya mulai menggejala belakangan ini. Namun itu saja belum cukup. Pembuatnya tak kurang akal untuk membuatnya semakin rumit, yaitu dengan teknik polimorfik. Ditambah trik-trik cerdiknya, sistem operasi Windows pun dapat terlewati dengan baik. Berikut akan kita bahas virus Hare.7786.

Virus ini tergolong virus berbahaya, karena di dalamnya terdapat bom waktu yang dapat meledak, yaitu setiap tanggal 22 pada bulan Agustus dan September. Aksinya berupa tampilan dan penulisan ke hard disk. Tampaknya virus ini berusaha secara cerdik mengoptimalkan dirinya agar berjalan dengan baik pada sistem operasi Windows. Beberapa trik sederhana namun efektif dilakukan untuk itu. Namun teknik infeksi partisi yang kurang sempurna, membuat virus ini cukup bermasalah bila dijalankan pada hard disk dengan konfigurasi tertentu.

Tampaknya virus ini berasal dari luar negeri, selain karena pesan di tubuhnya cara kerjanya pun yang cukup aneh. Bila virus aktif di memory, terlihat serangkaian kalimat: ‘HDEuthanasia v3 By Demon Emperor: Hare Krshna, hare, hare..’. Sesuai pesan tersebut dan panjang infeksinya, kita namakan saja virus ini virus Hare.7786.

Instalasi Virus File

Pada saat program EXE/COM/Overlay dijalankan, maka rutin virus yang menempel pada program tersebut yang akan pertama kali dijalankan. Pertama kali virus akan mendekrip dirinya sendiri, melalui serangkaian kode program yang dapat berubah-ubah bentuk (polimorfik). Lalu virus mengecek keberadaannya dalam sistem, melalui pemanggilan fungsi DOS, Int 21h AX=0FE23h. Bila didapat hasil AX=000Dh berarti virus sudah menetap di memori. Dilanjutkan dengan alokasi memori untuk tempat virus bekerja, yang dapat berupa memori konvensional (0-9FFFFh) maupun Upper Memory Block (0A0000h-100000h).

Pada proses selanjutnya virus juga berusaha untuk menginfeksi partisi hard disk. Dimulai dengan pengecekan fungsi virus untuk operasi disk, Int 13h AX=5445h. Bila hasil AX=4554h berarti rutin tersebut sudah aktif, partisi dianggap sudah terinfeksi. Bila tidak maka virus akan mencari lokasi fisik dari pojok hard disk, atau dikenal dengan Landing Zone. Proses ini dengan mudah dilakukan dengan mencari konfigurasi fisik hard disk (berapa track, berapa silinder dan berapa sektor), dan perhitungan track+1, silinder-1, sektor-10h. Partisi asli diletakkan di sektor ke-10h. Namun cara ini cukup riskan bila dijalankan pada komputer dengan hard disk > 528 MB dan sebagian besar BIOS 486 DX2 ke bawah. Pada BIOS ini belum dikenal mode LBA (Large Block Adressing) ataupun mode CHS dengan track > 1023. Akibatnya operasi track+1 pada 1023 (3FFh) menghasilkan 768 (300h). Lokasi ini bisa menimpa sembarang file.

Sesudah pojok hard disk ditentukan, maka badan virus ditulis di tempat tersebut melalui operasi disk normal (Int 13h). Pada penulisan kode partisi maka virus mempunyai 2 kemungkinan untuk melakukan proses ini. Bila Windows aktif dan sedang dalam modus enhanced maka operasi ini dilakukan secara ‘normal’ yaitu dengan menelusuri vektor 13h, operasi device DOS, dan dengan tambahan ‘tebak-tebakan’ dengan fasilitas virus warning dari BIOS. Pada BIOS 386 ke atas biasanya terdapat fasilitas untuk mencegah penulisan ke daerah partisi hard disk. Bila dideteksi ada penulisan ke partisi, maka biasanya BIOS memberi suatu peringatan dengan kemungkinan jawaban ‘Y’es atau ‘N’o. Entah apa maksudnya, namun virus Hare ini melakukan beberapa kemungkinan jawaban, yaitu NNNYY. Jika Windows tidak aktif maka virus ini akan melakukan penulisan langsung lewat operasi port. Untuk operasi ini virus Hare secara cerdik memeriksa langsung isi CMOS untuk apakah ada hard disk (IDE) terpasang. Maklum saja, biasanya hard disk model SCSI tidak terdaftar dalam CMOS, selain mengandalkan info BIOS internalnya. Dengan demikian jangan heran bila peringatan BIOS tidak muncul (sedikitpun) namun ternyata virus Hare telah bersarang dalam partisi Anda.

Selanjutnya virus menelusuri vektor DOS (21h) dan titik terdalam vektor ini yang dipanggil bila virus melakukan operasi DOS secara internal. Biasanya ini dilakukan untuk menghindari deteksi dari program anti virus. Untuk pencegatan vektor virus ini melakukannya secara biasa, yaitu pada titik teratas. Tidak heran, karena cara inilah yang paling aman bila virus ingin selamat saat dijalankan lewat Windows. Tidak kenal kompromi, bila dideteksi variabel sistem ‘WIN..=’ aktif, maka virus akan menghapus file ‘WIN..\SYSTEM\ IOSUBSYS\HSFLOP.PDR’. Sehingga nantinya operasi yang mengakses disket akan berlangsung lewat BIOS, yang tentu saja di bawah kendali virus.

Lalu virus mengembalikan register-register yang berubah dan kembali ke titik awal program asli. Sejak saat ini virus Hare telah aktif dalam sistem dan telah pula menginfeksi partisi. Dalam fungsi DOS virus ini melakukan beberapa cegatan:

  • 4Eh (Find First Matching File), 11h (Search First Entry Using MCB), 4Fh (Find Next Matching File), 12h (Search Next Entry Using MCB), dimanipulasi agar seakan-akan file terinfeksi tidak berubah (besar), karena ternyata masih terdapat perbedaan kecil antara file yang terinfeksi dan yang tidak. Virus ini menggunakan tanda detik=34 untuk menandakan program telah terinfeksi, yang tidak selalu benar.
  • 3Dh (Open File Using Handle), digunakan untuk menulari suatu file/program ketika akan dibuka, dengan syarat program tersebut bukan yang sedang dijalankan.
  • 3Eh (Close File Using Handle), digunakan untuk menulari suatu file/program ketika akan ditutup. Virus ini mengambil langsung nama file dari Sistem File Table (SFT).
  • 4B00h (Execute Program), digunakan selain untuk menginfeksi program ketika akan dijalankan, juga untuk memulihkan file program sebelum dijalankan. Hal ini untuk mencegah suatu program, termasuk anti virus yang menetap, mengetahui perubahan dari file program. Konsep ini cukup aneh namun terbukti aman dan efektif untuk mengelabui program anti virus.
  • 00h (Program Terminate), 4Ch (Terminate Process With Return Code), 31h (Terminate Process and Remain Resident), dimanipulasi dalam rangkaian proses siluman, yaitu program yang telah selesai dijalankan sebelum kembali ke DOS maka akan dinfeksi kembali.
  • 36h (Get Disk Free Space), disimulasikan agar suatu program (antivirus) yang selalu mengecek besar ruang kosong pada disk tidak mengetahui perbedaan akibat membengkaknya suatu file, ketika file (program) tersebut diperiksa.
  • 0FE23h, penanda virus sudah aktif di memori, dengan hasil AX=000Dh.

Virus Hare juga menolak menginfeksi file program dengan nama berikut: TB*.*, F-*.*, IV*.*, CH*.*, COMMAND*.* dan nama program yang mengandung huruf V. Lebih baik mencegah daripada ketahuan, begitu mungkin prinsipnya.

Instalasi Virus Boot/Partisi

Pertama kali rutin virus aktif pada saat boot, dimulai dengan melakukan dekrip lewat rutin yang polimorfik, penentuan lokasi virus bersarang (memori konvensional-9 Kb), dan pemuatan badan virus dari daerah landing zone hard disk atau disket pada track 41/81. Lalu virus melakukan pengecekan/infeksi partisi dan menuliskan ulang tabel partisi beserta kode partisi yang sudah tertempel virus. Virus Hare untuk sementara tidak melakukan pencegatan pada vektor 13h. Penulis kira trik ini ada kaitannya dengan Windows 95, yang tujuannya mencegah cegatan virus dikenal sebagai mode kompabilitas DOS. Dilanjutkan dengan pengecekan tanggal, yaitu setiap tanggal 22 pada bulan Agustus dan September, virus menampilkan sederetan string dan melakukan aksinya. Setelah mencegat vektor 1Ch (System Timer Tick), rutin asli partisi/boot dijalankan.

Lewat Int 1Ch virus Hare mengecek apakan vektor DOS (21h) sudah diinisialiasi dan dapat segera dicegat. Proses cegat dan cek ini berulang beberapa kali, hingga pada proses terakhir virus mencegat sistem secara keseluruhan, yaitu Int 13h (Disk), Int 21h (DOS), dan Int 28h (Dos Idle). Cara yang cukup rumit ini terbukti mampu berjalan secara aman tanpa mengundang kecurigaan sistem. Namun bukan berarti tanpa kesalahan. Entah apa yang tidak benar, bila driver DBLBUFF.SYS dimuat dalam sistem, sistem operasi mogok berjalan. Setelah dicoba untuk menghapus file tersebut, barulah DOS maupun Windows berjalan dengan normal. Yang membingungkan, sebab driver tersebut biasanya akan dimuat baik dalam Windows 3.xx mapun Windows 95. Bila semuanya berjalan baik maka operasi virus selanjutnya tidak menimbulkan masalah berarti.

Dalam vektor 13h virus ini melakukan beberapa cegatan:

  • 02h (Read Sector), virus akan memberikan data sektor yang asli bila dilakukan pembacaan pada lokasi boot/partisi.
  • 03h (Write Sector), virus akan menulis sektor pada lokasi penyembunyian sektor asli.
  • 16h (Change Status), pada kesempatan ini virus akan melakukan inisialisasi/infeksi pada disket.
  • 5445h, bila AX=4554h berarti rutin virus boot/partisi telah aktif.

Rutin Polimorfik

Virus Hare mempunyai kemampuan untuk berubah-ubah kode pada awal rutin dekripnya. Padahal untuk mengetahui suatu program terinfeksi virus atau tidak, kita memerlukan suatu deretan kode yang bersifat tetap sebagai penanda virus. Biasanya deretan kode ini terletak minimal pada rutin dekripnya, karena kebanyakan virus mengenkripsi badan virusnya untuk mempersulit khalayak umum curiga atau mengetahui cara kerjanya.

Untungnya rutin polimorfik dalam virus Hare tidak rumit, dan lebih untung lagi karena virus Hare sendiri menyediakan cara tercepat untuk memulihkan file program ke bentuk semula. Setidaknya bila Hare percaya pada kemungkinan tersebut, mengapa kita tidak. Bila digambarkan maka rutin dekrip virus Hare sbb:

Titik_Awal:

. . .

mov dl,11h {2 byte}

. . .

cs: {1 byte}

xor [si],dl {2 byte}

. . .

Pada rutin di atas, terdapat 4 kemungkinan kode dapat berubah, register isian awal (dl), operand isian (11h), operasi dekrip (xor), dan lokasi memori tujuan ([si]). Tentu saja di antara kode-kode tersebut dapat berupa kode-kode atau data-data sampah yang tidak berguna, dengan panjang yang dapat berubah-ubah. Kemungkinan lain dari kombinasi tersebut misalnya:

Titik_Awal:

. . .

mov al,56h {2 byte}

. . .

cs: {1 byte}

sub [di],al {2 byte}

. . .

Dari 2 contoh di atas Anda dapat melihat ada sesuatu yang sama. Ya, kode segment override cs: (2Eh). Langkah pertama kita cari dulu lokasi awal rutin virus. Sesuai referensi dari Hare, kita baca sebanyak 32h byte, dan cari mundur kode 2Eh. Bila ditemukan dan 1 byte di depannya salah satu dari 3 kemungkinan operasi, yaitu xor, sub, dan and, maka ambil kode operand ke-2 dan cari mundur kode pengisian register, hingga didapat operand untuk proses dekrip. Dari titik ini lokasi mundur 1E6Ah merupakan awal badan virus, yang setelah kita dekrip awal perlu di-not lagi agar kode virus terbuka seluruhnya. Header asli program terletak pada ofset 16Bh dari awal badan virus.

Pada infeksi pada partisi/boot, walaupun virus Hare berulang kali menginfeksi hard disk (yang berakibat berubah-ubahnya kode partisi), namun badan virus pada lokasi persembunyiannya tidak dienkripsi. Dan untuk mengecek apakah partisi/boot telah tertular virus dapat dengan mudah dicek melalui perhitungan Word(Buf[102h]) – Word(Buf[100h]) yang bila = 0CCFFh berarti kemungkinan besar boot/partisi telah tertular virus. Pemastian lebih lanjut dengan menelusuri ke badan virusnya.

Program Serum Virus

Penulis menyertakan listing program untuk mengatasi virus Hare ini. Program ANTIHARE.PAS dibuat dengan bahasa Pascal, dan dikompilasi dengan Turbo Pascal 6.0+. Sebaiknya Turbo Pascal 7.0 seperti yang penulis gunakan. Bila Anda menggunakan Borland Pascal 7.0, atur agar target kompiler ke modus real.

Secara garis besar program ini mempunyai 3 prosedur untuk pembasmian virus Hare, yaitu:

  1. PMem, mendeteksi keaktifan virus di memory. Virus Hare mampu menyusup baik di memori konvensional maupun UMB, sehingga keduanya perlu kita periksa. Dalam operasinya virus Hare mencegat 3 interrupt, yaitu 13h (Disk), 21h (fungsi DOS), dan 28h (DOS idle loop). Untuk melumpuhkannya kita cukup mencari segment awal dari lokasi virus, dan melakukan pemulihan jalur interupsi dengan urutan dan tempat yang tepat.
  2. PDir, mendeteksi dan melenyapkan virus di file-file program pada direktori yang disebutkan lewat parameter. Pendeteksian meliputi seluruh program berektensi EXE, COM, BIN, OVR dan OVL. Bila diinginkan dapat dilakukan proses scan pada seluruh file, mengingat banyak file-file program yang termuat sebagai overlay atau driver sistem dengan bermacam ekstensi. Bila file positif terkena virus, maka akan segera dibersihkan dan dikembalikan seperti semula. Perhatian khusus bila file terserang lebih dari satu virus. Apabila virus Hare tidak berada pada lapisan terluar, maka program tidak mendeteksi adanya virus pada file tersebut. Hal ini sulit dicari jalan keluarnya, kecuali virus-virus yang masuk setelah Hare dibersihkan terlebih dahulu.
  3. PBoot, mendeteksi dan melenyapkan virus baik di partisi maupun boot sektor. Dalam penginfeksian partisi virus Hare tidak mengembalikan konfigurasi tabel partisi, sehingga membuat hard disk tidak dikenal bila dijalankan pada sistem DOS yang bersih. Untuk itu pada setiap awal proses pembersihan, program serum akan selalu memeriksa kode partisi pada setiap hard disk yang terpasang, dan memulihkannya bila terinfeksi.

Setelah listing program ANTIHARE.PAS tersedia, panggilah program Turbo Pascal dan buka listing tersebut. Bila dalam menu Compile tersedia pilihan Destination, pastikan untuk ditujukan ke Disk, agar terbentuk file ANTIHARE.EXE. Lalu lakukan proses Compile, Run, Make atau Build, sehingga tercipta file ANTIHARE.EXE yang siap untuk dijalankan.

Atau dapat pula Anda kompilasi langsung lewat program TPC.EXE, satu paket dengan Turbo Pascal, yaitu dengan mengetikkan:

C:\>TPC ANTIKSM

bila tidak ada kesalahan maka akan tercipta file ANTIHARE.EXE.

Pemakaian Serum

Untuk menjalankan program ANTIHARE ketiklah di prompt DOS sebagai berikut:

C:\>ANTIHARE <[dir1] [dir2]…> [/S /A /C /G /N]

[dir1] [dir2]…, maksudnya adalah direktori yang dituju bisa lebih dari satu direktori. Contoh: C:\>ANTIHARE C:\DOS D:\WINDOWS A:\

/S, maksudnya apabila terdapat sub direktori maka program akan masuk ke seluruh sub direktori yang ada.

/A, artinya program tidak hanya memeriksa file-file yang berektensi EXE, COM, BIN, OVR atau OVL, namun seluruh file.

/C, artinya program serum melakukan pembersihan pada program yang terinfeksi. Bila tidak disertakan, maka program serum hanya akan melakukan pendeteksian.

/G, agar program berhenti sejenak untuk menunggu pemakai menukar disket. Hal ini diperlukan bila Anda ingin memeriksa disket lain pada komputer dengan drive tunggal.

/N, agar program tidak melakukan pencarian vektor DOS terdalam. Dalam kerjanya program serum akan berusaha memanggil langsung titik terdalam dari vektor DOS, yang tujuannya agar operasi pembersihan file dapat berlangsung lebih aman. Bila serum tidak bekerja dengan baik, gunakan parameter ini agar program bekerja secara normal. Beberapa driver mensyaratkan Anda

memanggil vektor DOS secara normal, karena driver tersebut memanipulasi fungsi-fungsi DOS secara internal. Contohnya program NETX.COM dari Novell Netware.

Ada baiknya sebelum menggunakan serum ini Anda cobakan dulu pada beberapa file untuk memastikan bahwa serum bekerja dengan baik. Juga perlu dipastikan bahwa memori dalam keadaan bebas virus (lain), agar proses berjalan sesuai yang diharapkan. Bagi pemakai Windows 95, bila program serum ini mengalami kegagalan dalam melakukan suatu proses, Anda dapat mengatasinya dengan shut down ke mode MS-DOS, dan lakukan pembersihan dari sana.

Dalam prosesnya program ini tidak mengharapkan input dari pemakai, kecuali lewat parameter. Jadi bila suatu operasi tulis file gagal, karena disket diprotek misalnya, proses terus berjalan dengan memberikan pesan kesalahan secara umum. Proses dapat diulang kembali bila kesalahan telah diperbaiki. Bila Anda ingin menghentikan proses di tengah jalan, lakukan dengan menekan Ctrl-C atau Ctrl-Break.

Penutup

Ada pepatah mengatakan, ‘Demi nila setitik rusak susu sebelanga’. Mungkin virus komputer dapat kita ibaratkan nila setitik tadi, sebab dari kehadirannya yang tak seberapa dapat merusakkan sistem komputer kita. Pemecahannya seringkali tidak semudah menginstall ulang seluruh program. Arti penting data turut menjadi pertimbangan. Tanpa pemusnahan secara tepat dan menyeluruh, jadilah nila setitik tadi sesuatu yang sangat menjengkelkan.

Akhirnya penulis berharap semoga program ini bermanfaat bagi pembaca sekalian. Komentar, saran, kritik, atau apapun silakan layangkan ke Antivirus Media untuk ditanggapi seperlunya.

Daftar Pustaka

  1. David Jurgens. HelpPC v2.10 (c)1991.
  2. Ralf Brown. The MSDOS Interrupt List.
  3. PT Gramedia. 8088 Assembler.
  4. AVP Virus Encyclopedia.

 

Demi Nila Setitik

Pada proses pembedahan virus ini, penulis mendapat beberapa ‘kejutan’ ringan. Pertama masalah bom waktu. Pada saat penelitian virus ini, penulis tentu saja tidak mengetahui efek apa yang akan dilakukan oleh virus ini. HUT kemerdekaan lewat 3 hari, mulailah penulis melakukan penelitian terhadap virus ini. Yah, cukup terkejut juga ketika mengetahui bahwa virus ini mempunyai ‘humor’ tidak lucu 2 hari lagi. Terpaksa tanggal sistem diamankan ‘demi kepentingan bersama’.

Tentang partisi hard disk ada kejutan lain. Kebetulan konfigurasi hard disk penulis menggunakan

LBA dengan 1022 silinder, 64 track, dan 63 sektor. Bayangkan bila silindernya 1023, terjadilah kondisi ‘tahu tapi tak tahu’. Tahu bahwa hard disk ditulis, tapi tidak tahu file apa yang bermasalah. Kondisi 4-T tadi tentu saja cukup riskan, mengingat komputer hanya akan bekerja dengan baik dalam kondisi ‘tahu sama tahu’.

Belum lagi kejutan bahwa virus mampu melakukan penulisan langsung ke hard disk. Selama ini penulis cukup percaya bahwa BIOS mampu mencegah penulisan illegal ke daerah partisi. Pada virus-virus partisi lama memang BIOS cukup berdaya untuk mengatasi hal tersebut. Dan kini, apakah fasilitas ‘Virus Warning’ tersebut masih ada ‘gunanya’?

Tentu saja penulis jadi makin penasaran dengan kejutan-kejutan lain dari virus ini. Trik-trik dan cara kerja virus penulis amati dengan seksama. Beberapa kelemahan dan keunggulan virus dianalisa dan dicatat sebagai bahan perbandingan dengan banyak virus yang lain. Hingga akhirnya terciptalah serum anti virus Hare ini. Minimal penulis mengetahui teknologi baru yang akan dikembangkan oleh pembuat virus.

Dan para pembuat virus mungkin akan berseru: ‘Tunggulah kejutan berikutnya’.

 

Listing Program


{$S-,R-,I+,G+,X+,A+,B-}
{$M 7505,0,0}
{***********************************************}
{ File:      ANTIHARE.PAS => ANTIHARE.EXE       }
{ Deskripsi: Anti Virus Hare.7786               }
{ Kompiler:  Turbo Pascal 6.0+, Borland, Inc    }
{ Utilitas:  Debug.Exe, Microsoft, Corp         }
{ Penulis:   M. Harjono                         }
{ Tanggal:   30 Agustus 1997                    }
{ Dedikasi:  * Pembaca Antivirus Media          }
{            * BL-TI-93                         }
{              (kapan skripsi diganti kliping?) }
{ (c)1997 Antivirus Media                       }
{***********************************************}

program Anti_Virus_Hare;
uses
  Dos;
type
  R_Exe = record
    MZ: Word;
    _Mod: Word;
    _Div: Word;
    Rel: Word;
    Hed: Word;
    _M1,_M2: Word;
    _SS,_SP: Word;
    CkSum: Word;
    _IP,_CS: Word;
  end;
  R_Com = record
    Kod: Byte;
    JMP: Word;
  end;
  R_PL = record
    Lo,Hi: Word;
  end;
  Com = ^R_Com;
  P_W = ^Word;
  R_Pch = record
    Lc: Word;
    Kb: Word;
    Kj: Word;
  end;
  R_Dat = record
    La: Word;
    Ld: Word;
    Id: array[1..8] of Byte;
  end;
const
  HareD: R_Dat =
    (La:$14;Ld:$16B;Id:($B8,$23,$FE,$CD,$21,$3D,$0D,$00));
  BnPch = 3;
  HareJ: array[1..BnPch] of R_Pch =
    ((Lc:$038E;Kb:$FC80;Kj:$45EB),
     (Lc:$17EF;Kb:$5350;Kj:$31EB),
     (Lc:$1B47;Kb:$FA81;Kj:$3FEB));
  HareMundur = $1E6A;
  Batal: Byte = 0;
  Par_Tidak: set of 0..15 = [];
  Pil: set of 0..7 = [];
  BnExt = 5;
  DaftExt: array[1..BnExt*3] of Char =
    'EXECOMBINOVROVL';
  DevBaca  = $02;
  DevTulis = $03;
var
  Kena,Proses,NSubDir: word;
  Buf: array[0..$1FF] of Byte;
  BnHd: Byte;
  Int13h: Pointer;

function CekIdVir(PjC: Word; var BufM): Shortint; assembler;
asm
  {-- cari awal virus --}
  les di,BufM
  lea si,HareD.Id
  mov cx,PjC
  cld
  lodsb
@@L1:
  repnz scasb
  jnz @@U1
  push si
  push di
  push cx
  mov cx,type HareD.Id-1
  repz cmpsb
  pop cx
  pop di
  pop si
  jnz @@L1
  xchg cx,ax
  mov cl,1
@@U1:
  xchg cx,ax
end;

function MCBAkhir(Pil: Byte): Word; assembler;
asm
  {-- init UMB_Konv --}
  mov dl,-1
  mov ax,5802h
  int 21h
  jc @@4
  xchg dx,ax
  mov ax,5803h
  xor bx,bx
  int 21h
  jnc @@4
  mov dl,-1
@@4:
  push dx
  xor si,si
  xor dx,dx
  cmp Pil,dl
  jz @@Konv
{-- mulai dari UMB --}
  int 12h
  mov cl,6
  shl ax,cl
  dec ax
  mov es,ax
  cmp word ptr es:[8],'CS'
  xchg dx,ax
  jnz @@3
  jmp @@1
{-- mulai dari MCB pertama --}
@@Konv:
  mov ah,52h
  int 21h
  mov dx,es:[bx-2]
{-- telusuri MCB --}
@@1:
  mov es,dx
  mov al,es:[si]
  cmp al,5Ah
  jz @@2
  cmp al,4Dh
  mov ax,si
  jnz @@3
  add dx,es:[si+3]
  inc dx
  jmp @@1
@@2:
  add dx,es:[si+3]
  inc dx
  mov es,dx
{-- cari Id virus --}
  mov ax,$4000    {16K byte akhir}
  push ax
  xor di,di
  push es
  push di
  call CekIdVir
  jnz @@3
  xchg cx,ax
  not ax
  add ax,$4000
  sub ax,HareD.La
  mov cl,4
  shr ax,cl
  add ax,dx
@@3:
  {-- kembalikan mem alloc stra --}
  xchg dx,ax
  pop ax
  cmp al,-1
  jz @@5
  cbw
  xchg bx,ax
  mov ax,5803h
  int 21h
@@5:
  xchg dx,ax
end;

procedure Kondisi(K: Shortint);
begin
  case K of
   -1: Writeln(' [terinfeksi, gagal dipulihkan]');
   -2: Writeln(' [terinfeksi]');
    0: Writeln(' [ok]');
    1: Writeln(' [terinfeksi, dipulihkan]');
  end;
end;

procedure WinKrit(M: Word); assembler;
asm
  mov ax,$1680
  add ax,M
  int 2Fh
end;

procedure PMem;
var
  Seg,I,J: Word;
  Kena: Shortint;
begin
  Kena := 0;
  for J := 0 to 1 do
  begin
    Seg := MCBAkhir(J);
    if (Seg<>0) then
      for I := 1 to BnPch do
        with HareJ[I] do
          if (MemW[Seg:Lc] = Kb) then
          begin
            WinKrit(1);
            MemW[Seg:Lc] := Kj;
            WinKrit(2);
            Kena := 1;
          end;
  end;
  Kondisi(Kena);
end;

function RqDev(Op,Dr:Byte; Hd,Tr,Sc:Word): Shortint; assembler;
asm
  lea bx,Buf
  push ds
  pop es
  mov dx,Hd
  xchg dh,dl
  mov dl,Dr
  mov cx,Tr
  xchg ch,cl
  ror cl,1
  ror cl,1
  mov di,Sc
  inc di
  and di,$3F
  or cx,di
  mov di,3
  cmp dl,$80
  jb @@3
  dec di
  dec di
@@3:
  push dx
  xor ax,ax
  pushf
  call Int13h
  pop dx
  mov ah,Op
  mov al,01
  pushf
  call Int13h
  jnc @@U
  dec di
  jnz @@3
  stc
@@U:
  mov al,0
  sbb al,0
end;

procedure PBoot(_Drv: Byte);
var
  _Hd,_Tr,_Sc: Word;
  Kena: Shortint;
begin
  Kena := 0;
  if (RqDev(DevBaca,_Drv,0,0,0) = 0) and
    (P_W(@Buf[$102])^-P_W(@Buf[$100])^ = $CCFF) then
  begin
    if (_Drv<$80) then
    begin
      _Hd := $01;
      _Sc := $00;
      _Tr := $51;
      if (Buf[$15]=$FD) then
        _Tr := $29;
    end
    else
    asm
      mov ah,$08
      mov dl,_Drv
      int 13h
      inc ch
      dec dh
      mov ax,cx
      and cl,$3F
      sub cl,$11
      mov ch,0
      mov _Sc,cx
      mov cl,6
      shr al,cl
      xchg ah,al
      mov _Tr,ax
      xchg dh,dl
      mov dh,0
      mov _Hd,dx
    end;
    if (RqDev(DevBaca,_Drv,_Hd,_Tr,_Sc)=0) and
      (CekIdVir($100,Buf)=1) then
    begin
      {-- ambil sektor asli dan kembalikan --}
      Kena := -1;
      if not(3 in Pil) then
        Kena := -2
      else
        if (3 in Pil) and (RqDev(DevBaca,_Drv,_Hd,_Tr,_Sc+$10) = 0) and
           (RqDev(DevTulis,_Drv,0,0,0) = 0) then
          Kena := 1;
    end;
  end;
  if (_Drv<$80) then
  begin
    if (Kena<>0) then
    begin
      Write('   Boot Sektor');
      Kondisi(Kena);
    end;
  end
  else
    Kondisi(Kena);
end;

function CekHare(PjC: Word; var Buf): Word; assembler;
asm
  les di,Buf
  std
  mov al,2Eh
  mov cx,PjC
  xor dx,dx
  jcxz @@1
  repnz scasb
  jnz @@1
  mov ax,es:[di+2]
  cmp al,30h    {xor}
  jz @@2
  cmp al,00h    {add}
  jz @@2
  cmp al,28h    {sub}
  jnz @@1
@@2:
  xchg ah,al
  test al,$C0   {cek mod=00}
  jnz @@1
  mov cl,3
  shr al,cl
  add al,$B0    {kode reg}
  mov cl,$32
  repnz scasb
  jnz @@1
  mov al,es:[di+2]
  xchg dx,ax
@@1:
  cld
  xchg dx,ax
end;

function Dekrip(Dek: Word; var BufH): Longint; assembler;
asm
  lea si,Buf
  mov cx,type Buf
  mov ax,Dek
  xchg ah,al
  add al,4
  mov word ptr cs:[@@2],ax
  cld
  jmp @@1
@@1:
  lodsb
@@2:
  xor al,$00    {-tetap-}
  not al
  mov ds:[si-1],al
  loop @@1
  {-- cari awal virus --}
  mov ax,type Buf
  push ax
  lea di,Buf
  push ds
  push di
  call CekIdVir
  jnz @@U
  not cx
  add cx,type Buf
  sub cx,HareD.La
  {-- pindahkan data prog ke bufh --}
  add di,HareD.Ld
  sub di,HareD.La
  lea si,[di-1]
  les di,BufH
  cmp byte ptr ds:[si+7*2],01  {EXE?}
  jz @@3
  lodsw
  stosw
  lodsb
  stosb
  mov ax,type R_Com
  jmp @@U
@@3:
  lodsw
  mov es:[di.R_Exe._IP],ax
  lodsw
  mov es:[di.R_Exe._CS],ax
  lodsw
  mov es:[di.R_Exe._SP],ax
  lodsw
  mov es:[di.R_Exe._SS],ax
  lodsw
  mov es:[di.R_Exe._Mod],ax
  lodsw
  mov es:[di.R_Exe._Div],ax
  mov ax,type R_Exe
@@U:
  mov dx,cx
end;

{$I-}
function PulihFile(NmF: string): shortint;
var
  F1: file;
  BufH: R_Exe;
  PjBc,Attr,Dek: Word;
  LokV,Wkt,LokD: Longint;

procedure PrsFile;
begin
  PulihFile := 0;
  FileMode := 0;
  Reset(F1,1);
  if (InOutRes <> 0) then
    Exit;
  BlockRead(F1,BufH,SizeOf(BufH),PjBc);
  if (PjBc<>SizeOf(BufH)) then
    Exit;
  if (BufH.MZ = $4D5A) or (BufH.MZ = $5A4D) then
  begin
    with BufH do
      LokV := Longint(hed+_cs)*$10 + _ip;
  end
  else
  begin
    with Com(@BufH)^ do
      if (Kod=$E9) then
        LokV := JMP + 3
      else
        Exit;
  end;
  Seek(F1,LokV);
  BlockRead(F1,Buf,$40,PjBc);
  Dek := CekHare(PjBc,Buf[PjBc-1]);
  if (Dek=0) then
    Exit;
  Seek(F1,LokV-HareMundur);
  BlockRead(F1,Buf,SizeOf(Buf),PjBc);
  LokD := Dekrip(Dek,BufH);
  if R_PL(LokD).Lo=0 then
    Exit;
  {-- positif bervirus --}
  PulihFile := -2;
  if not (3 in Pil) then
    Exit;
  PulihFile := -1;
  Close(F1);
  GetFAttr(F1,Attr);
  if (Attr and ReadOnly = ReadOnly) then
    SetFAttr(F1,Attr and not(ReadOnly));
  FileMode := 2;
  Reset(F1,1);
  if (InOutRes<>0) then
    Exit;
  GetFTime(F1,Wkt);
  Seek(F1,0);
  BlockWrite(F1,BufH,R_PL(LokD).Lo,PjBc);
  if (PjBc=0) or (InOutRes<>0) then
    Exit;
  Seek(F1,(LokV-HareMundur)-R_PL(LokD).Hi);
  Truncate(F1);
  if (InOutRes<>0) then
    Exit;
  Dec(Wkt);
  SetFTime(F1,Wkt);
  if (Attr and ReadOnly = ReadOnly) then
    SetFAttr(F1,Attr);
  PulihFile := 1;
end;

begin
  Assign(F1,NmF);
  PrsFile;
  Close(F1);
  InOutRes := 0;
end;
{$I+}

{-- cari vektor 21h asli --}
function Vektor21h: Pointer; assembler;
asm
  push ds
  mov ax,PrefixSeg
  mov ds,ax
  mov si,$0005
  xor bx,bx
  xor dx,dx
  cld
@@3:
  lodsb
  cmp al,$9A
  jz @@1
  cmp al,$EA
  jnz @@2
@@1:
  lds si,ds:[si]
  jmp @@3
@@2:
  add si,4
  lodsw
  cmp ax,$FF2E
  jnz @@4
  lodsb
  cmp al,$2E
  jnz @@4
  lodsw
  xchg si,ax
  les di,ds:[si]
  mov cx,$0100
@@5:
  mov al,$FA
  repnz scasb
  jnz @@4
  cmp word ptr es:[di],$FC80
  jnz @@5
  mov dx,es
  lea bx,[di-1]
@@4:
  pop ds
  xchg bx,ax
end;

{-- konversi huruf kecil mjd besar --}
procedure HBesar(var S); assembler;
asm
  les di,S
  xor cx,cx
  mov cl,es:[di]
  jcxz @@L3
  cld
  inc di
@@L1:
  mov al,es:[di]
  cmp al,'a'
  jb @@L2
  cmp al,'z'
  ja @@L2
  sub al,$20
@@L2:
  stosb
  loop @@L1
@@L3:
end;

{-- cek ekstensi file terdaftar --}
function CekNmf(var Buf): Boolean; assembler;
asm
  mov dl,0
  les di,Buf
  mov al,'.'
  xor cx,cx
  mov cl,es:[di]
  inc di
  cld
  repnz scasb
  jnz @@1
  cmp cx,3
  jnz @@1
  lea si,DaftExt
  mov bx,BnExt
@@2:
  push si
  push di
  push cx
  repz cmpsb
  pop cx
  pop di
  pop si
  jz @@3
  add si,cx
  dec bx
  jnz @@2
  jmp @@1
@@3:
  mov dl,1
@@1:
  xchg dx,ax
end;

{$S+}
procedure PDir(S: PathStr);
var
  SR: SearchRec;
  Kond: Shortint;
begin
  Inc(NSubDir);
  FindFirst(S+'*.*',AnyFile,SR);
  while (DosError=0) and (Batal=0) do
  begin
    if (SR.Name[1] <> '.') and (SR.Attr and VolumeID <> VolumeID) then
    begin
      if (SR.Attr and Directory = Directory) then
      begin
        if (1 in Pil) then
        begin
          WriteLn(#13'Periksa ',S+SR.Name,' ':10);
          PDir(S+SR.Name+'\');
        end;
      end
      else
      begin
        if (2 in Pil) or CekNmf(Sr.Name) then
        begin
          Inc(Proses);
          Write(#13,SR.Name:14);
          Kond := PulihFile(S+SR.Name);
          if (Kond<>0) then
          begin
            Kondisi(Kond);
            Inc(Kena);
            while (Kond=1) and (PulihFile(S+SR.Name)=1) do;
          end;
        end;
      end;
    end;
    FindNext(SR);
  end;
end;
{$S-}

function DriveDisket(Drv: Byte): Boolean; assembler;
asm
  mov ax,$4408
  mov bl,Drv
  int 21h
  mov dl,0
  jc @@1
  or al,al
  jnz @@1
  inc dx
@@1:
  xchg dx,ax
end;

function DriveAktif: Byte; assembler;
asm
  mov ah,$19
  int 21h
end;

procedure TungguEnter; assembler;
asm
@@1:
  mov ax,$0C08
  int 21h
  cmp al,13
  jnz @@1
end;

procedure IntNull; assembler;
asm
  mov al,03
  iret
end;

procedure CekBreak; assembler;
asm
  push ax
  push ds
  mov ax,Seg @Data
  mov ds,ax
  inc Batal
  pop ds
  pop ax
  iret
end;

const
  TotPar = 5;
  DafPar: array[1..TotPar] of Char = 'SACGN';
var
  Par: string[128];
  I,P,J: Byte;
  Drv: Byte;
  Int21h: Pointer;
begin
  WriteLn(#13#254' Anti Virus Hare  v1.01.001'#10+
          #13#254' Dibuat oleh M. Harjono'#10+
          #13#254' (c)1997 Antivirus Media'#10);
  P := ParamCount;
  if (P = 0) then
  begin
    Writeln('Sintak: ANTIHARE <[dir1] [dir2]...> [/s /a /c /g /n]'#10#13+
            '  /s = masuk sub direktori'#10#13+
            '  /a = proses semua file'#10#13+
            '  /c = deteksi dan bersihkan'#10#13+
            '  /g = tunggu ganti disket'#10#13+
            '  /n = vektor 21h normal');
    Exit;
  end;
  {-- olah parameter --}
  for I := 1 to P do
  begin
    Par := ParamStr(I);
    HBesar(Par);
    if (Length(Par)=2) and (Par[1]='/') then
    begin
      for J := 1 to TotPar do
        if (Par[2]=DafPar[J]) then
          Pil := Pil + [J];
      Par_Tidak := Par_Tidak + [I];
    end;
  end;
  {-- init program --}
  GetIntVec($13,Int13h);
  Int21h := Vektor21h;
  if (Int21h<>nil) and not(5 in Pil) then
    SetIntVec($21,Int21h);
  {---}
  SetIntVec($21,SaveInt21);
  {---}
  SetIntVec($23,@CekBreak);
  SetIntVec($24,@IntNull);
  Kena := 0;
  Proses := 0;
  NSubDir := 0;
  {-- periksa memori --}
  Write('Cek Memori....');
  PMem;
  {-- periksa partisi --}
  BnHd := Mem[$40:$75];
  if (BnHD<>0) then
  begin
    for I := 1 to BnHd do
    begin
      Write('Cek Partisi..',I-1);
      PBoot($7F+I);
    end;
  end;
  {-- periksa boot/file --}
  for I := 1 to P do
  begin
    if not (I in Par_Tidak) then
    begin
      Par := ParamStr(I);
      HBesar(Par);
      if (Par[length(Par)] <> ':') and (Par[length(Par)] <> '\') then
      begin
        Inc(Par[0]);
        Par[Length(Par)] := '\';
      end;
      Writeln(#13'Periksa ',Par,' ':10);
      Drv := DriveAktif;
      if (Par[2] = ':') and (Par[1] in ['A'..'Z']) then
        Drv := Ord(Par[1])-Ord('A');
      if (Drv<=1) and (DriveDisket(Drv+1)) then
      begin
        if (4 in Pil) then
        begin
          Write(' <Tekan Enter> '#13);
          TungguEnter;
        end;
        PBoot(Drv);
      end;
      PDir(Par);
    end;
  end;
  Writeln(#13'Hasil:        '#13#10+
          '  Direktori = ',NSubDir:6,#13#10+
          '  File      = ',Proses:6,#13#10+
          '  Terkena   = ',Kena:6,#13#10);
end.

Tinggalkan Balasan

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

Logo WordPress.com

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

Gambar Twitter

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

Foto Facebook

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

Foto Google+

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

Connecting to %s