Как вы можете эффективно проверить соответствие виртуальной машины для адреса? - PullRequest
1 голос
/ 12 октября 2008

Я пишу инструмент трассировки, который должен иметь дело с выводом JIT, так что стек может иногда выглядеть довольно странно. Я хотел бы попытаться применить некоторые эвристики к адресам, чтобы определить, являются ли они кодом, данными или мусором. (Если я иногда ошибаюсь, это не имеет большого значения; однако, если процесс не работает, не так уж и много.)

Я могу cat /proc/«pid»/maps получить список отображений виртуальных машин для процесса в Linux. Можно ли получить доступ к этой информации (или любому подмножеству) изнутри процесса, не анализируя этот файл? Было бы идеально проверить адрес rwx. По сути, я хочу «прочитать» версию mprotect(2).

Если я не могу этого сделать, как насчет того, чтобы определить, вызовет ли доступ к определенному адресу ошибку сегментации? (В этом случае уже установлен обработчик SIGSEGV, и я не могу его легко перезаписать, иначе я бы просто сделал это.)

1 Ответ

2 голосов
/ 12 октября 2008

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

bool is_address_valid(ADDRINT addr) {
  static int pagesize = getpagesize();

  const void *foo = (const void *)(addr / pagesize * pagesize);

  if (munlock(foo, 1) == -1) {
    fprintf(stderr, "munlock(%p=>%p, 1) failed: %s\n", addr, foo,
            strerror(errno));
    return false;
  }
  return true;
}

Довольно отвратительно, но это предотвращает сбой моего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...