ReadProcessMemory приводит к сбою целевого приложения

#c #memory #crash #access-rights #readprocessmemory

#c #память #сбой #права доступа #readprocessmemory

Вопрос:

Моя цель — считывать большие фрагменты исполняемой памяти из целевого приложения.

ReadProcessMemory() иногда происходит сбой, но это нормально, я все еще могу просмотреть остальные интересующие меня прочитанные байты.

Я ничего не изменяю в целевом приложении, например, значения.

Моя проблема в том, что целевое приложение выходит из строя примерно через минуту или около того, или когда в нем происходят определенные перераспределения.

Я дошел до крайностей, таких как чтение без VirtualProtectEx() , чтобы не изменять даже атрибуты безопасности указанных областей памяти.

Мне любопытно, что может привести к сбою целевого приложения после чтения из его памяти без изменения значений или прав доступа. (?)

Примечание: к указанной памяти, вероятно, одновременно обращается как целевое приложение, так и мое приложение. (С точки зрения целевого приложения оно считывается, выполняется и записывается.)

Вы можете взглянуть на мой код здесь:

   UINT64 pageNum = 0;
  BYTE page[4096];
    
  for (UINT64 i = start; i < end; i =0x1000)
  {
    ReadProcessMemory(qtHandle, (void*)i, amp;page, sizeof(page), amp;bytesRead);
    foundCode = findCode(page, pageNum);
    if (foundCode != 0) 
    {
      foundCode  = start - 11;
      break;
    }
    pageNum  ;
  }

  cout << hex<< foundCode << endl;
  CloseHandle(qtHandle);
  return 0;
}

UINT64 findCode(BYTE* pg, UINT64 pageNum)
{
  for (size_t i = 0; i < 4096; i  )
  {
    if (findPattern(asm2, pg, i)) { //asm2 is an array of bytes
      return (pageNum * 4096   i);
    }
  }
  return 0;
}

bool findPattern(BYTE* pattern, BYTE* page, size_t index)
{
  for (size_t i = 0; i < sizeof(pattern); i  )
  {
    if (page[index   i] != pattern[i])
    {
      return false;
    }
  }
  return true;
}
 

Ответ №1:

ReadProcessMemory() не может привести к сбою целевой программы.

Возможно, вас обнаруживает и завершает работу приложения Anticheat / antidebug

Если вы используете VirtualProtectEx() для изменения разрешений, это наверняка может привести к сбою

Нам нужно будет увидеть больше кода, чтобы рассказать вам, в чем проблема

Ответ №2:

Проблема возникла из-за использования VirtualProtectEx() .