Blog. Just Blog

Построение карты памяти процесса

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

Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
  1. ; Структура для чтения памяти процесса
  2. struct  MEMORY_BASIC_INFORMATION
  3.         BaseAddress          dd ?
  4.         AllocationBase       dd ?
  5.         AllocationProtect    dd ?
  6.         RegionSize           dd ?
  7.         State                dd ?
  8.         Protect              dd ?
  9.         Type                 dd ?
  10. ends
  11.  
  12. ; Структура для чтения памяти процесса
  13. mbi             MEMORY_BASIC_INFORMATION
Для работы с памятью процесса при помощи функции VirtualQueryEx нам надо знать хэндл этого процесса. Для дочерних, которые мы запустили сами, все просто: это значение hProcess из структуры PROCESS_INFORMATION. Если процесс порожден не нами, то для получения его хэндла, зная ID процесса, надо воспользоваться функцией OpenProcess, обязательно с флагом PROCESS_QUERY_INFORMATION. Возможно, что перед этим потребуется повысить привилегии нашего процесса, активировав SeDebugPrivilege.

Теперь у нас есть все инструменты и условия для работы, можно приступать к самому действу. Переменные, используемые в примере: ptMemory - указатель на текущий блок памяти, hProcess - хэндл исследуемого процесса, структура mbi определена выше.
  1.         ...
  2.         ; Начало памяти процесса
  3.         mov     [ptMemory],0
  4. .scan_memory:
  5.         ; Получить данные о памяти процесса
  6.         invoke  VirtualQueryEx, [hProcess], [ptMemory], mbi,\
  7.                 sizeof.MEMORY_BASIC_INFORMATION
  8.         ; Сканирование закончено?
  9.         or      eax,eax
  10.         jz      .stop_scan
  11.  
  12.         ...
  13.  
  14.         ; Здесь можно выполнять все необходимые действия с блоком памяти:
  15.         ; проверить или изменить его атрибуты, записать дамп памяти на 
  16.         ; диск, поискать нужные сигнатуры и данные...
  17.  
  18.         ...
  19.  
  20.         ; Прибавить к указателю размер прочитанного региона
  21.         mov     eax,[mbi.RegionSize]
  22.         add     [ptMemory],eax
  23.         jmp     .scan_memory
  24. .stop_scan:
  25.         ...
Блоки памяти процесса идут подряд, без разрывов, информация о каждом прочитанном блоке записывается в структуру mbi. Наиболее полезные для нас данные - это базовый адрес блока памяти mbi.BaseAddress и его размер mbi.RegionSize, а остальные, например, тип блока или флаги Memory Protection, помогают более точно определить нужный участок памяти. Все возможные значения флагов подробно описаны в MSDN.

В приложении консольная программа с исходниками. После запуска она предлагает выбрать исполняемый файл, запускает его и показывает на экране его карту памяти с указанием адресов, размеров, типа и атрибутов каждого блока.

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

Memory.Map.Demo.zip (3,479 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на Я.ру Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Поделиться ссылкой на Friendfeed Добавить в Яндекс.Закладки Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2230 | Комментариев: 5

Комментарии

Отзывы посетителей сайта о статье
Чтец (09.04.2010 в 19:36):
Если в ближайшее время будет статья на тему лоадеров, то если будет такая возможность затроньте также, возможность лоадером управлять программой и добавьте ссылки на полезную литературу и другие источники заслуживающие внимания на эту тему, спасибо.
ManHunter (01.04.2010 в 16:50):
Про трейнеры статья будет обязательно, про лоадеры тоже. Про распаковщики вряд ли.
Чтец (01.04.2010 в 16:48):
Всё ясно. Я так понимаю, что эта статья, как минимум одна из серии на тему Память чужого процесса?
ManHunter (01.04.2010 в 16:43):
Это я неправильно сформулировал мысль. VirtualQueryEx для получения инфрмации о блоке памяти, ReadProcessMemory - для чтения содержимого этого блока.
Чтец (01.04.2010 в 16:42):
Отличная тема, спасибо. Почему не используется ReadProcessMemory вместо VirtualQueryEx, есть какое то принципиальное значение?

Второй вопрос: Будет ли статья на тему создания распаковщиков, лоадеров для программ и трейнеров?

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

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

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