首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言:ReadProcessMemory 讀取另一進程變數值的完整步驟與代碼

     編輯:程式設計綜合問答

前置條件

  • 已知目標進程 PID。
  • 已知目標變數在目標進程中的**虛擬地址** (如 0x00405000)。
  • 當前進程需具備 PROCESS_VM_READ 權限 (通常需管理員權限)。

核心 API 序列

  1. OpenProcess(PROCESS_VM_READ, FALSE, pid) → 取得進程句柄 hProcess。
  2. ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, &lpNumberOfBytesRead) → 讀取記憶體到本地緩衝區。
  3. CloseHandle(hProcess) → 釋放句柄。

完整 C 代碼 (Windows, MSVC/GCC)

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        _tprintf(_T("Usage: %s  \n"), argv[0]);
        _tprintf(_T("Example: %s 1234 0x00405000\n"), argv[0]);
        return 1;
    }

    DWORD pid = (DWORD)strtoul(argv[1], NULL, 10);
    LPVOID addr = (LPVOID)strtoul(argv[2], NULL, 16); // 支援 0x 前綴

    // 1. 開啟進程
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid);
    if (hProcess == NULL) {
        _tprintf(_T("OpenProcess 失敗, 錯誤碼: %lu\n"), GetLastError());
        return 1;
    }

    // 2. 讀取記憶體 (假設讀取 4 位元組 int)
    int value = 0;
    SIZE_T bytesRead = 0;
    BOOL ok = ReadProcessMemory(hProcess, addr, &value, sizeof(value), &bytesRead);
    if (!ok || bytesRead != sizeof(value)) {
        _tprintf(_T("ReadProcessMemory 失敗, 錯誤碼: %lu, 讀取位元組: %zu\n"), GetLastError(), bytesRead);
        CloseHandle(hProcess);
        return 1;
    }

    // 3. 輸出結果
    _tprintf(_T("PID: %lu, Address: %p, Value: %d (0x%08X)\n"), pid, addr, value, value);

    CloseHandle(hProcess);
    return 0;
}

進階:讀取字串/結構體/陣列

// 讀取定長字串 (如 char name[32])
char name[32] = {0};
ReadProcessMemory(hProcess, nameAddr, name, sizeof(name), &bytesRead);

// 讀取結構體
typedef struct { int id; float hp; char name[16]; } Player;
Player p = {0};
ReadProcessMemory(hProcess, playerAddr, &p, sizeof(Player), &bytesRead);

// 讀取動態陣列 (需先讀取長度/指標)
int len = 0;
ReadProcessMemory(hProcess, lenAddr, &len, sizeof(len), &bytesRead);
int *arr = malloc(len * sizeof(int));
ReadProcessMemory(hProcess, arrAddr, arr, len * sizeof(int), &bytesRead);

常見失敗原因與排查

錯誤碼含義解決
5 (ERROR_ACCESS_DENIED)權限不足以管理員身分執行;目標進程有保護 (遊戲反作弊) 需繞過/驅動級讀取
299 (ERROR_PARTIAL_COPY)只讀到部分資料地址無效/記憶體未提交/跨頁面;嘗試分頁讀取
87 (ERROR_INVALID_PARAMETER)參數錯誤地址對齊、緩衝區大小、句柄有效性檢查
6 (ERROR_INVALID_HANDLE)句柄無效PID 錯誤/進程已退出

安全與法律警示

**未經授權讀取他人進程記憶體可能違反《計算機軟體保護條例》、遊戲用戶協議、反作弊條款。** 僅用於自有程式調試、逆向工程學習、合法安全研究。生產環境請用正規 IPC (共享記憶體、命名管道、Socket、COM)。

參考資源

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