@Hatemylifezxc

Как работает память процессов в windows?

Совершенно не понимаю как работает память в windows.
Говорится, что процесс загружается в верхнюю часть виртуальной памяти, а OS в нижнюю.
У каждого процесса "типо" своя память. У него в памяти "типо" находятся dll, которые он может даже менять, так же как менять что то в своих адресах, а операционная система уже как то решит эту проблему, чтобы изменения в дллках не отразились на других процессах. Вот картинка для 32 битной Os memory_map-png.23130

Во-первых не понятно зачем вообще говорить о каких то адресах операциоонной системы, если они не доступны. Нельзя менять что то в адресах OS (насколько мне известно, ну из user mode имеется ввиду)
Во-вторых, в других местах говорится, что например процесс может не загрузиться на те же адреса , на которые он загружался до этого. Вот например. write process memory

Зачем если у нас у каждого процесса своя личная память которую он сам занимает, его загружать в разные адреса.
Я хочу просто перезаписат отделюную инструкцию, как мне это сделать, если она каждый раз находится на разных адресах.
  • Вопрос задан
  • 392 просмотра
Решения вопроса 2
@menkar3
Я хочу просто перезаписат отделюную инструкцию, как мне это сделать, если она каждый раз находится на разных адресах

WinApi же. Из юзермода - инжект кода в процесс. Т.е. принципиально что-то вроде (как бы я делал на си, во всяком случае):
0. Инжектимся (банальный вариант, от которого может психовать антивирус/что там еще - аллоцируем в процессе исполняемую память, загоняем туда в бинарном виде свой код, создаем на нем тред). Дальше вся работа в целевом процессе:
1. GetModuleHandle - находим интересующую нас dll, хендл эквивалентен ее базовому адресу.
3. NtProtectVirtualMemory - разрешаем запись на странице с интересующей инструкцией. Опционально - приостанавливаем остальные треды.
4. Перезаписываем инструкцию (для конкретной dll просто находим ее относительно начала dll)
5. Профит (если останавливали треды - возобновляем, опционально возвращаем старые аттрибуты странице)

для конкретной dll просто находим ее относительно начала dll - вилами по воде, конечно. Если функция экспортируется - есть GetProcAddress, что позволит искать ее относительно начала функции (уже меньше шансов на фейл).
Напрямую с памятью другого процесса разве что из ядра шаманить выйдет.
Ответ написан
Комментировать
@none7
Во-первых не понятно зачем вообще говорить о каких то адресах операциоонной системы, если они не доступны.

Затем, что это писал системный программист, для системных программистов. Например разработчики антивирусов много бы страдали без этого чёткого разделения.
Зачем если у нас у каждого процесса своя личная память которую он сам занимает, его загружать в разные адреса.

ASLR
Я хочу просто перезаписат отделюную инструкцию, как мне это сделать, если она каждый раз находится на разных адресах.

EnumProcessModules GetModuleFileNameEx
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы