首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 使用 Windows API 讀寫其他進程記憶體 (OpenProcess/ReadProcessMemory/WriteProcessMemory)

     編輯:關於C#

透過 P/Invoke 呼叫 `kernel32.dll` 三大 API,可在**擁有足夠權限**前提下,開啟目標進程控制代碼、讀取/寫入虛擬記憶體。常用於:除錯器、外掛、自動化測試、記憶體掃描器。**濫用屬惡意軟體行為,可能觸發防毒軟體攔截、違反遊戲/軟體授權條款、造成系統不穩。本文僅供教學與合法除錯場景參考。**

核心 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);
                }
            }
        }
    }
}

實務關鍵步驟:記憶體掃描尋找目標位址

  1. `VirtualQueryEx` 列舉目標進程記憶體區域 (狀態 `MEM_COMMIT`、保護 `PAGE_READWRITE`)。
  2. 對每個區域 `ReadProcessMemory` 讀取緩衝區。
  3. 搜尋特徵值 (如分數 9999、血量 100、指標鏈)。
  4. 多次掃描比對 (數值變化前後) 縮小候選位址。
  5. 確定基址 + 偏移量,後續直接計算位址寫入。

權限與防禦機制

機制影響繞過/應對
UAC / 完整性等級低完整性進程無法開啟高完整性進程 (如系統服務、管理員進程)以管理員執行、或簽名驅動程式 (Kernel 模式)
防毒/EDR攔截 `OpenProcess`/`WriteProcessMemory` 可疑呼叫白名單、簽名、行為分析繞過 (屬攻擊技術,不建議)
ASLR (位址空間佈局隨機化)模組基址每次啟動不同動態獲取模組基址 (`EnumProcessModulesEx`) + 固定偏移
DEP / CFG防止執行寫入的記憶體 / 間接呼叫保護ROP 鏈 / 合法函數指標覆寫 (屬利用技術)
遊戲反作弊 (BE/EAC/Vanguard)核心驅動監控記憶體讀寫、完整性校驗極難繞過,屬攻防對抗範疇

現代 .NET 替代方案

  • DbgEng / ClrMD:官方除錯引擎 / Managed 除錯庫,支援記憶體讀寫、堆疊追蹤、GC Heap 列舉,**合法除錯首選**。
  • Process.GetProcesses / ProcessModule:列舉模組基址,配合 `ReadProcessMemory` 讀取靜態欄位。
  • MemoryMappedFile:進程間共享記憶體,**合作式**場景替代進程注入。

法律與道德警示

未經授權讀寫他人進程記憶體可能違反:《電腦犯罪條例》(台)、《計算機欺詐與濫用法》(美)、《網絡安全法》(中)、軟體 EULA、遊戲服務條款。合法用途僅限:**自有程式除錯、經授權的安全研究、惡意軟體分析 (隔離環境)**。請嚴格遵守法律法規與道德規範。

結語

`OpenProcess`/`ReadProcessMemory`/`WriteProcessMemory` 是 Windows 記憶體操作三大基石,掌握其簽章、權限模型、錯誤處理、記憶體掃描流程,是建構除錯器、分析工具的基礎。**實務中優先使用 ClrMD/DbgEng 等高層庫**,避免直接 P/Invoke 帶來的不穩定與安全風險。任何跨進程記憶體操作都必須在法律授權與道德框架內進行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved