備忘録

備忘録

Windows C++ 高速にメモリサーチを行う方法

Ⅰ. はじめに

ある特定範囲の最初から最後までをサーチをする場合、
メモリを確保していない場所までサーチするため非常に遅くなります。

VirtualQueryExを使うと、
メモリのアクセス権の状態などによって分岐を行えるため、
非常に高速にメモリサーチを行うことができます。

Ⅱ. サンプルプログラム

void search() {
  // メモリ情報
  MEMORY_BASIC_INFORMATION mBI;
  // サーチ開始アドレス
  UINT start = 0x00400000;
  // サーチ終了アドレス
  UINT end = 0x7FFFFFFF;
 
  while(start < end) {
    SIZE_T size = VirtualQueryEx(processHandle, (void*)start, &mBI, sizeof(MEMORY_BASIC_INFORMATION));
 
    if (size == 0) {
      std::cout << "error" << std::endl;
      break;
    }
 
    if ((mBI.State == MEM_COMMIT) && (mBI.Type == MEM_PRIVATE) && (mBI.Protect == PAGE_READWRITE)) {
      // メモリ検索処理
    }
    start += mBI.RegionSize;
  }
}