主 页  下载中心 文章中心 在线杀毒 软件论坛
国内杀毒软件     瑞星杀毒 金山毒霸 江民杀毒 光华反病毒 更多... 木马专杀   木马杀客 木马克星 木马清道夫 AVG(原Ewido)Anti-Spyware 更多...
国外杀毒软件     卡巴斯基   诺顿   趋势 安博士 熊猫卫士  小红伞 驱逐舰 麦咖啡McAfee   NOD32   F-Secure   Dr.Web   Avast   更多...
升级补丁   瑞星升级 金山毒霸升级 江民升级 光华升级 卡巴斯基升级 诺顿升级 趋势升级 安博士升级 NOD32升级 Dr.Web升级 Avast升级
流氓软件清理     360安全卫士 瑞星卡卡   金山毒霸系统清理专家 Wopti流氓软件清除大师   恶意软件清理助手   超级兔子网络卫士 更多...
防火墙     天网 费尔 冰盾 更多... 病毒专题     熊猫烧香病毒专题 电眼间谍病毒专题 AV终结者病毒专题 灰鸽子清理     更多...
系统漏洞补丁     windowXP系统漏洞补丁 window2000系统漏洞补丁 window2003系统漏洞补丁 windowVISTA系统漏洞补丁 更多...
 您当前的位置:爱客者 -> 文章中心 -> 安全技术 -> 杀毒技术 -> 文章内容
怎么写dos病毒
来源:网络 时间:2006-3-4

自磁芯大战以来,病毒从dos时代的病毒发展到windos系统的病毒,从变形、加密到智能化现在的病毒是让人防不胜防,现在网络上病毒大肆泛滥,给人们带来的很大的危害,本人在此仅做抛砖引玉,介绍病毒的原理,希望大家共同研究交流。(本文参考了网络上的部分文章,并引用了部分内容。)
要学dos下的病毒,首先你必须要学会或掌握汇编语言。dos下病毒一般分为引导型病毒、文件型病毒、混合型病毒等。大部分病毒是感染com和exe文件,因此你必须了解com文件和exe文件结构。
一 .com文件结构及原理
.com 文件比较简单,.com文件包含程序的一个绝对映象―――就是说,为了运行程序准确的处理器指令和内存中的数据,ms-dos通过直接把该映象从文件拷贝到内存而加载.com程序,它不作任何改变。为加载一个.com程序,ms-dos首先试图分配内存,因为.com程序必须位于一个64k的段中,所以.com文件的大小不能超过65,024(64k减去用于psp的256字节和用于一个起始堆栈的至少256字节)。如果ms-dos不能为程序、一个psp、一个起始堆栈分配足够内存,qq:9750406则分配尝试失败。否则,ms-dos分配尽可能多的内存(直至所有保留内存),即使.com程序本身不能大于64k。在试图运行另一个程序或分配另外的内存之前,大部分.com程序释放任何不需要的内存。
分配内存后,ms-dos在该内存的头256字节建立一个psp,如果psp中的第一个fcb含有一个有效驱动器标识符,则置al为00h,否则为0ffh。ms-dos还置ah为00h或0ffh,这依赖于第二个fcb是否含有一个有效驱动器标识符。建造psp后,ms-dos在psp后立即开始(偏移100h)加载.com文件,它置ss,ds和es为psp的段地址,接着创建一个堆栈.为创建一个堆栈,ms-dos置sp为0000h,若已分配了至少64k内存;否则,它置寄存器为比所分配的字节总数大2的值.最后,它把0000h推进栈(这是为了保证与在早期ms-dos版本上设计的程序的兼容性)。ms-dos通过把控制传递偏移100h处的指令而启动程序.程序设计者必须保证.com文件的第一条指令是程序的入口点。注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h.汇编语言程序设计者可通过置程序的初值为100h而保证这
一点(例如通过在原程序的开始使用语句org 100h).
二 exe文件结构
 exe 文件比较复杂,每个exe文件都有一个文件头,结构如下:
       exe文件头信息    
    ―――――――――――――――――――
     ├ 偏移量 ┤   意义         ┤
     ├00h-01h ┤mz‘exe文件标记     ┤
     ├2h-03h ┤文件长度除512的余数  ┤
     ├04h-05h ┤...............商  ┤
     ├06h-07h ┤重定位项的个数      ┤
     ├08h-09h ┤文件头除16的商     ┤
     ├0ah-0bh ┤程序运行所需最小段数 ┤
     ├0ch-0dh ┤..............大.... ┤
     ├oeh-0fh ┤堆栈段的段值 (ss)   ┤
     ├10h-11h ┤........sp      ┤
     ├12h-13h ┤文件校验和       ┤
     ├14h-15h ┤ip           ┤
     ├16h-17h ┤cs           ┤
     ├18h-19h ┤............  ┤
     ├1ah-1bh ┤............     ┤
     ├1ch   ┤............      ┤ 
 ―――――――――――――――――――――――――
