透過 P/Invoke 呼叫 `kernel32.dll` 三大 API,可在**擁有足夠權限**前提下,開啟目標進程控制代碼、讀取/寫入虛擬記憶體。常用於:除錯器、外掛、自動化測試、記憶體掃描器。**濫用屬惡意軟體行為,可能觸發防毒軟體攔截、違反遊戲/軟體授權條款、造成系統不穩。本文僅供教學與合法除錯場景參考。**
using System;
using System.Runtime.InteropServices;
public static class Kernel32
{
[Flags]
public enum ProcessAccessFlags : uint
{
All = 0x1F0FFF,
VMRead = 0x0010,
VMWrite = 0x0020,
VMOperation = 0x0008,
QueryInformation = 0x0400,
Synchronize = 0x100000
}
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, out IntPtr lpNumberOfBytesRead);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, out IntPtr lpNumberOfBytesWritten);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle(IntPtr hObject);
}
using System;
using System.Diagnostics;
class Demo
{
static int target = 999;
static void Main()
{
// 取得自身變數位址 (僅示範,實際需掃描目標進程)
unsafe
{
fixed (int* ptr = &target)
{
IntPtr addr = (IntPtr)ptr;
Console.WriteLine($"目標變數位址: {addr:X}, 原始值: {target}");
uint pid = (uint)Process.GetCurrentProcess().Id;
IntPtr hProcess = Kernel32.OpenProcess(Kernel32.ProcessAccessFlags.All, false, pid);
if (hProcess == IntPtr.Zero)
{
Console.WriteLine($"OpenProcess 失敗: {Marshal.GetLastWin32Error()}");
return;
}
try
{
// 讀取
byte[] readBuf = new byte[4];
if (Kernel32.ReadProcessMemory(hProcess, addr, readBuf, 4, out _))
{
int val = BitConverter.ToInt32(readBuf, 0);
Console.WriteLine($"讀取值: {val}");
}
// 寫入 100
byte[] writeBuf = BitConverter.GetBytes(100);
if (Kernel32.WriteProcessMemory(hProcess, addr, writeBuf, 4, out _))
{
Console.WriteLine($"寫入後 target = {target}"); // 應輸出 100
}
}
finally
{
Kernel32.CloseHandle(hProcess);
}
}
}
}
}
| 機制 | 影響 | 繞過/應對 |
|---|---|---|
| UAC / 完整性等級 | 低完整性進程無法開啟高完整性進程 (如系統服務、管理員進程) | 以管理員執行、或簽名驅動程式 (Kernel 模式) |
| 防毒/EDR | 攔截 `OpenProcess`/`WriteProcessMemory` 可疑呼叫 | 白名單、簽名、行為分析繞過 (屬攻擊技術,不建議) |
| ASLR (位址空間佈局隨機化) | 模組基址每次啟動不同 | 動態獲取模組基址 (`EnumProcessModulesEx`) + 固定偏移 |
| DEP / CFG | 防止執行寫入的記憶體 / 間接呼叫保護 | ROP 鏈 / 合法函數指標覆寫 (屬利用技術) |
| 遊戲反作弊 (BE/EAC/Vanguard) | 核心驅動監控記憶體讀寫、完整性校驗 | 極難繞過,屬攻防對抗範疇 |
未經授權讀寫他人進程記憶體可能違反:《電腦犯罪條例》(台)、《計算機欺詐與濫用法》(美)、《網絡安全法》(中)、軟體 EULA、遊戲服務條款。合法用途僅限:**自有程式除錯、經授權的安全研究、惡意軟體分析 (隔離環境)**。請嚴格遵守法律法規與道德規範。
`OpenProcess`/`ReadProcessMemory`/`WriteProcessMemory` 是 Windows 記憶體操作三大基石,掌握其簽章、權限模型、錯誤處理、記憶體掃描流程,是建構除錯器、分析工具的基礎。**實務中優先使用 ClrMD/DbgEng 等高層庫**,避免直接 P/Invoke 帶來的不穩定與安全風險。任何跨進程記憶體操作都必須在法律授權與道德框架內進行。