Более простой способ собрать совокупность обращений к памяти, сделанных процессом Windows? - PullRequest
0 голосов
/ 28 октября 2019

Я делаю это как личный проект, я хочу сделать визуализатор для этих данных. но первым шагом является получение данных. Мой текущий план состоит в том, чтобы

  1. заставить мою программу отлаживать шаг целевого процесса через него
  2. каждый шаг записывает EIP из контекста каждого потока в рамках целевого процесса
  3. constructадрес памяти, который инструкция использует из контекста и сохраняет его.

Существует ли более простой или встроенный способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Честно говоря, лучший способ сделать это - вероятно, инструменты, как предложил Питер, в зависимости от ваших целей. Вы когда-нибудь запускали скрипт, который шагал по коду в отладчике? Даже автоматизированный это невероятно медленно. Единственная другая альтернатива, которую я вижу, это ошибки страницы, которые также будут невероятно медленными, но все же должны быть быстрее, чем один шаг. По сути, вы делаете каждую страницу, не входящую в секцию, выполняемую в данный момент, недоступной. Любой доступ к RW вне исполняемого кода вызовет исключение, при котором вы можете регистрировать детали и обрабатывать их. Конечно, у этого есть много недостатков - вы не можете обнаружить RW на текущей странице, он все еще будет медленным, он может усложниться, например, обработка передачи страницы, несколько потоков и т. Д. Последнее возможное решение, которое у меня естьбудет иметь прерывание по таймеру, которое проверяет доступ RW для каждой страницы. Это было бы невероятно быстро и, хотя оно не предоставило бы никаких конкретных адресов, оно дало бы вам совокупность страниц, написанных и прочитанных с. На самом деле я не совсем уверен, что Windows уже предоставляет эту информацию, и я также не уверен, есть ли надежный способ гарантировать, что ваши таймеры будут включены до того, как ядро ​​очистит эти биты.

1 голос
/ 29 октября 2019

Посмотрите на Intel PIN для динамического бинарного инструментирования / запуска ловушки для каждой инструкции загрузки / сохранения.

Вместо одного шага в отладчике (очень медленный), он выполняет двоично-двоичный JIT для добавления вызовов к вашим перехватчикам.

https://software.intel.com/sites/landingpage/pintool/docs/81205/Pin/html/index.html

...