.exe文件包含一个文件头和一个可重定位程序映象。文件头包含ms-dos用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映象中可重定位段地址的指针链表。文件头的形式与exeheader结构对应:
exeheader struc
exsignature dw 5a4dh ;.exe标志
exexrabytes dw ? ;最后(部分)页中的字节数


expages dw ? ;文件中的全部和部分页数
exrelocitems dw ? ;重定位表中的指针数
exheadersize dw ? ;以字节为单位的文件头大小
exminalloc dw ? ;最小分配大小
exmaxalloc dw ? ;最大分配大小
exinitss dw ? ;初始ss值
exinitsp dw ? ;初始sp值
exchechsum dw ? ;补码校验值
exinitip dw ? ;初始ip值
exinitcs dw ? ;初始cs值
exreloctable dw ? ;重定位表的字节偏移量
exoverlay dw ? ;覆盖号
exeheader ends程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.exe文件的大小减去文件头的大小,也等于exheadersize的域的值乘以16。ms-dos通过把该映象直接从文件拷贝到内存加载.exe程序然后调整定位表中说明的可重定位段地址。
定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exrelocitems域说明了数组中指针的个数,exreloctable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。 为加载.exe程序,ms-dos首先读文件头以确定.exe标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上psp的大小再加上exeheader结构中的exminalloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则ms-dos停止加载程序并返回一个出错值。否则面,它计算程序映象的大小加上psp的大小再加上exeheader结构中exmaxalloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则ms-dos 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,ms-dos确定段地址,也称为起始段地址,ms-dos从此处加载程序映象。如果exminalloc域和exmaxalloc域中的值都为零,则ms-dos把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着psp域之上。接下来,ms-dos读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,ms-dos寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 ms-dos在所分配内存的最低部分建造256字节的psp,把al和ah设置为加载 .com程序时所设置的值。ms-dos使用文件头中的值设置sp与ss,调整ss初始值,把起始地址加到它之上。ms-dos还把es和ds设置为psp的段地址.最后,ms-dos从程序文件头读取cs和ip的初始值,把起始段地址加到cs之 上,把控制转移到位于调整后地址处的程序。

三、引导型病毒原理
了解引导型病毒的原理,首先要了解引导区的结构。软盘只有一个引导区,称为dos boot secter ,只要软盘做了格式化,就会存在。其作用为查找盘上有无io.sys dos.sys,若有则引导,若无则显示‘no system disk...’等信息。硬盘有两个引导区,在0面0道1扇区的称为主引导区,内有主引导程序和分区表,主引导程序查找激活分区,该分区的第一个扇区即为dos boot secter。绝大多数病毒感染硬盘主引导扇区和软盘dos引导扇区。

***3.5”软盘格式***
3.5”软盘是双面的,所以零磁道有正反两面,正面为0-17扇区,
反面是18-35扇区。
0 扇区: boot area (引导扇区);
1 - 9 扇区: 1st fat area (第一张文件分配表);
10 - 18 扇区: 2st fat area (第二张文件分配表);
19 - 32 扇区: root dir area(也叫 file directory table,fdt)
文件目录表(根目录)
33-2879 扇区: data area (数据区)

***硬盘的主引导记录结构***
硬盘的主引导记录结构
偏移 机器码 符号指令 说明
0000 fa cli ;屏蔽中断
0001 33c0 xor ax,ax
0003 8ed0 mov ss,ax ;(ss)=0000h
0005 bc007c mov sp,7c00 ;(sp)=7c00h
0008 8bf4 mov si,sp ;(si)=7c00h
000a 50 push ax


