Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 6216 | Комментариев: 8

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

Комментарии

Отзывы посетителей сайта о статье
user (14.10.2013 в 20:51):
ManHunter, спасибо, -
да, попал на Win7/64bit - всё в порядке. А сделано в точности, как у вас. (Я не упомянул детали, когда задавал вопрос, спешил).
Ну разве что ещё этот sleep... У меня опционально можно давать или не давать дополнительно ResumeThread ещё и перед sleep. (Ну, ясно для чего).
Всё работает.
А то мне дистанционно поступила жалоба - иди знай, в чём там дело. Не имея-то на чём протестировать.
ManHunter (14.10.2013 в 12:10):
Если DLL грузится из импорта и файлО не пакованное, то лучше делать вот так:

CreateProcessA с флажком CREATE_SUSPENDED
ReadProcessMemory / cmp
WriteProcessMemory
ResumeThread

В остальном никаких проблем с 32-битным патчем 32-битных приложений на 64-битной системе нет. Конечно, только если нет какой-нибудь защиты памяти сторонними приложениями, но это уже другая история.
user (14.10.2013 в 08:23):
ManHunter,
а есть ли какая-то особенность в Win7/64-bit, которая не позволит пользоваться 32-bit run-time патчеру 32-bit приложения в ней.
А то у меня сейчас доступ к Win7 ограниченный, наугад тыкать не хочу.
Алгоритм стандартный:
------------
CreateProcessA
sleep X
ReadProcessMemory
cmp /patch
WriteProcessMemory
------------
Достаточно ли просто увеличить Х ?
Патчится DLL, загруженная приложением. Ни то, ни другое не упаковано.
(я не хочу делать статический патч в данном случае.)
Чтец (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-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0046 сек.) / Память: 4.5 Mb
Наверх