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

C# 透過 Windows API 讀寫進程記憶體 (含 OpenProcess/ReadProcessMemory/WriteProcessMemory)

     編輯:關於C語言

利用 P/Invoke 呼叫 Kernel32.dll 三大 API,實現跨進程記憶體讀寫。本文說明核心 API 簽名、完整範例與安全/法律風險警示。

核心 API 簽名

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, out IntPtr lpNumberOfBytesRead);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, out IntPtr lpNumberOfBytesWritten);

常用存取權旗標:PROCESS_VM_READ (0x0010) | PROCESS_VM_WRITE (0x0020) | PROCESS_VM_OPERATION (0x0008) | PROCESS_QUERY_INFORMATION (0x0400) → 組合常用 0x1F0FFF (全存取)。

完整主控台範例 (自我進程演示)

class Program
{
    static void Main()
    {
        int targetValue = 999;
        IntPtr addr = Marshal.UnsafeAddrOfPinnedArrayElement(new[] { targetValue }, 0); // 取得區域變數位址 (僅示意)

        IntPtr hProc = OpenProcess(0x1F0FFF, false, (uint)Process.GetCurrentProcess().Id);
        if (hProc == IntPtr.Zero) { Console.WriteLine("OpenProcess 失敗: " + Marshal.GetLastWin32Error()); return; }

        byte[] buffer = new byte[4];
        IntPtr bytesRead;
        if (ReadProcessMemory(hProc, addr, buffer, 4, out bytesRead))
            Console.WriteLine($"讀取值: {BitConverter.ToInt32(buffer, 0)}"); // 999

        byte[] newVal = BitConverter.GetBytes(100);
        IntPtr bytesWritten;
        if (WriteProcessMemory(hProc, addr, newVal, 4, out bytesWritten))
            Console.WriteLine($"寫入後 targetValue = {targetValue}"); // 100

        CloseHandle(hProc);
        Console.ReadKey();
    }

    [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr hObject);
}

實務應用場景 (合法)

  • 偵錯器/分析器開發:讀取目標進程變數、呼叫堆疊、記憶體對應。
  • 互操作測試:驗證非託管 DLL 與託管程式的記憶體佈局一致性。
  • 熱修補/熱重載:在不重啟進程情況下修補記憶體中的代碼/資料 (需極度謹慎)。

⚠️ 重大風險與法律警示

  1. 破壞遊戲/軟體完整性:修改記憶體作弊、繞過授權屬違法行為 (違反 DMCA、EULA、刑法)。
  2. 進程不穩定:錯誤寫入導致目標進程 Crash、資料損毀、安全性繞過。
  3. 反作弊/反偵錯機制:現代遊戲/軟體部署核心級驅動監控 OpenProcess/WriteProcessMemory,違規帳號永久封鎖。
  4. 權限需求:需管理員權限或同等完整性等級,受 UAC/Protected Process 限制。

本文僅供教學研究合法互操作場景使用,嚴禁用於任何未經授權的進程記憶體操作。

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