000b 07 pop es ;(es)=0000h
000c 50 push ax
000d 1f pop ds ;(ds)=0000h
000e fb sti
000f fc cld
0010 bf0006 mov di,0600
0013 b90001 mov cx,0100 ;共512字节
0016 f2 repnz
0017 a5 movsw ;主引导程序把自己从0000:7c00处搬到
;0000:0600处,为dos分区的引导程序腾
;出空间
0018 ea1d060000 jmp 0000:061d ;跳到0000:061d处继续执行,实际上就是
;执行下面的mov指令(001d偏移处)
001d bebe07 mov si,07be ;07be-0600=01be,01be是分区表的首址
0020 b304 mov bl,04 ;分区表最多4项,即最多4个分区
0022 803c80 cmp byte ptr [si],80 ;80h表示活动分区
0025 740e jz 0035 ;找到活动分区则跳走
0027 803c00 cmp byte ptr [si],00 ;00h为有效分区的标志
002a 751c jnz 0048 ;既非80h亦非00h则分区表无效
002c 83c610 add si,+10 ;下一个分区表项,每项16字节
002f fecb dec bl ;循环计数减一
0031 75ef jnz 0022 ;检查下一个分区表项
0033 cd18 int 18 ;4个都不能引导则进入rom basic
0035 8b14 mov dx,[si]
0037 8b4c02 mov cx,[si+02] ;取活动分区的引导扇区的面,柱面,扇区
003a 8bee mov bp,si ;然后继续检查后面的分区表项
003c 83c610 add si,+10
003f fecb dec bl
0041 741a jz 005d ;4个都查完则去引导活动分区
0043 803c00 cmp byte ptr [si],00 ;00h为分区有效标志
0046 74f4 jz 003c ;此分区表项有效则继续查下一个
0048 be8b06 mov si,068b ;068b-0600=018b,取"无效分区"字符串
004b ac lodsb ;从字符串中取一字符
004c 3c00 cmp al,00 ;00h表示串尾
004e 740b jz 005b ;串显示完了则进入死循环
0050 56 push si
0051 bb0700 mov bx,0007
0054 b40e mov ah,0e
0056 cd10 int 10 ;显示一个字符
0058 5e pop si
0059 ebf0 jmp 004b ;循环显示下一个字符
005b ebfe jmp 005b ;此处为死循环
005d bf0500 mov di,0005 ;读入活动分区的引导扇,最多试读5次
0060 bb007c mov bx,7c00
0063 b80102 mov ax,0201
0066 57 push di
0067 cd13 int 13 ;读
0069 5f pop di
006a 730c jnb 0078 ;读盘成功则跳走
006c 33c0 xor ax,ax
006e cd13 int 13 ;读失败则复位磁盘
0070 4f dec di
0071 75ed jnz 0060 ;不到5次则再试读
0073 bea306 mov si,06a3 ;06a3-0600=00a3,即"error loading"串
0076 ebd3 jmp 004b ;去显示字符串,然后进入死循环
0078 bec206 mov si,06c2 ;06c2-0600=00c2,即"missing.."串
0076 ebd3 jmp 004b ;去显示字符串,然后进入死循环
0078 bec206 mov si,06c2 ;06c2-0600=00c2,即"missing.."串
007b bffe7d mov di,7dfe ;7dfe-7c00=01fe,即活动分区的引导扇
;区的最后两字节的首址
007e 813d55aa cmp word ptr [di],aa55;最后两字节为aa55h则有效
0082 75c7 jnz 004b ;无效则显示字符串并进入死循环
0084 8bf5 mov si,bp
0086 ea007c0000 jmp 0000:7c00 ;有效则跳去引导该分区
0080 49 6e 76 61 6c inval
0090 69 64 20 70 61 72 74 69-74 69 6f 6e 20 74 61 62 id partition tab
00a0 6c 65 00 45 72 72 6f 72-20 6c 6f 61 64 69 6e 67 le.error loading
00b0 20 6f 70 65 72 61 74 69-6e 67 20 73 79 73 74 65 operating syste
00c0 6d 00 4d 69 73 73 69 6e-67 20 6f 70 65 72 61 74 m.missing operat
00d0 69 6e 67 20 73 79 73 74-65 6d 00 00 fb 4c 38 1d ing system...l8.


