2017-01-27 16 views
0

Я пытаюсь отлаживать виртуальную память процесса, что требует от меня поискать его виртуальную память для серии известных и постоянных байтов, однако из-за смещений, динамически изменяющихся все время I придется перебирать все адресное пространство, чтобы найти нужные мне байты. В настоящее время у меня есть эти петли, которые работают, однако они занимают очень много времени, чтобы запустить в среднем 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; 
     } 
    } 

Как можно ускорить процесс?

Это мой первый опыт использования низкоуровневых функций памяти и API отладки Windows, поэтому я вполне мог бы упустить гораздо лучший способ сделать это.

+0

ReadProcessMemory работает медленно, вы пробовали читать более 15 байт за раз? Вы также можете использовать скользящее окно и сравнивать слова вместо байтов. – CascadeCoder

+0

Вам нужен гораздо больший буфер, чем 15 байт, или чтобы mmap память процесса в вашу собственную. Кроме того, используйте 'memmem()' для поиска. Наконец, вы не проверяете возможность перекрытия блоков. –

ответ

0

Я полагаю, что вы читаете 15 байт на каждой итерации, начиная с i, и если память не равна, вы читаете 15 следующих байтов, начинающихся с i+1, и поэтому вы не считаете, что знаете равенство для 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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^