Получение списка модулей процесса
Для работы с процессами в Windows есть множество различных способов, например, ранее мы уже разбирали получение списка загруженных DLL с помощью PEB_LDR_DATA. Сегодня получим список DLL процесса при помощи недокументированных отладочных функций. Пугаться не надо, с ними мы уже работали при получении динамической памяти процесса.Начинаем с описания недостающих данных. Структура DEBUG_BUFFER есть по ссылке выше, а остальное вот.
Code (Assembler) : Убрать нумерацию
- struct DEBUG_MODULE_INFORMATION
- Reserved rd 2
- Base dd ?
- Size dd ?
- Flags dd ?
- Index dw ?
- Unknown dw ?
- LoadCount dw ?
- ModuleNameOffset dw ?
- ImageName rb 100h
- ends
- PDI_MODULES = 0x01
Перебор модулей процесса выполняется следующим образом. Самым первым в списке идет запись об исполняемом файле самого процесса, дальше перечисляются все динамические библиотеки, загруженные к этому процессу.
Code (Assembler) : Убрать нумерацию
- ; Зарезервировать буфер для отладочной информации
- invoke RtlCreateQueryDebugBuffer,0,FALSE
- mov [debug_buf],eax
- ; Получить информацию о модулях текущего процесса
- invoke GetCurrentProcessId
- invoke RtlQueryProcessDebugInformation,eax,\
- PDI_MODULES,[debug_buf]
- mov ebx,[debug_buf]
- ; Указатель на информацию о модулях
- mov ebx,[ebx+DEBUG_BUFFER.ModuleInformation]
- ; Количество записей
- mov ecx,[ebx]
- ; Пропустить заголовок
- add ebx,4
- .loc_module_scan:
- or ecx,ecx
- jz .loc_module_done
- ...
- ; В структуре DEBUG_MODULE_INFORMATION информация о модуле
- ...
- .loc_module_next:
- add ebx,sizeof.DEBUG_MODULE_INFORMATION
- dec ecx
- jmp .loc_module_scan
- .loc_module_done:
- ; Прибраться за собой
- invoke RtlDestroyQueryDebugBuffer,[debug_buf]
Code (Assembler) : Убрать нумерацию
- LDRP_STATIC_LINK = 0x00000002
- LDRP_IMAGE_DLL = 0x00000004
- LDRP_LOAD_IN_PROGRESS = 0x00001000
- LDRP_UNLOAD_IN_PROGRESS = 0x00002000
- LDRP_ENTRY_PROCESSED = 0x00004000
- LDRP_ENTRY_INSERTED = 0x00008000
- LDRP_CURRENT_LOAD = 0x00010000
- LDRP_FAILED_BUILTIN_LOAD = 0x00020000
- LDRP_DONT_CALL_FOR_THREADS = 0x00040000
- LDRP_PROCESS_ATTACH_CALLED = 0x00080000
- LDRP_DEBUG_SYMBOLS_LOADED = 0x00100000
- LDRP_IMAGE_NOT_AT_BASE = 0x00200000
- LDRP_WX86_IGNORE_MACHINETYPE = 0x00400000
В приложении пример программы, которая выводит в консоль список модулей своего процесса.
Просмотров: 476 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария