[轉(zhuǎn)]自我復制的簡單實現(xiàn)(C#)
程序要實現(xiàn)下面幾個功能。
第一,運行時不出現(xiàn)運行界面,當然,在任務(wù)管理器里,還是可以看到進程的,道行再深的病毒也不可能無跡可尋。
第二,程序在運行目錄下自我復制n份。
第三,采用遞歸復制的方法,即第一個程序生成第二個程序,第二個程序生成第三個程序,以此類推。
源代碼很簡單,下面來分析一下:
35 // 不在任務(wù)欄顯示 36 this.ShowInTaskbar = false; 37 // 窗體透明 38 this.Opacity = 0; |
System.Windows.Forms.Form類封裝了一般的Windows窗口程序大部分特性,極大的簡化窗口界面的設(shè)計過程,上面這兩個屬性用于隱藏我們的程序的運行狀態(tài),第一個ShowInTaskbar屬性,設(shè)置為否時,程序就不會在狀態(tài)欄上面顯示。第二個Opacity屬性,表示窗口的不透明度,取值在0到100之間。0%的不透明度也就是100%透明了。這樣,在程序運行時,你就看不見窗體了。
44 // 默認復制次數(shù) 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 try 54 { 55 _count = int.Parse(_name.Replace(".exe", string.Empty)); 56 _count--; 57 } 58 catch 59 { 60 } 61 finally 62 { 63 } 64 // 目標文件 65 string _target = string.Format("{0}\\{1}.exe", _path, _count.ToString("000"));
|
Application類提供了獲取程序運行絕對路徑并包括文件名的屬性和程序運行絕對路徑的文件名屬性,竟然不直接提供一個文件名的屬性,好奇怪。正規(guī)的截取文件名的方法應(yīng)該根據(jù)"\"來判斷,這里采用了替換的方法,大家可以思考一下如果用SubString怎么實現(xiàn)。55和56行,如果文件名不是數(shù)字,那么從100.exe開始生成,如果你執(zhí)行了10000.exe的文件,那么狠糟糕,你可能需要注銷一下當前用戶來終止程序運行,當然,讓它運行也不會有多大影響。最后,65行,我們把目標鎖定在程序的當前目錄下。病毒和流氓軟件就沒有那么客氣了,經(jīng)常它可能會選擇磁盤根目錄、C:\Winodws、C:\Windows\System32或者其他重要的系統(tǒng)目錄中。而且病毒采用了隨機的命名方式或者是模仿系統(tǒng)文件名稱的固定命名方式,以達到隱藏自身和迷惑用戶的目的。
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是文件操作的靜態(tài)方法,它只負責打開,關(guān)閉,創(chuàng)建和刪除文件,對文件的讀寫,就要由FileStream來操作了。這里只是整個復制文件,非常的簡單。病毒的特性是可以附加到別的程序或文件上,整個過程就比較復雜了。首先,需要非常了解可執(zhí)行文件的結(jié)構(gòu),把原來的可執(zhí)行文件分解,并且把自身也進行分解,然后重新組合成一個新的可執(zhí)行文件,但是執(zhí)行的次序已經(jīng)改變了,程序開始會先跳轉(zhuǎn)到病毒代碼,保證病毒能夠被執(zhí)行后,再跳轉(zhuǎn)回正常的程序代碼,以使病毒能夠得以在隱藏的狀態(tài)下執(zhí)行。84行調(diào)用了新復制完成的程序。以使得新復制的程序能夠自動運行,并且進行下一次的復制。同樣的道理,現(xiàn)在非常多的軟件都提供了自動更新的功能,它的原理基本也是這樣,下載升級包,主程序調(diào)用升級程序,如果有必要,主程序會先退出,升級程序完成對主程序或者其他文件的復制更新,然后再重新調(diào)用主程序。由此可見,計算機的功能是沒有好壞之分的。病毒能夠運用的原理,普通程序當然也能夠利用。水能載舟亦能覆舟就是這個道理。