00e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
01a0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
01b0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01 ................;分区表
01c0 01 00 06 0f 7f 9c 3f 00-00 00 f1 59 06 00 00 00 ......?....y....
01d0 41 9d 05 0f ff 38 30 5a-06 00 40 56 06 00 00 00 a....80z..@v....
01e0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
01f0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 aa ..............u.


使用int 13h的02功能调用把位于硬盘保留扇区中0道0头1扇区处的硬盘主引导记录读到内存的es:bx处。现在把读出程序代码进行如下分析:

1、移动主引导记录程序
0e74:7c00 33c0 xor ax,ax ;ax清零
0e74:7c02 8ed0 mov ss,ax ;ss清零
0e74:7c04 bc007c mov sp,7c00 ;sp=7c00,堆栈设在0:7c00h
0e74:7c07 fb sti ;开中断
0e74:7c08 50 push ax
0e74:7c09 07 pop es ;es=0
0e74:7c0a 50 push ax
0e74:7c0b 1f pop ds ;ds=0
0e74:7c0c fc cld
0e74:7c0d be1b7c mov si,7c1b ;源地址为0:7c1bh
0e74:7c10 bf1b06 mov di,061b ;目的地址为0:061bh
0e74:7c13 50 push ax
0e74:7c14 57 push di
0e74:7c15 b9e501 mov cx,01e5 ;移动01e5字节
0e74:7c18 f3 repz ;将主引导记录从0:7c1b-0:7dff
0e74:7c19 a4 movsb ;移至0:061b-0:07ff
0e74:7c1a cb retf ;转移到0:061b,继续执行程序

2、顺序查找四个硬盘分区表,寻找自举标志
0e74:061b bebe07 mov si,07be ;si指向硬盘分区表1的自举标志

0e74:061e b104 mov cl,04 ;查找四个分区
0e74:0620 382c cmp [si],ch
0e74:0622 7c09 jl 062d ;如果[si]的第7位为1,即为自
;举标志,转062dh
0e74:0624 7515 jnz 063b ;如果[si]不为0,出错,转063bh
0e74:0626 83c610 add si,+10 ;依次检验四个分区表,直至找到

0e74:0629 e2f5 loop 0620 ;自举标志
0e74:062b cd18 int 18 ;找不到自举标志,进入boot异
;常处理程序。
0e74:062d 8b14 mov dx,[si] ;保存自举驱动器号于dl中
0e74:062f 8bee mov bp,si ;保存自举分区地址指针于bp
0e74:0631 83c610 add si,+10 ;继续检验自举分区后的分区


0e74:0634 49 dec cx ;自举标志,直至四个分区都
0e74:0635 7416 jz 064d ;检查完
0e74:0637 382c cmp [si],ch ;若其余的自举标志不为0,出错

0e74:0639 74f6 jz 0631 

3、出错,写屏幕程序段
0e74:063b be1007 mov si,0710 ;错误信息输出,死循环
0e74:063e 4e dec si
0e74:063f ac lodsb
0e74:0640 3c00 cmp al,00
0e74:0642 74fa jz 063e
0e74:0644 bb0700 mov bx,0007
0e74:0647 b40e mov ah,0e
0e74:0649 cd10 int 10
0e74:064b ebf2 jmp 063f

硬盘主引导记录程序的功能是读出自举分区的boot程序,并把控制转移到分区boot程序。整个程序流程如下:
1 将本来读入到0:7c00h处的硬盘主引导记录程序移至0:61bh处;
⑵ 顺序读入四个分区表的自举标志,以找出自举分区,若找不到,转而执行int18h的boot异常执行中断程序;
⑶ 找到自举分区后,检测该分区的系统标志,若为32位fat表或16位fat表但支持13号中断的扩展功能,就转到执行13号中断的41号功能调用进行安装检验,检验成功,就执行42号扩展读功能调用把boot区程序读入到内存0:7c00h处,成功,跳到第⑸步,若读失败或系统标志为其它,就调用13号中断的读扇区功能调用把boot读到0:7c00h;
⑷ 用13号中断的读扇区功能时,用两种方式分别进行5次试读。第一种方式是直接从自举分区的头扇区读入boot程序,若读成功,但结束标志不是55aa,则改用第二种方式,又如果用第一种方式试读五次均不成功,就改用第二种方式。若两种方式试读均失败,就转到出错处理程序;
⑸ 读入boot区程序成功,转至0:7c00h处执行boot程序。

