求 用汇编语言写一个简单的程序 急~!!!
data segment VDef db 'viruscode';存放病毒特征码 LenVDef = ($-VDef);病毒特征码长度 RepChar equ ;定义要替换的安全字节,这里90H是NOP指令的机器码,可以换成其他字符 FBuff db 1024 dup(?);文件缓冲区 LenBuff = ($-FBuff);文件缓冲区长度 FileName db 128;用户输入的要查毒的文件名字(可含路径) db ? db 128 dup(?) FileTmp db 'ftmp。 tmp',0 hFSrc dw ? h...全部
data segment VDef db 'viruscode';存放病毒特征码 LenVDef = ($-VDef);病毒特征码长度 RepChar equ ;定义要替换的安全字节,这里90H是NOP指令的机器码,可以换成其他字符 FBuff db 1024 dup(?);文件缓冲区 LenBuff = ($-FBuff);文件缓冲区长度 FileName db 128;用户输入的要查毒的文件名字(可含路径) db ? db 128 dup(?) 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。
收起