Определить поток/процесс, которому принадлежит произвольный адрес оперативной памяти

Usage: <unknown> - это значит, что отладчик не может отнести данный адрес

ни к одному из модулей, ни к одной из системных структур - PEB, TEB и т.д.

Type: MEM_IMAGE - это однозначно говорит о том, что по данному адресу

загружен (отображен) какой-то исполняемый модуль, обычно exe/dll/ocx/sys.

Protect: PAGE_EXECUTE_READ - страница имеет права на выполнение, что

еще больше подтверждает предыдущий пункт.

Учитывая все, написанное выше, а также некоторые другие "подсказки" из

вывода WinDBG, у меня только одно предположение: в процесс загружен какой-то

модуль, но не через стандартные функции типа LoadLibrary, а через отображение

файлов в память (ссылку давал выше).

Попробуй команду !dh 76e11000 (я взял базовый адрес загрузки, см. поле

'BaseAddress' в выводе команды '!address'), она тебе, скорее всего,

выведет информацию о модуле, т.е. PE-заголовок, секции и т.д.

Что это за модуль - попробуй посмотреть утилитами Process Hacker или

Process Explorer, они такое умеют показывать.

Также можно использовать недокументированную функцию NtQuerySection.

Почему не должно? Отображение файлов в память именно так и работает.

Одна dll может быть загружена в несколько процессов по разным виртуальным адресам, но

при этом в физической памяти будет лишь одна ее копия.

Такого не бывает

Строго говоря, VAD - это низкоуровневые детали реализации виртуальной памяти.

Лучшее ее напрямую не трогать (тем более, что из user mode это и нельзя делать), а

использовать VirtualQuery(Ex), VirtualProtect(Ex), VirtualAlloc(Ex), VirtualFree(Ex) и т.д.

Если адрес внутри твоего процесса, то читай просто по указателю.

Если в чужом - тогда ReadProcessMemory.

Хэндл можно получить функцией OpenProcess.