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:
- 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.
- 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.
- 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
- David Jurgens. HelpPC v2.10 (c)1991.
- Ralf Brown. The MSDOS Interrupt List.
- PT Gramedia. 8088 Assembler.
- 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.