備忘録

備忘録

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;
  }
}

参考文献
Cheat Engine :: View topic - C++ VirtualQueryEx
http://www.cheatengine.org/forum/viewtopic.php?p=5567512&highlight=&sid=6f16a11d298cadce0ba6e541829af654