Форум программистов, компьютерный форум, киберфорум
Низкоуровневое программирование
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
1

В какой памяти находится PEB?

23.02.2015, 23:21. Показов 1769. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В книжке Robert Custer "WinDbg. From A to Z!" на 26 странице изображена вот такая схема: (см. сложение). На ней структуры PEB и TEB размещены над чертой, разделяющей user- и kernel-режимы (в области адресного пространства процесса).

Для получения указателя PEB используется функция NtQueryInformationProcess. которая, судя по префиксу "Nt" должна вызываться из режима ядра.

ВОПРОС(ы): как функция ядра может работать с "пользовательской" памятью (она же выделяется из выгружаемого пула?) А как же возможные страничные ошибки на высоком IRQL? Или не любая функция в режиме ядра вызывается с повышением IRQL до уровня DPC/dispatch? На картинке все правильно?

P.S.: в WinDbg команда !peb показывает (для текущего процесса, т.е. для самого отладчика):
lkd> !peb
PEB at 000007fffffdf000
Запустил VMMap, он показывает, что этот адрес типа "Private Data". Вроде как действительно пользовательское пространство.
Миниатюры
В какой памяти находится PEB?  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2015, 23:21
Ответы с готовыми решениями:

Найти ошибку: нужно вывести в какой четверти находится точка, если на оси, то указать на какой
Нужно вывести в какой четверти находится точка, если на оси, то указать на какой. Написала код, но...

Построить зависимость Peb от N и от комбинаций
Сергей Тетьора, Здравствуйте, Сергей Тетьора! Есть задача Я затрудняюсь решить. Построить...

Определить, на какой странице находится строка номер n и какой по счёту будет эта строка на странице
Страницы книги На каждой странице книги напечатано ровно k строк: на первой странице находятся...

В какой библиотеке находится MouseEvent?
Здравствуйте. Подскажите, пожалуйста, в какой библиотеке находится функция MouseEvent?

4
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
18.03.2015, 09:10  [ТС] 2
Все правильно, Robert Custer не обманул. Недавно прочитал в книге М. Руссиновича "Внутреннее устройство Windows" (книга 1, стр. 424):
EPROCESS-структура и основная часть связанных с ней структур данных на-
ходятся в адресном пространстве системы. Единственным исключением является
блок переменных окружения процесса — process environment block (PEB), — кото-
рый находится в адресном пространстве процесса (в нем содержится информация,
доступная коду, выполняемому в режиме пользователя).
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.03.2015, 09:31 3
Цитата Сообщение от rao Посмотреть сообщение
В книжке Robert Custer "WinDbg. From A to Z!" на 26 странице изображена вот такая схема: (см. сложение). На ней структуры PEB и TEB размещены над чертой, разделяющей user- и kernel-режимы (в области адресного пространства процесса).
Все верно, PEB и TEB - это юзермодные структуры.
Список модулей процесса, хранящийся в PEB, тоже размещается в user mode.

Цитата Сообщение от rao Посмотреть сообщение
Для получения указателя PEB используется функция NtQueryInformationProcess. которая, судя по префиксу "Nt" должна вызываться из режима ядра.
На самом деле префикс еще ни о чем не говорит.
В системе есть два набора Nt/Zw-функций, один пользовательский, в ntdll.dll,
для вызова обычными программами (не драйверами), второй ядерный, причем в
первом случае Nt- и Zw-функции - одно и то же, во втором - нет (разница в
проверках безопасности).

Цитата Сообщение от rao Посмотреть сообщение
ВОПРОС(ы): как функция ядра может работать с "пользовательской" памятью
Также, как обычно.

