Страницы, используемые DLL в адресном пространстве процесса - PullRequest
1 голос
/ 23 мая 2010

Есть ли надежный способ узнать, что страница памяти или диапазон страниц принадлежит определенной DLL внутри адресного пространства процесса?

Ответы [ 2 ]

1 голос
/ 23 мая 2010

Зависит от типа страницы.Адрес кодовых страниц и т. Д. Dll известны при загрузке и могут быть просмотрены с помощью окна «загруженные модули» или его эквивалента в любом отладчике.

Если вы говорите об общей странице памяти для чтения / записи, и я думаю, что это так, то я не знаю способа выяснить, к какому dll она «принадлежит» - и я не думаюздесь существует строгая концепция собственности.

0 голосов
/ 24 мая 2010

Существует метод, известный как Перехват API . Хорошо известная BugslayerUtil.DLL от Джона Роббинса (см. Его книгу «Отладка приложений») изначально использовалась как перехват API в собственном процессе. Я имею в виду, что все выделение памяти может быть выделено относительно небольшого количества хорошо известных функций, таких как LocalAlloc, GlobalAlloc, VirtualAlloc и т. Д. Можно перезаписать начальные адреса этих функций внутри адресного пространства процесса. Вы можете сделать это либо где-нибудь в начале процесса, либо использовать DLL Injection, чтобы сделать это (как это делает Dependency Walker в режиме профилирования). Таким образом, вы сможете регистрировать (отслеживать) каждую попытку выделения памяти, переадресовывать вызов исходной функции, просматривать полученный журнал возвращаемых значений (отслеживать) еще раз и возвращать результаты. Внутри каждой попытки вызова вы можете видеть все функции, которые вызвали эту функцию в стеке вызовов. Таким образом, содержимое стека вызовов вместе с адресом выделенной памяти и размером дает вам полную информацию, которую вы ищете. Вы увидите все в динамике.

Вы не должны реализовывать все вещи самостоятельно. Просто поищите в Интернете «перехват API» или «внедрение DLL», и вы найдете достаточно рабочих примеров. Для проверки стека вызовов вы можете использовать документированную функцию StackWalk64 (см. http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx) из imagehlp.dll / dbghelp.dll (например, см. http://www.codeproject.com/KB/threads/StackWalker.aspx).

Так что мне кажется, что ваша проблема может быть решена.

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