WindowsのWriteProcessMemory関数の使用方法
Windowsにおいて、WriteProcessMemory関数は指定したプロセスのメモリにデータを書き込むために使用されます。関数の宣言は次のとおりです。
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
);
パラメータの説明:
- プロセス:データが書き込まれるターゲット プロセスのハンドル。
- lpBaseAddress: データを書き込む対象プロセスメモリの開始アドレス。
- lpBuffer:書き込むデータのバッファーポインタ
- サイズ:書き込むデータの大きさ(バイト数)
- lpNumberOfBytesWritten:実際に書き込まれたバイト数を格納する変数を指すポインタ
WriteProcessMemory関数を使用する一般的な手順は次のとおりです
- ターゲットプロセスを開き、ターゲットプロセスのハンドルを取得します(例:OpenProcessファンクションを使用)
- 書き込むデータの格納用にメモリバッファを確保します。
- データを書き込むためのバッファリング処理
- WriteProcessMemory関数を使ってデータを対象プロセスのメモリに書き込む。
- WriteProcessMemory関数の戻り値をチェックし、TRUEで有れば書き込み成功。
- 対象プロセスのハンドルを閉じます。
以下は WriteProcessMemory 関数を使用して、あるターゲット プロセスのメモリに書き込む方法を示す簡単なサンプル コードです。
#include <Windows.h>
#include <iostream>
int main()
{
// 打开目标进程,获取句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, <目标进程ID>);
if (hProcess == NULL)
{
std::cout << "Failed to open process!" << std::endl;
return 1;
}
// 分配内存缓冲区,存储要写入的数据
int value = 123;
LPVOID lpBuffer = VirtualAllocEx(hProcess, NULL, sizeof(int), MEM_COMMIT, PAGE_READWRITE);
if (lpBuffer == NULL)
{
std::cout << "Failed to allocate memory in target process!" << std::endl;
CloseHandle(hProcess);
return 1;
}
// 将要写入的数据复制到缓冲区中
if (!WriteProcessMemory(hProcess, lpBuffer, &value, sizeof(int), NULL))
{
std::cout << "Failed to write process memory!" << std::endl;
VirtualFreeEx(hProcess, lpBuffer, sizeof(int), MEM_RELEASE);
CloseHandle(hProcess);
return 1;
}
// 释放内存缓冲区
VirtualFreeEx(hProcess, lpBuffer, sizeof(int), MEM_RELEASE);
// 关闭目标进程句柄
CloseHandle(hProcess);
return 0;
}
WriteProcessMemory 関数を使用する場合は、対象プロセスにアクセスする十分な権限がある必要があります。この関数の使用前に OpenProcess 関数を使用して権限を開放し、十分なアクセス権限を取得する必要があります。また、対象プロセスが管理者権限で動作していないことを確認します。動作している場合はアクセス権に関する問題が発生する場合があります。