Чтобы добавить к ответу @ Χp,, обратная сторона команды не должна быть действительно сложной, так как DLL-расширения отладчика снабжены символами (я уже изменил их, чтобы объяснить команду internal flag of the !heap).
Обратите внимание, что это просто краткий обзор, я не слишком много читал его.
В соответствии с документацией !address
команда находится в библиотеке exts.dll. Сама команда находится в Extension::address
.
Здесь есть две команды: режим ядра (KmAnalyzeAddress
) и пользовательский режим один (UmAnalyzeAddress
).
Внутри UmAnalyzeAddress
, код:
- Разобрать командную строку:
UmParseCommandLine(CmdArgs &,UmFilterData &)
- Проверьте процесс ПЭБ доступен
IsTypeAvailable(char const *,ulong *)
с "${$ntdllsym}!_PEB"
- Выделяют зЬй :: Список пользовательского режима диапазонов:
std::list<UmRange,std::allocator<UmRange>>::list<UmRange,std::allocator<UmRange>>(void)
- Запуск петли для сбора необходимой информации:
UmRangeData::GetWowState(void)
UmMapBuild
UmMapFileMappings
UmMapModules
UmMapPebs
UmMapTebsAndStacks
UmMapHeaps
UmMapPageHeaps
UmMapCLR
UmMapOthers
Наконец, результаты, наконец, выводятся на экран с помощью UmPrintResults
.
Каждая из вышеуказанных функций может быть упрощена до основных компонентов, например. UmFileMappings
имеет следующий центральный код:
.text:101119E0 push edi ; hFile
.text:101119E1 push offset LibFileName ; "psapi.dll"
.text:101119E6 call ds:LoadLibraryExW(x,x,x)
.text:101119EC mov [ebp+hLibModule], eax
.text:101119F2 test eax, eax
.text:101119F4 jz loc_10111BC3
.text:101119FA push offset ProcName ; "GetMappedFileNameW"
.text:101119FF push eax ; hModule
.text:10111A00 mov byte ptr [ebp+var_4], 1
.text:10111A04 call ds:GetProcAddress(x,x)
Другой пример, чтобы найти каждый стеки, код просто петли trhough всех потоков, получить их TEB и называют:
.text:1010F44C push offset aNttib_stackbas ; "NtTib.StackBase"
.text:1010F451 lea edx, [ebp+var_17C]
.text:1010F457 lea ecx, [ebp+var_CC]
.text:1010F45D call ExtRemoteTyped::Field(char const *)
Существует много выборки из _PEB
, _TEB
, _HEAP
и другими внутренними структурами, поэтому это, вероятно, невозможно, не проходя непосредственно через эти структуры. Итак, я думаю, что некоторая информация, возвращаемая !address
, недоступна через обычные/общие API.
GetMappedFileName кажется многообещающим. Я могу использовать это, когда getMoudleFileName терпит неудачу. Но, очевидно, Windbg может их каким-то образом найти. Мне просто нужно посмотреть, как это сделать. –
Добавлена функция ручки кучи –
Предположим, что у меня есть все права. Windbg, похоже, работает в пользовательском пространстве, а не как System. Он имеет право запросить другой процесс, и я получаю дескриптор процесса для процесса со всеми этими правами. –