Я знаю, что в 32-битной архитектуре виртуальная память в режиме ядра отображается между 0x80000000
а также 0xFFFFFFFF
,
Он содержит некоторые структуры, такие как EPROCESS
, ETHREAD
… и т.д., а также каталоги страниц и таблицы для текущего процесса.
При попытке получить виртуальный адрес определенной функции ntoskrnl, скажем, «nt! NtReadFile», я обнаружил, что он отображается в виртуальном адресе ядра. 0x89421130
например.
Я пытался залатать некоторые шлепки после RET
со случайной инструкцией и при переключении в другой контекст процесса я обнаружил, что указанная мной инструкция все еще там.
Означает ли это, что виртуальная память, в которую загружен Ntoskrnl, остается неизменной в каждом виртуальном адресном пространстве процесса?
Благодарю.
Означает ли это, что виртуальная память, в которую загружен Ntoskrnl, остается неизменной в каждом виртуальном адресном пространстве процесса?
Да. В работающей системе Windows имеется одна копия ядра в памяти и точно такое же адресное пространство ядра (т.е. 0x80000000-0xFFFFFFFF
на 32-разрядный) отображается в каждом процессе.