2016-03-11 5 views
0

Исполнительный! Адресном особенности Windbg ...писать! Адрес эквивалент в WinAPI

Я использую VirtualQueryEx запросить другую память процесса и использование getModuleFileName на основе адрес вернувшейся из VirtualQueryEx дает имя модуля. Остальные немодульные области процесса. Как определить, отображается ли файл в регионе, или если область представляет стек или кучу или PEB/TEB и т. Д.

В принципе, как определить, представляет ли регион кучу, стек или PEB , Как делает Windbg?

ответ

0

Необходимо выяснить, находится ли адрес, который вас интересует, в файле с отображением в память. Выезд ->GetMappedFileName. Получение адресов кучи и стека процесса будет немного более проблематичным, так как диапазоны являются динамическими и не всегда лежат последовательно.

Lol, я не знаю, я бы начал с ручки в кучу. Если вы можете порождать/наследовать процесс, вы, скорее всего, сможете получить доступ к дескриптору в кучу. Эта функция выглядит многообещающе: GetProcessHeap. Это приложение для отладки работает как администратор, оно может перемещаться по цепочке процессов и отслеживать любой процесс на уровне пользователя. Я не думаю, что вы сможете получить доступ к защищенной памяти приложений в режиме ядра, таких как фильтры файловой системы, однако, поскольку они выкапываются немного ниже по правилам.

+0

GetMappedFileName кажется многообещающим. Я могу использовать это, когда getMoudleFileName терпит неудачу. Но, очевидно, Windbg может их каким-то образом найти. Мне просто нужно посмотреть, как это сделать. –

+1

Добавлена ​​функция ручки кучи –

+0

Предположим, что у меня есть все права. Windbg, похоже, работает в пользовательском пространстве, а не как System. Он имеет право запросить другой процесс, и я получаю дескриптор процесса для процесса со всеми этими правами. –

2

Один из подходов состоит в том, чтобы разобрать код в DLL расширения отладчика, который реализует! Адрес. В файле справки Windbg имеется документация о написании расширения. Вы можете использовать эту документацию для обратного проектирования, где расположен обработчик адреса. Затем, просматривая разборку, вы можете видеть, какие функции он вызывает.

У Windbg есть поддержка отладки другого экземпляра Windbg, в частности, для отладки DLL расширения. Вы можете использовать этот инструмент, чтобы лучше вникать в реализацию адреса.

Хотя обратный инженерный подход может быть утомительным, он будет более детерминированным, чем теоретизирование того, как реализуется адрес и исследует каждую теорию.

1

Чтобы добавить к ответу @ Χ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.

+0

Это очень помогает. Поэтому, всякий раз, когда API недоступен, мы должны отменить и найти недокументированные. :) –

Смежные вопросы