Построение карты памяти процесса
Умение работать с памятью сторонних процессов - полезный навык адепта Темной стороны Силы. Таким способом можно найти нужные данные, хранящиеся в памяти, например, расшифрованные файлы, изображения, пароли, и еще много чего вкусного. Также этот навык пригодится при создании распаковщиков, лоадеров для программ и трейнеров для различных игр. Я привел лишь несколько примеров, на практике их можно найти гораздо больше.Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
Code (Assembler) : Убрать нумерацию
- ; Структура для чтения памяти процесса
- struct MEMORY_BASIC_INFORMATION
- BaseAddress dd ?
- AllocationBase dd ?
- AllocationProtect dd ?
- RegionSize dd ?
- State dd ?
- Protect dd ?
- Type dd ?
- ends
- ; Структура для чтения памяти процесса
- mbi MEMORY_BASIC_INFORMATION
Теперь у нас есть все инструменты и условия для работы, можно приступать к самому действу. Переменные, используемые в примере: ptMemory - указатель на текущий блок памяти, hProcess - хэндл исследуемого процесса, структура mbi определена выше.
Code (Assembler) : Убрать нумерацию
- ...
- ; Начало памяти процесса
- mov [ptMemory],0
- .scan_memory:
- ; Получить данные о памяти процесса
- invoke VirtualQueryEx, [hProcess], [ptMemory], mbi,\
- sizeof.MEMORY_BASIC_INFORMATION
- ; Сканирование закончено?
- or eax,eax
- jz .stop_scan
- ...
- ; Здесь можно выполнять все необходимые действия с блоком памяти:
- ; проверить или изменить его атрибуты, записать дамп памяти на
- ; диск, поискать нужные сигнатуры и данные...
- ...
- ; Прибавить к указателю размер прочитанного региона
- mov eax,[mbi.RegionSize]
- add [ptMemory],eax
- jmp .scan_memory
- .stop_scan:
- ...
В приложении консольная программа с исходниками. После запуска она предлагает выбрать исполняемый файл, запускает его и показывает на экране его карту памяти с указанием адресов, размеров, типа и атрибутов каждого блока.
Просмотров: 8936 | Комментариев: 8
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(14.10.2013 в 12:10):
Если DLL грузится из импорта и файлО не пакованное, то лучше делать вот так:
CreateProcessA с флажком CREATE_SUSPENDED
ReadProcessMemory / cmp
WriteProcessMemory
ResumeThread
В остальном никаких проблем с 32-битным патчем 32-битных приложений на 64-битной системе нет. Конечно, только если нет какой-нибудь защиты памяти сторонними приложениями, но это уже другая история.
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, загруженная приложением. Ни то, ни другое не упаковано.
(я не хочу делать статический патч в данном случае.)
а есть ли какая-то особенность в 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, есть какое то принципиальное значение?
Второй вопрос: Будет ли статья на тему создания распаковщиков, лоадеров для программ и трейнеров?
Второй вопрос: Будет ли статья на тему создания распаковщиков, лоадеров для программ и трейнеров?
Добавить комментарий
Заполните форму для добавления комментария
да, попал на Win7/64bit - всё в порядке. А сделано в точности, как у вас. (Я не упомянул детали, когда задавал вопрос, спешил).
Ну разве что ещё этот sleep... У меня опционально можно давать или не давать дополнительно ResumeThread ещё и перед sleep. (Ну, ясно для чего).
Всё работает.
А то мне дистанционно поступила жалоба - иди знай, в чём там дело. Не имея-то на чём протестировать.