44 // 默认复制次数45 const int TOTAL = 100;46 int _count = TOTAL;47 // 正在运行的程序路径和文件名48 string _file = Application.ExecutablePath;49 // 正在运行的程序路径50 string _path = Application.StartupPath;51 // 正在运行的程序文件名 52 string _name = _file.Replace(string.Format("{0}//", _path), string.Empty).ToLower();53 try54 {55 _count = int.Parse(_name.Replace(".exe", string.Empty));56 _count--;57 }58 catch59 {60 }61 finally62 {63 }64 // 目标文件65 string _target = string.Format("{0}//{1}.exe", _path, _count.ToString("000"));
Application类提供了获取程序运行绝对路径并包括文件名的属性和程序运行绝对路径的文件名属性,竟然不直接提供一个文件名的属性,好奇怪。正规的截取文件名的方法应该根据"/"来判断,这里采用了替换的方法,大家可以思考一下如果用SubString怎么实现。55和56行,如果文件名不是数字,那么从100.exe开始生成,如果你执行了10000.exe的文件,那么狠糟糕,你可能需要注销一下当前用户来终止程序运行,当然,让它运行也不会有多大影响。最后,65行,我们把目标锁定在程序的当前目录下。病毒和流氓软件就没有那么客气了,经常它可能会选择磁盘根目录、C:/Winodws、C:/Windows/System32或者其他重要的系统目录中。而且病毒采用了随机的命名方式或者是模仿系统文件名称的固定命名方式,以达到隐藏自身和迷惑用户的目的。
67 if ((File.Exists(_file)) && (_count > 0))68 {69 // 复制70 FileStream _fileStream = File.Open(_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);71 byte[] _buffer = new byte[_fileStream.Length];72 _fileStream.Read(_buffer, 0, _buffer.Length);73 _fileStream.Close();74 // 如果目标已存在,删除75 if (File.Exists(_target))76 {77 File.Delete(_target);78 }79 // 粘贴80 FileStream _writer = File.Open(_target, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);81 _writer.Write(_buffer, 0, _buffer.Length);82 _writer.Close();83 // 运行刚复制完成的程序84 System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(_target));85 }86 Application.Exit(); 最后,我们来完成第三个目标,自我复制并且运行复制好的新程序。前面我们得到了_file程序运行绝对路径并包括文件名,这样,我们就可以打开并读取它了。File是文件操作的静态方法,它只负责打开,关闭,创建和删除文件,对文件的读写,就要由FileStream来操作了。这里只是整个复制文件,非常的简单。病毒的特性是可以附加到别的程序或文件上,整个过程就比较复杂了。首先,需要非常了解可执行文件的结构,把原来的可执行文件分解,并且把自身也进行分解,然后重新组合成一个新的可执行文件,但是执行的次序已经改变了,程序开始会先跳转到病毒代码,保证病毒能够被执行后,再跳转回正常的程序代码,以使病毒能够得以在隐藏的状态下执行。84行调用了新复制完成的程序。以使得新复制的程序能够自动运行,并且进行下一次的复制。同样的道理,现在非常多的软件都提供了自动更新的功能,它的原理基本也是这样, 下载升级包,主程序调用升级程序,如果有必要,主程序会先退出,升级程序完成对主程序或者其他文件的复制更新,然后再重新调用主程序。由此可见,计算机的功能是没有好坏之分的。病毒能够运用的原理,普通程序当然也能够利用。水能载舟亦能覆舟就是这个道理。