C++言語を使ったプロセスメモリ検索方法。
※この記事はプログラミングに関する知識を持っていることを前提に記しています。
・ReadProcessMemory関数
・OpenProcess関数
・ポインタ
最低限上記に関する事は知っておいてください。


今回は実際のソースの一部を公開しますが、
そのまま公開されたソースを写してもプログラミングスキルの向上には繋がらないので
ソースとコメントをヒントに試行錯誤を重ねながら理解していってください。
少しややこしい部分もありますが、式を立てて理解すればそれほど難しくはありません。



今回はアドレス [0x10000]~[0x10000000]
の範囲を検索するように書いています。
↓ソースの一部
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
INT Address = 0x10000; //検索開始アドレス
INT i, p; //ループ用
CHAR *MemoryBuff = new CHAR [4096]; //サイズは適当です。ReadProcessMemory関数を使うとき、このサイズ分読み取ります。

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
for(i=0;i<65520;i++) // ([検索終了アドレス] - [検索開始アドレス]) / バッファのサイズ = ループ回数 今回は
(0x10000000-0x10000)/4096=65520
{
     ReadProcessMemory(hProcess, (LPVOID)Address, (LPVOID)MemoryBuff, 4096, NULL);
     for(p=0;p<4096;p++)  //バッファのサイズ=ループ回数
     {
          Adress++; //アドレスをずらしていきます。
          MemoryBuff++; //バッファのポインタをずらしていき、strcmpを使ってバッファと検索対象文字列の比較を行います。
          if(strcmp(MemoryBuff, "検索対象文字列") == 0) //lstrcmp関数を使うと遅くなるので注意。
          {
               //文字列一致時の処理 今回はWriteProcessMemory関数を使ってメモリを書き込ませます。
              LPCTSTR lpBuffer = "TEST";
              WriteProcessMemory(hProcess, (LPVOID)Address, (LPVOID)lpBuffer, 4, FALSE);
          }
     }
     MemoryBuff = MemoryBuff - 4096; //ポインタを戻しておきます。
}

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


一応僕がプロセスメモリを検索するときに使っている手法です。
工夫をすればもっと検索速度が向上するかもしれません。

ソースをそのまま貼り付けるだけでなく参考程度にお使いください。