プロセスの仮想メモリをデバッグしようとしています。仮想メモリを一連の既知の定数バイトで検索する必要がありますが、オフセットは常に動的に変化します。私は必要なバイトを見つけるためにアドレス空間全体を反復処理する必要があります。現在、私はこれらのループを持っていますが、完了まで平均で15〜30秒かかるために非常に長い時間がかかります。大規模なアドレス空間でのループの最適化
BYTE target[15] = { 0xFG, 0x93, 0x32, 0x1A, 0xB0, 0x9F, 0xC7, 0x00, 0x11, 0x00,
0x3F, 0x01, 0x00, 0x00, 0x00 };
BYTE buff[15];
int count = 0;
DWORD target_addr = 0;
for (DWORD i = 0x401000; i <= 0x2000000; i++)
{
count = 0;
ReadProcessMemory(procName, (LPCVOID)i, (LPVOID)buff, 15, &real);
for (int j = 0; j < 15; j++)
{
if (target[j] == buff[j])
count++;
else
break;
}
if (count == 15)
{
target_addr = i;
break;
}
}
どうすればこのプロセスを大幅にスピードアップできますか?
これは初めての低レベルのメモリ機能とWindowsのデバッグAPIを使用しているので、はるかに良い方法がない可能性があります。
ReadProcessMemoryが遅いですが、一度に15バイトを超える読み込みを試しましたか?また、スライディングウィンドウを使用して、バイトの代わりにdwordを比較することもできます。 – CascadeCoder
15バイトよりもはるかに大きなバッファが必要です。または、プロセスのメモリを自分のものにmmapする必要があります。また、 'memmem()'を使って検索してください。最後に、ブロック間の潜在的な重複をチェックしていません。 –