Роясь в одной из функций обнаружил что нужный мне кусок памяти расположен в блоке: Код (Text): Memory map, item 76 Address=7F6F0000 Size=00007000 (28672.) Owner= 7F6F0000 (itself) Section= Type=Map 00041020 Access=R E Initial access=R E Возникли вопросы: 1. Я правильно понял что это кусок памяти относится к ядру? 2. Как узнать кто именно создал этот кусок? 3. Что обозначает тип данного блока "Map 00041020"? 4. Как получить доступ к этому блоку на запись?
1. Нет, это проекция секции которой владеет csrss и проецирует её при запуске процесса. 2. Процесс csrss, модуль csrsrv.dll, Вызывается NtMapViewOfSection, RVA процедуры(XPSP2 5.1.2600.2180) - 0x3866. 3. Проеция. 4. В csrss секция спроецирована с полным доступом(на запись). Записав чтолибо в эту память в процессе csrss, это сразу отразится в проекциях этой секции во всех процессах, глобально. Можно получить доступ на запись несколькими способами: > Скопировать из процесса csrss себе хэндл этой секции и спроецировать её в текущий процесс с дост. на запись. Необходимо найти хэндл этой секции, не знаю скока у csrss открытых секций, нужно посмотреть. Ссылка на переменную содержащую хэндл секции находится перед вызовом NtCreateSection. В модуле csrsrv.dll только один вызов NtCreateSection, именно он создаёт эту секцию. Поиск прост. > Писать в проекцию этой секции в процессе csrss. > Для вновь запускаемых процессов - можно пропатчить флаги в сервисе NtMapViewOfSection.
VBKesha Не знаю зачем тебе это, вроде ссылок на эту область немного - IsBadReadPtr()/IsBadWritePtr(), и то только чтобы размер страницы определить. Если нужно локально данные изменить - тогда ничего лучше чем тупо освободить проекцию и спроецировать свою секцию либо просто память выделить, но тогда об изменениях в секции ничего известно не будет.