67 if ((File.Exists(_file)) && (_count > 0)) 68 { 69 // 復(fù)制 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 // 如果目標(biāo)已存在,刪除 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 // 運行剛復(fù)制完成的程序 84 System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(_target)); 85 } 86 Application.Exit(); 最后,我們來完成第三個目標(biāo),自我復(fù)制并且運行復(fù)制好的新程序。前面我們得到了_file程序運行絕對路徑并包括文件名,這樣,我們就可以打開并讀取它了。File是文件操作的靜態(tài)方法,它只負責(zé)打開,關(guān)閉,創(chuàng)建和刪除文件,對文件的讀寫,就要由FileStream來操作了。這里只是整個復(fù)制文件,非常的簡單。病毒的特性是可以附加到別的程序或文件上,整個過程就比較復(fù)雜了。首先,需要非常了解可執(zhí)行文件的結(jié)構(gòu),把原來的可執(zhí)行文件分解,并且把自身也進行分解,然后重新組合成一個新的可執(zhí)行文件,但是執(zhí)行的次序已經(jīng)改變了,程序開始會先跳轉(zhuǎn)到病毒代碼,保證病毒能夠被執(zhí)行后,再跳轉(zhuǎn)回正常的程序代碼,以使病毒能夠得以在隱藏的狀態(tài)下執(zhí)行。84行調(diào)用了新復(fù)制完成的程序。以使得新復(fù)制的程序能夠自動運行,并且進行下一次的復(fù)制。同樣的道理,現(xiàn)在非常多的軟件都提供了自動更新的功能,它的原理基本也是這樣,下載升級包,主程序調(diào)用升級程序,如果有必要,主程序會先退出,升級程序完成對主程序或者其他文件的復(fù)制更新,然后再重新調(diào)用主程序。由此可見,計算機的功能是沒有好壞之分的。病毒能夠運用的原理,普通程序當(dāng)然也能夠利用。水能載舟亦能覆舟就是這個道理。非常希望您為我提供批評和建議,您可以給我的郵箱Anature@163.com發(fā)送郵件。 |
|