· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Доступ к памяти другого процесса из драйвера

Посл.отвђт Сообщенiе


Дата: Окт 16, 2003 12:24:42

Господа Гуру!
Просетите плиз чайника, как получить доступ к памяти другого процесса (не того в контексте которого вызван драйвер)? ZwRead/WriteVirtualMemory в режиме ядра нет. Хотелось бы как-то сэмулировать переключение процессов, чтобы в основную таблицу страниц загрузились из hyperspace таблицы страниц для нужного мне процесса. Что-то я слышал про MiMapPageInHyperSpace но не знаю как она работает (примеров нет).


Дата: Окт 16, 2003 14:06:15 · Поправил: Four-F

push eax                        ; reserve DWORD on stack
invoke PsLookupProcessByProcessId, ProcessId, esp
pop ProcessObject               ; -> KPROCESS
.if eax == STATUS_SUCCESS
    invoke KeAttachProcess, ProcessObject
    ; Делаешь то, что надо
    invoke KeDetachProcess
    fastcall ObfDereferenceObject, ProcessObject
.endif


KeAttachProcess/KeDetachProcess устарели, но поддерживаются для обратной совместимости.
В место них начиная с 2000 KeStackAttachProcess/KeUnstackDetachProcess - документированы в IFS DDK.

Про MiMapPageInHyperSpace забудь.


Дата: Окт 16, 2003 16:10:03

Four-F спасибо.
Делаю KeAttachProcess, лезу в таблицу PTE (мне физический адрес нужен страницы чужого процесса), а там адреса моего процесса... Мне бы именно процессы переключить.
Чего-то я не понимаю, наверное.


Дата: Окт 16, 2003 16:50:41

KeAttachProcess адресный контекст как раз и меняет 100%.
Перед KeAttachProcess набери в айсе cpu и посмотри что в cr3 - это физический адрес каталога страниц + чуть-чуть флагов. Затем набери cpu после KeAttachProcess и срасни значенив в cr3 - увидишь, что они разные.

PTE же для газных процессов запросто могут совпадать. Это значит, что они разделяют одну и ту же физическую страницу. Например код всех длл разделяется. А если ты смотришь PTE для адреса >80000000, то они почти все одинаковые. Ядро то для всех процессов одно.


Дата: Окт 16, 2003 20:38:46

Все понял. Спасибо.
Я-то дурак лазил по адресу 0C0000000h за pte, а надо на cr3 опираться. Я думал система прямо мне эти pte и перепишет, а оказывается все хитрее.


Дата: Окт 17, 2003 17:01:07

PTE в диапазоне C0000000 - C01FFFFF покрывают юзерное пространство.
C0300000 католог страниц.
Страницы на которых лежат сами эти PTE, естественно уникальны для процесса. Но те страницы на которые кажут PTE могут и разделяться.

PTE в диапазоне C0200000 - C03FFFFF покрывают системное пространство.
Страницы на которых лежат сами эти PTE, разделяются всеми процессами.

Но, по крайней мере два диапазона даже в системном пространстве, по 4МБ каждый, уникальны для каждого процесса.
Это сами таблицы страниц C0000000 - C03FFFFF и рабочий набор процесса C0400000 - C07FFFFF.

Возможно, в это сложно по началу врубиться. Почитай Соломона. Может несколько раз :-)


Дата: Окт 17, 2003 17:45:48

Да, честно говоря с первого раза я не въехал.
Вроде все сделал как надо, а не работает.
Меня Шрайбер слегка ввел в заблуждение...

Но вроде потихоньку начинаю вникать. Спасибо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.091