求 用汇编语言写一个简单的程序 急~!!!
发布网友
发布时间:2022-04-21 21:20
我来回答
共1个回答
热心网友
时间:2023-11-05 01:10
data segment
VDef db 'viruscode';存放病毒特征码
LenVDef = ($-VDef);病毒特征码长度
RepChar equ <90h>;定义要替换的安全字节,这里90H是NOP指令的机器码,可以换成其他字符
FBuff db 1024 p(?);文件缓冲区
LenBuff = ($-FBuff);文件缓冲区长度
FileName db 128;用户输入的要查毒的文件名字(可含路径)
db ?
db 128 p(?)
FileTmp db 'ftmp.tmp',0
hFSrc dw ?
hFTmp dw ?
dwTmp dw ?;定义一个临时变量
msg0 db 'Input FileName:$'
msg1 db 'Open File Error!$'
msg2 db 'Found Virus and Cleaned!$'
msg3 db 'No virus found!$'
menu db '1--Input FileName 2--Scan 3--Exit:$'
data ends
CRLF macro
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
endm
ShowMsg macro x
mov ah,09h
lea dx,x
int 21h
endm
code segment
assume cs:code,ds:data,es:data
FindInStr proc far
;入口参数,形参
;[bp+12]=string2的长度,字
;[bp+10]=string1的长度,字
;[bp+8]=string2的开始地址
;[bp+6]=string1的开始地址
;以下为局部变量
;[bp-2]=string1位置变量,字
;[bp-4]=最大查找次数,字
;出口:AX=如果STR2在STR1中,则为第一次匹配时的位置(在第一个字符为0000H),如果没找到,则为0FFFFH
push bp
mov bp,sp
add sp,-4
mov ax,[bp+10]
cmp ax,[bp+12]
jae @F;判断两个字符串的长度
mov ax,0FFFFH
jmp RetHere
@@:
;局部变量初始化
mov si,[bp+8]
mov di,[bp+6]
mov [bp-2],di
mov ax,[bp+10]
sub ax,[bp+12]
inc ax
mov [bp-4],ax
cld
mov cx,[bp-4]
LP_CMP:
push cx
mov si,[bp+8]
mov di,[bp-2]
mov cx,[bp+12]
repe cmpsb
jne @F
mov ax,[bp-2]
sub ax,[bp+6]
jmp RetHere
@@:
inc word ptr [bp-2]
pop cx
loop LP_CMP
mov ax,0FFFFH
RetHere:
mov sp,bp
pop bp
ret 8
FindInStr endp
ScanVirus proc far
;入口参数:hFSrc存放要扫描的文件句柄
;出口参数:AX=0代表无病毒,AX=1代表有病毒
;局部变量
;[bp-2]=0代表无病毒,=1代表有病毒,字
push bp
mov bp,sp
add sp,-2
mov word ptr [bp-2],0;先将标志初始化为0,无毒
mov ah,3ch
xor cx,cx
lea dx,FileTmp
int 21h;创建临时文件
mov hFTmp,ax
L_ReadFile:
mov ah,3fh
mov bx,hFSrc
mov cx,LenBuff
lea dx,FBuff
int 21h;顺序读取源文件的LenBuff个字节,存到缓冲区
or ax,ax;测试是否已经到达文件尾
jz L_EOF
mov dwTmp,ax;保存实际读取的字节数
@@:
mov ax,LenVDef
push ax
mov ax,dwTmp
push ax
lea ax,VDef
push ax
lea ax,FBuff
push ax
call FindInStr
cmp ax,0FFFFH
jz @F
mov bx,ax
mov word ptr [bp-2],1;有毒
mov al,RepChar
mov cx,LenVDef
cld
lea di,FBuff
add di,bx
rep stosb;杀毒
jmp @B
@@:
;存储无毒的FBuff
mov ah,40h
mov bx,hFTmp
mov cx,dwTmp
lea dx,FBuff
int 21h
jmp L_ReadFile
L_EOF:
mov ah,3eh
mov bx,hFTmp
int 21h;关闭临时文件
mov ax,[bp-2]
mov sp,bp
pop bp
ret
ScanVirus endp
start:
mov ax,data
mov ds,ax
mov es,ax
L_Menu:
CRLF
ShowMsg menu;打印功能菜单
mov ah,01h
int 21h;用户输入选择
cmp al,'1'
jb L_Menu
cmp al,'3'
ja L_Menu
je Done;用户选择退出
cmp al,'1'
jne L_scan
;用户选择输入要查毒的文件
@@:
CRLF
ShowMsg msg0;提示用户输入文件名
mov ah,0ah
lea dx,FileName
int 21h
mov bl,FileName+1
or bl,bl;测试用户是否直接回车,忘记输入文件名
jz @B
xor bh,bh
mov byte ptr FileName[bx+2],0;变成文件名ASCII-Z串
jmp L_Menu
L_scan:
CRLF
mov ah,3dh
mov al,0
lea dx,FileName+2
int 21h;打开源文件
jc L_OpenErr;如果打开文件出错
mov hFSrc,ax
call ScanVirus
or ax,ax
jz L_NoVirus
ShowMsg msg2
mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件
mov ah,3ch
xor cx,cx
lea dx,FileName+2
int 21h;删除有毒源文件,并创建新文件
mov hFSrc,ax
mov ah,3dh
mov al,0
lea dx,FileTmp
int 21h;打开无毒的临时文件
mov hFTmp,ax
;复制文件
@@:
mov ah,3fh
mov bx,hFTmp
mov cx,LenBuff
lea dx,FBuff
int 21h
mov dwTmp,ax
or ax,ax
jz @F
mov ah,40h
mov bx,hFSrc
mov cx,dwTmp
lea dx,FBuff
int 21h
jmp @B
@@:
mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件
mov ah,3eh
mov bx,hFTmp
int 21h;关闭临时文件
mov ah,41h
lea dx,FileTmp
int 21h;删除临时文件
jmp L_Menu
L_NoVirus:
;如果没有病毒
ShowMsg msg3
mov ah,3eh
mov bx,hFSrc
int 21h;关闭源文件
mov ah,41h
lea dx,FileTmp
int 21h;删除临时文件
jmp L_Menu
L_OpenErr:
ShowMsg msg1;提示打开文件错误
jmp L_Menu
Done:
mov ax,4c00h
int 21h
code ends
end start