0x00405000)。PROCESS_VM_READ 權限 (通常需管理員權限)。OpenProcess(PROCESS_VM_READ, FALSE, pid) → 取得進程句柄 hProcess。ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, &lpNumberOfBytesRead) → 讀取記憶體到本地緩衝區。CloseHandle(hProcess) → 釋放句柄。#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)。