Blog. Just Blog

Получение списка модулей процесса

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Для работы с процессами в Windows есть множество различных способов, например, ранее мы уже разбирали получение списка загруженных DLL с помощью PEB_LDR_DATA. Сегодня получим список DLL процесса при помощи недокументированных отладочных функций. Пугаться не надо, с ними мы уже работали при получении динамической памяти процесса.

Начинаем с описания недостающих данных. Структура DEBUG_BUFFER есть по ссылке выше, а остальное вот.
  1. struct DEBUG_MODULE_INFORMATION
  2.         Reserved         rd 2
  3.         Base             dd ?
  4.         Size             dd ?
  5.         Flags            dd ?
  6.         Index            dw ?
  7.         Unknown          dw ?
  8.         LoadCount        dw ?
  9.         ModuleNameOffset dw ?
  10.         ImageName        rb 100h
  11. ends
  12.  
  13. PDI_MODULES = 0x01
Быстренько повторим теорию. Для приема отладочной информации процесса первым делом надо подготовить буфер в памяти, это делается с помощью недокументированной функции RtlCreateQueryDebugBuffer. Дальше заполняем его данными с помощью недокументированной функции RtlQueryProcessDebugInformation, как это делали ранее при работе с кучей. Стоит упомянуть, что огромный плюс этой функции в том, что ей для работы требуется только идентификатор процесса, сам процесс открывать не надо. Для работы с другими процессами достаточно будет привилегии SeDebugPrivilege.

Перебор модулей процесса выполняется следующим образом. Самым первым в списке идет запись об исполняемом файле самого процесса, дальше перечисляются все динамические библиотеки, загруженные к этому процессу.
  1.         ; Зарезервировать буфер для отладочной информации
  2.         invoke  RtlCreateQueryDebugBuffer,0,FALSE
  3.         mov     [debug_buf],eax
  4.  
  5.         ; Получить информацию о модулях текущего процесса
  6.         invoke  GetCurrentProcessId
  7.         invoke  RtlQueryProcessDebugInformation,eax,\
  8.                 PDI_MODULES,[debug_buf]
  9.         mov     ebx,[debug_buf]
  10.         ; Указатель на информацию о модулях
  11.         mov     ebx,[ebx+DEBUG_BUFFER.ModuleInformation]
  12.         ; Количество записей
  13.         mov     ecx,[ebx]
  14.         ; Пропустить заголовок
  15.         add     ebx,4
  16. .loc_module_scan:
  17.         or      ecx,ecx
  18.         jz      .loc_module_done
  19.  
  20.         ...
  21.         ; В структуре DEBUG_MODULE_INFORMATION информация о модуле
  22.         ...
  23.  
  24. .loc_module_next:
  25.         add     ebx,sizeof.DEBUG_MODULE_INFORMATION
  26.         dec     ecx
  27.         jmp     .loc_module_scan
  28.  
  29. .loc_module_done:
  30.         ; Прибраться за собой
  31.         invoke  RtlDestroyQueryDebugBuffer,[debug_buf]
В поле Flags структуры DEBUG_MODULE_INFORMATION записана информация о текущем состоянии динамической библиотеки: загружается, выгружается, точка входа обработана и т.п.
  1. LDRP_STATIC_LINK             = 0x00000002
  2. LDRP_IMAGE_DLL               = 0x00000004
  3. LDRP_LOAD_IN_PROGRESS        = 0x00001000
  4. LDRP_UNLOAD_IN_PROGRESS      = 0x00002000
  5. LDRP_ENTRY_PROCESSED         = 0x00004000
  6. LDRP_ENTRY_INSERTED          = 0x00008000
  7. LDRP_CURRENT_LOAD            = 0x00010000
  8. LDRP_FAILED_BUILTIN_LOAD     = 0x00020000
  9. LDRP_DONT_CALL_FOR_THREADS   = 0x00040000
  10. LDRP_PROCESS_ATTACH_CALLED   = 0x00080000
  11. LDRP_DEBUG_SYMBOLS_LOADED    = 0x00100000
  12. LDRP_IMAGE_NOT_AT_BASE       = 0x00200000
  13. LDRP_WX86_IGNORE_MACHINETYPE = 0x00400000
В поле Base содержится ImageBase модуля, Size - размер файла, ImageName - полный путь к исполняемому файлу модуля, а больше ничего интересного в полученной структуре нет. Еще особенность, что путь к файлу записан в ASCII и имеет ограниченную длину. При работе с именами файлов в юникоде или в случае очень большой вложенности папок могут возникнуть проблемы. Если эти данные критичны, то скорее всего придется использовать какой-то другой способ решения задачи.

В приложении пример программы, которая выводит в консоль список модулей своего процесса.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.Module.List.Demo.zip (2,272 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 417 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0048 сек.) / Память: 4.5 Mb
Наверх