Blog. Just Blog

Получение списка DLL, загруженных в текущий процесс

12.06.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня я покажу вам небольшой трюк, с помощью которого вы сможете получить список всех DLL (динамических библиотек), загруженных в ваше приложение. Хитрость заключается в том, что для этого мы вообще не будем использовать никакие API.

Сперва немного теории. Каждому процессу в системе соответствует особая структура PEB (Process Enviroment Block), в ней содержится большое количество полезной информации о процессе. Адрес PEB можно узнать из другой структуры - TIB (Thread Information Block), адрес которой, в свою очередь, всегда можно получить по фиксированному адресу [FS:0]. Так вот, одно из полей PEB указывает на массив структур, в которых содержится информация о всех динамических библиотеках, загруженных в адресное пространство процесса. Этот массив называется PEB_LDR_DATA. Перебирая по очереди записи из этого массива, можно получить интересующий нас список DLL, а также адреса загрузки в память и Virtual Address точки входа этих библиотек.

Переходим к программированию. Flat Assembler "из коробки" не знает структур для работы с PEB_LDR_DATA, поэтому придется ему в этом помочь:
  1. struct UNICODE_STRING
  2.   Length        dw ?
  3.   MaximumLength dw ?
  4.   Buffer        dd ?
  5. ends
  6.  
  7. struct LIST_ENTRY
  8.   Flink         dd ?
  9.   Blink         dd ?
  10. ends
  11.  
  12. struct LDR_DATA_ENTRY
  13.   InMemoryOrderModuleList LIST_ENTRY
  14.   BaseAddress   dd ?
  15.   EntryPoint    dd ?
  16.   SizeOfImage   dd ?
  17.   FullDllName   UNICODE_STRING
  18.   BaseDllName   UNICODE_STRING
  19.   Flags         dd ?
  20.   LoadCount     dw ?
  21.   TlsIndex      dw ?
  22.   HashTableEntry LIST_ENTRY
  23.   TimeDateStamp dd ?
  24. ends
Записи перелинкованы между собой посредством поля InMemoryOrderModuleList.Flink, в котором прописана информация об адресе следующей записи. Важно учитывать, что массив "закольцован", то есть последняя запись ссылается на первую. При переборе надо проверять, например, поле BaseAddress текущей записи, если оно нулевое, то обработку следует остановить. Записи в массиве располагаются в порядке их загрузки в память.

Читать статью целиком »
Просмотров: 3678 | Комментариев: 12

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 1 (0.0176 сек.) / Память: 4.5 Mb
Наверх