相关新闻
学习从系统中删除病毒2007/6/28
吃透木马运行原理把它扼杀2007/6/28
McAfee杀毒软件高级设置技巧五招2007/6/28
隐藏文件看不到?中毒了!2007/6/25
360安全卫士推出集三重防护理念2007/6/25
 
    其它相关新闻
·学习从系统中删除病毒
·吃透木马运行原理把它扼杀
·McAfee杀毒软件高级设置技巧五招
·隐藏文件看不到?中毒了!
·360安全卫士推出集三重防护理念
·使用杀毒软件应该注意什么
·CA发布声明:我的杀毒软件漏洞很大
    最新新闻
·磁碟机病毒的十大罪行
·病毒预警:光华反病毒资讯(7月16日-7月22日)
·病毒预警:光华反病毒资讯(7月9日-7月15日)
·用Regsvr32命令解决系统疑难杂症
·Windows的DLL文件原理与修改方法
·如何隐藏硬盘分区
·攻防全面分析 常用九种攻击方法
·卡巴再次误报 将注册表判为木马
·英特尔酷睿2存在安全缺陷
    相关软件下载
·AVG(原Ewido)Anti-Spyware最新完整病毒库更新(2008.06.02)-Anti-Spyware升级包
·AVG(原Ewido)Anti-Spyware每日增量病毒库更新(2008.06.02)-Anti-Spyware升级包
·Kaspersky Anti-Virus7.0.0.125增量包(2008.05.31)-卡巴斯基升级包
·Kaspersky Internet Security7.0.0.125完整升级包(2008.06.01)-卡巴斯基升级包
·熊猫卫士06月01号最新病毒升级包通用版-熊猫卫士升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.0 VPS更新-Avast升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.x VPS更新-Avast升级包
·小红伞AntiVir最新病毒库(2008.06.01) for WindowsNT/2000/XP-小红伞升级包
·McAfee VirusScan DAT 5306病毒库-麦咖啡升级包
·更多相关杀毒软件
  [本站导航]  
瑞星  瑞星杀毒软件瑞星升级包 瑞星杀毒瑞星2007 瑞星在线杀毒瑞星杀毒软件下载瑞星升级
卡巴斯基  卡巴斯基下载卡巴斯基6.0卡巴斯基杀毒软件卡巴斯基7.0卡巴斯基病毒库卡巴斯基升级包
江民  江民杀毒软件江民杀毒江民2007江民杀毒软件下载江民升级包江民升级江民离线升级包
金山毒霸  金山毒霸2007下载金山毒霸下载金山毒霸2007升级包金山毒霸升级金山毒霸杀毒软件
诺顿  诺顿杀毒软件诺顿杀毒诺顿病毒库诺顿企业版诺顿升级包诺顿升级诺顿下载
小红伞AntiVir  德国小红伞小红伞下载小红伞中文小红伞杀毒软件小红伞汉化Avira AntiVir
麦咖啡McAfee  麦咖啡杀毒软件麦咖啡升级包麦咖啡8.0麦咖啡企业版麦咖啡8.5mcafee virusscan
NOD32  nod32升级nod32升级服务器nod32下载nod32 2.7nod32升级idnod32更新nod32升级包
F-Secure  F-secure杀毒软件f-secure anti-virusF-secure汉化版F-secure注册机F-secure2007
Dr.Web  dr.web keydr.web cureitdr.web注册码dr.web汉化dr.web病毒库大蜘蛛大蜘蛛杀毒软件
Avast  avast注册码 序列号avast antivirusavast杀毒软件avast中文版avast 升级avast升级包
木马专杀  木马杀客木马克星AVG Ewido Anti-SpywareAVG Ewido Anti-Spyware升级包 更新
防火墙  瑞星防火墙天网防火墙arp防火墙瑞星个人防火墙江民防火墙防火墙下载风云防火墙
流氓软件清理  瑞星卡卡360安全卫士Wopti流氓软件清除大师奇虎360安全卫士360安全卫士绿色版
推荐软件  Firefox火狐浏览器浏览器Picasa照片处理软件非主流图片制作软件非主流照片制作
关于本站 - 广告合作 - 联系我们 - 下载声明 - 网站地图 - RSS2.0 - 合作伙伴:爱客宝
Copyright©1998 - 2007 爱客者 All Rights Reserved

粤ICP备07006801号