2017-01-27 17 views
0

プロセスの仮想メモリをデバッグしようとしています。仮想メモリを一連の既知の定数バイトで検索する必要がありますが、オフセットは常に動的に変化します。私は必要なバイトを見つけるためにアドレス空間全体を反復処理する必要があります。現在、私はこれらのループを持っていますが、完了まで平均で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を使用しているので、はるかに良い方法がない可能性があります。

+0

ReadProcessMemoryが遅いですが、一度に15バイトを超える読み込みを試しましたか?また、スライディングウィンドウを使用して、バイトの代わりにdwordを比較することもできます。 – CascadeCoder

+0

15バイトよりもはるかに大きなバッファが必要です。または、プロセスのメモリを自分のものにmmapする必要があります。また、 'memmem()'を使って検索してください。最後に、ブロック間の潜在的な重複をチェックしていません。 –

答えて

0

iで始まる各繰り返しで15バイトを読み込み、メモリが等しくなければ、i+1で始まる15バイトの次のバイトを読み込むので、あなたが知っているかもしれないという事実を数えません14の他のバイトの等価。 15バイト後方に見ると、バッファが等しい場合、kの最後のバイトが等しい場合には、直接15-kバイトをステップし、次の繰り返しの最初のバイトであるkを確認できません。

私は以下のコードをテストしていませんが、私はこの一般的な考え方で、より速く進めることができると思います。

BYTE target[15] = { 0xFG, 0x93, 0x32, 0x1A, 0xB0, 0x9F, 0xC7, 0x00, 0x11, 0x00, 
        0x3F, 0x01, 0x00, 0x00, 0x00 }; 
BYTE buff[15]; 
DWORD target_addr = 0; 
DWORD current = 0x401000; 
DWORD max = 0x2000000; 
int previousEqual = 0; 
while (!target_addr && current < max) 
{ 
    int count = 15; 
    ReadProcessMemory(procName, (LPCVOID)i, (LPVOID)buff, 15, &real); 
    while (target[count-1] == buff[count-1]) 
    { 
     --count; 
    } 
    if (count == previousEqual) 
    { 
     target_addr = current; 
    } 
    else 
    { 
     current += count; 
     previousEqual = 15-count; 
    } 
} 
関連する問題