Цитата Сообщение от rao Посмотреть сообщение
А как же возможные страничные ошибки на высоком IRQL?
Или не любая функция в режиме ядра вызывается с повышением IRQL до уровня DPC/dispatch?
Большинство "нормальных" драйверных функций и калбэков работают на PASSIVE_LEVEL и
APC_LEVEL, где страничные сбои не страшны. В других случаях драйвер может залочить
нужную память, отобразить ее в в системный диапазон адресов и обращаться к ней
на любом IRQL и в контексте любого процесса...
1
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
18.03.2015, 19:12  [ТС] 4
Подзапутался немного.
Возьмем к примеру функцию SetTimer. Лежит она в User32.dll

Ищем WinDbg'ом:
Assembler
1
2
3
lkd> x user32!*SetTimer*
00000000`777e6930 USER32!ZwUserSetTimer = <no type information>
00000000`777e6930 USER32!NtUserSetTimer = <no type information>
Нету!! Как так? В winuser.h она объявлена как:
C
1
2
3
4
5
WINUSERAPI UINT_PTR WINAPI SetTimer(
    __in_opt HWND hWnd,
    __in UINT_PTR nIDEvent,
    __in UINT uElapse,
    __in_opt TIMERPROC lpTimerFunc);
т.е. без всяких префиксов, а вызывается совсем другое имя. Где и кем осуществляется это перенаправление?

2) И еще: Руссинович о префиксе Zw пишет:
Зеркальная точка входа для системных служб (имена которых начинаются
с Nt), которая устанавливает предыдущий режим доступа к ядру, что ис-
ключает проверку параметров, поскольку системные службы Nt проверяют
параметры только в том случае, если предыдущий режим доступа был
пользовательским
находим в ntdll:
Assembler
1
2
3
4
5
6
lkd> x ntdll!*SetTimer*
...
00000000`77a418d0 ntdll!NtSetTimer = <no type information>
...
00000000`77a418d0 ntdll!ZwSetTimer = <no type information>
...
адреса одинаковые. (т.е. это одна и та же функция получается что ли?)

заглядываем в содержимое (просто из любопытства):
Assembler
1
2
3
4
5
6
lkd> u ntdll!ZwSetTimer
ntdll!NtSetTimer:
00000000`77a418d0 4c8bd1          mov     r10,rcx
00000000`77a418d3 b85f000000      mov     eax,5Fh
00000000`77a418d8 0f05            syscall
00000000`77a418da c3              ret
чего то никаких обещанных проверок параметров совсем не видать. Или они будут выполняться в вызванной системной службе?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.03.2015, 19:37 5
1) SetTimer - это exported name, а Nt(Zw)UserSetTimer - так называемое internal name.
При сборке dll можно указать (в DEF-файле, например), чтобы некоторая функция
имела в секции экспорта другое имя.

2)
Цитата Сообщение от rao Посмотреть сообщение
адреса одинаковые. (т.е. это одна и та же функция получается что ли?)
В режиме пользователя между Nt- и Zw-функциями нет никакой разницы,
каждая пара указывает на одну и ту же точку входа.

Цитата Сообщение от rao Посмотреть сообщение
чего то никаких обещанных проверок параметров совсем не видать. Или они будут выполняться в вызванной системной службе?
Да. syscall/sysenter(/int0x2e на старых системах) вызовет переход в ядро, на
специальный обработчик, там он найдет адрес функции по индексу 0x5f и
вызовет его. Вот там и будут все необходимые проверки и вообще вся
настоящая работа SetTimer.
1
18.03.2015, 19:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2015, 19:37
Помогаю со студенческими работами здесь

На какой оси находится 0 градусов в 2D?
Здравствуйте, хотелось бы узнать,а какой оси находится 0 градусов в 2D? Грубо говоря, ноль на верху...

В какой НФ находится база данных?
в какой НФ находится база данных?

Определить в какой четвертях находится точки A и B
Привет народ! Я у вас тут совсем недавно))) Я учусь в колледже на 2 курсе на программиста (1-й...

Определить, в какой четверти находится точка
Даны два целых числа - координаты точки в декартовой системе координат. Определить, в какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru