⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 killcih.asm

📁 CIH病毒检测消除程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                  CL7: CMP WORD PTR[VIRSUF+DI+4BH],0FBCCH
                   JZ CL8  ;Sure CIH virus
                   JMP NEXTFILE
                  CL8: MOV DX,OFFSET FILEMSG
                   MOV AH,09H
                   INT 21H  ;显示有病毒
                   MOV AX,4301H
                   MOV CX,0020H
                   MOV DX,OFFSET DAT
                   ADD DX,1EH
                   INT 21H  ;置文件属性为归档
                  ;
                   ;Save true Entry RVA
                   MOV AX,WORD PTR[VIRSUF+DI+5EH]
                   MOV WORD PTR[T_ENTRY],AX
                   MOV AX,WORD PTR[VIRSUF+DI+60H]
                   MOV WORD PTR[T_ENTRY+2H],AX
                  ;
                  MOV DX,WORD PTR[VIRPOINT]
                   MOV CX,WORD PTR[VIRPOINT+2H]  ;GET CIH first block point
                   MOV AX,4200H
                   INT 21H  ;文件指针移到FILE Entry address-病毒块指针区大小
                  ;
                   MOV CX,WORD PTR[VIRSUF+DI-04H] ;取CIH病毒首块长度
                   ADD CX,DI    ;加上CIH病毒链表指针块区大小
                   MOV DX,OFFSET CL_ZERO
                   MOV AH,40H
                   INT 21H ;病毒首块及链表指针区清零
                  ;
                   ;;;;;;;;;;;;;;;;;;;;;;
                   ;Clear other block viurs
                   ; omitted
                   ;;;;;;;;;;;;;;;;;;;;;;
                  ;
                   ;Restore True Entry RVA(Address of Entry Point)
                   MOV AX,4200H
                   MOV CX,WORD PTR[PE_HEAD+2]
                   MOV DX,WORD PTR[PE_HEAD]
                   ADD DX,28H
                   ADC CX,0 
                   INT 21H  ;文件指针移到文件头的Entry Point
                   MOV DX,OFFSET FILESUF ;文件缓冲区首址->DX
                  ; MOV CX,4H 
                  ; MOV AH,3FH
                  ; INT 21H  ;读入Entry Point
                  ; JNB CL11
                  ; JMP NEXTFILE 
                  CL11: MOV CX,WORD PTR[T_ENTRY]
                   MOV WORD PTR[FILESUF],CX
                   MOV CX,WORD PTR[T_ENTRY+2]
                   MOV WORD PTR[FILESUF+2],CX
                  MOV CX,2H
                   MOV AH,40H
                   INT 21H  ;将正常的Entry 参数写回
                   JB NEXTFILE
                   COPYHANDLE
                   MOV SI,[OFFSET DAT+15H]
                   MOV CL,[SI]
                   MOV AX,4301H
                   MOV DX,OFFSET DAT
                   ADD DX,1EH
                   INT 21H  ;恢复文件原属性
                   JB NEXTFILE
                   MOV DX,OFFSET DAT
                   MOV SI,WORD PTR[OFFSET DAT+16H]
                   MOV DI,WORD PTR[OFFSET DAT+18H]
                   MOV CX,[SI]
                   MOV DX,[DI]
                   MOV AX,5701H
                   INT 21H  ;恢复文件原建立日期
                   MOV DX,OFFSET CLEAMSG
                   MOV AH,09H
                   INT 21H
                   INC BYTE PTR[VIREXE]
                  NEXTfile:MOV AH,3EH
                   INT 21H
                   CLD
                   MOV DI,OFFSET DAT
                   ADD DI,1EH
                   MOV CX,0EH
                   MOV AL,24H
                   REPZ STOSB
                   MOV DI,OFFSET FILESUF
                   MOV CX,600H
                   MOV AL,00
                   REPZ STOSB  ;清文件缓冲区
                   MOV CX,0FFFFH
                  BZ6: LOOP BZ6
                   MOV CX,0FFFFH
                  BZ7: LOOP BZ7
                   MOV CX,0FFFFH
                  BZ8: LOOP BZ8
                   MOV CX,0FFFFH
                  BZ9: LOOP BZ9
                   MOV DL,0DH
                   MOV AH,02H
                   INT 21H  ;只回车
                   MOV DX,OFFSET HZSM
                   MOV AH,09H
                   INT 21H
                   MOV DX,OFFSET DISKCHA
                   MOV AH,09H
                   INT 21H
                   MOV DX,OFFSET BLANK
                   MOV AH,09H
                   INT 21H
                   MOV DL,0DH
                   MOV AH,02H
                   INT 21H  ;回车
                   MOV AH,4FH
                   INT 21H
                   JC EXIT
                   JMP LOOK
                  EXIT: RET
                  CLEA_VIRUS ENDP
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  ;
                  CLE_SDIR PROC NEAR ;搜寻各子目EXE文件并检测是否存在病毒以及消除
                  CL_SUBD:MOV DX,OFFSET DIRFILE
                   MOV CX,0010H
                   MOV AH,4EH
                   INT 21H  ;搜寻第一匹配文件
                   JNC LOOKS
                   JMP EXITS ;没找到,->EXITS
                  LOOKS: MOV SI,OFFSET DAT
                   ADD SI,15H
                   CMP BYTE PTR[SI],10H
                   JZ NEXT1
                   JMP NEXTSUB
                  NEXT1: MOV BX,OFFSET DAT
                   ADD BX,1EH ;BX:匹配文件名首址
                   CMP BYTE PTR[BX],2EH ;是否是“.”或“..”子目录
                   JNZ SUB1
                   JMP NEXTSUB
                  SUB1: INC [DIRNUM] ;子目录数量加1
                   CLD
                   MOV SI,OFFSET DAT
                   MOV DI,OFFSET DIRSUFF
                   ADD DI,WORD PTR[DIRSUFP]
                   MOV CX,0015H
                   REPZ MOVSB ;保存当前目录参数
                   ADD WORD PTR[DIRSUFP],0015H ;目录参数指针+15H
                   MOV DI,OFFSET CURRDIR+1
                   CMP BYTE PTR[DI],00H
                   JZ LP2
                  LP1: INC DI
                   CMP BYTE PTR[DI],00H
                   JNZ LP1  ;找当前子目录名路径尾
                   MOV BYTE PTR[DI],5CH
                   INC DI
                  LP2: MOV SI,BX
                   MOV CX,0DH
                   REPZ MOVSB 
                   MOV DX,OFFSET CURRDIR
                   MOV AH,3BH
                   INT 21H  ;进入下一级子目录
                   CLD
                   MOV DI,OFFSET CURRDIR+1
                   MOV CX,003FH
                   MOV AL,24H
                   REPZ STOSB
                   MOV AH,47H
                   MOV DL,BYTE PTR[DISKSGN]
                   MOV SI,OFFSET CURRDIR+1
                   INT 21H  ;取当前子目录
                   MOV BYTE PTR[FILEBZ],0FFH ;置EXE文件标志
                   MOV DX,OFFSET EXEFILE
                   CALL CLEA_VIRUS  ;chesk and clear CIH virus
                   JMP CL_SUBD ;查找当前子目录下一级目录及EXE文件
                  EXITS: MOV BX,OFFSET CURRDIR+1
                   CMP BYTE PTR[BX],00 ;判当前目录为根目录否
                   JNZ SUB2
                   JMP OVERS ;当前目录为根目录->OVERS
                  SUB2: MOV AH,3BH
                   MOV DX,OFFSET UPDIR
                   INT 21H  ;返回上一子目录
                   MOV AH,47H
                   MOV DL,BYTE PTR[DISKSGN]
                   MOV SI,OFFSET CURRDIR+1
                   INT 21H  ;取当前子目录
                   STD
                   MOV SI,OFFSET DIRSUFF-1H
                   ADD SI,WORD PTR[DIRSUFP]
                   MOV DI,OFFSET DAT+14H
                   MOV CX,0015H
                   REPZ MOVSB
                   SUB WORD PTR[DIRSUFP],0015H ;恢复当前子目录参数及指针
                  NEXTSUB:MOV AH,4FH
                   INT 21H
                   JC EXITS
                   JMP LOOKS
                  OVERS: RET
                  CLE_SDIR ENDP
                  ;
                  ;
                  BTOD PROC NEAR ;将[DI]中2进制数转换成十进制数显示
                   MOV WORD PTR[DECSUF+10H],OFFSET DECSUF
                   MOV DX,0000H
                   MOV AX,[DI]
                   ;DX=数值的高位;AX=数值的低位
                   PUSH AX
                   POP SI
                   PUSH DX
                   POP DI
                   PUSH BP
                   PUSH BX
                   XOR AX,AX
                   MOV BX,AX
                   MOV BP,AX
                   MOV CX,0020H
                  BTOD1: SHL SI,1
                   RCL DI,1
                   XCHG BP,AX
                   ADC AL,AL
                   DAA
                   XCHG AH,AL
                   ADC AL,AL
                   DAA
                   XCHG AH,AL
                   XCHG BP,AX
                   XCHG BX,AX
                   ADC AL,AL
                   DAA
                   XCHG AH,AL
                   ADC AL,AL
                   DAA
                   XCHG AH,AL
                   XCHG BX,AX
                   ADC AL,00
                   LOOP BTOD1
                   MOV CX,1810H
                   XCHG DX,AX
                   CALL BTOD2
                   XCHG BX,AX
                   CALL BTOD3
                   MOV AX,BP
                   CALL BTOD3
                   MOV BYTE PTR[DECSUF+0BH],24H
                   MOV AH,09H
                   MOV DX,OFFSET DECSUF
                   INT 21H
                   JMP BTOD6
                  BTOD3 PROC NEAR
                   PUSH AX
                   MOV DL,AH
                   CALL BTOD7
                   POP DX
                  BTOD7  PROC NEAR
                   MOV DH,DL
                   SHR DL,1
                   SHR DL,1
                   SHR DL,1
                   SHR DL,1
                   CALL BTOD2
                   MOV DL,DH
                  BTOD2 PROC NEAR
                   AND DL,0FH
                   JZ BTOD8
                   MOV CL,00
                  BTOD8: DEC CH
                   AND CL,CH
                   OR DL,30H
                   SUB DL,CL
                   PUSH DI
                   MOV DI,WORD PTR[DECSUF+10H]
                   MOV [DI],DL
                   INC DI
                   MOV WORD PTR[DECSUF+10H],DI
                   POP DI
                   RET
                  BTOD2 ENDP
                  BTOD7 ENDP
                  BTOD3 ENDP
                  BTOD6: POP BX
                   POP BP
                   RET
                  BTOD ENDP
                  ;
                  ;
                  KILLCIH ENDP
                  ;
                  CODE ENDS
                  STACK  SEGMENT PARA STACK 'STACK'
                   DB 256 DUP(?)
                  STACK ENDS
                   END KILLCIH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -