Проекты    

"Hanger" - Информация защищённого режима

   НЕ ДЛЯ КОММЕРЧЕСКОГО ИСПОЛЬЗОВАНИЯ
Это свободно распространяемая программа. Распространяется "как есть". Автор не обеспечивает Вам никакой гарантии на эту программу. Автор не несёт никакой ответственности за повреждения (ущерб), к которым может привести использование этой программы. Вы используете эту программу на свой страх и риск. Вы можете делать сколько угодно копий этой программы и передавать их своим друзьям, знакомым и незнакомым людям, не взимая с них никакой платы за копию программы.
    Все упомянутые в этом документе торговые марки использованы только для идентификации и могут быть товарными знаками их соответствующих правообладателей.
ОБЩЕЕ ОПИСАНИЕ И СИСТЕМНЫЕ ТРЕБОВАНИЯ
    Вашему вниманию предлагается программа "Hanger", которая выдаёт информацию о защищённом режиме и позволяет её изменять. Программа была разработана в IDE Borland C++ 5.01. Основной язык - C, некоторые процедуры написаны на Ассемблере. Программа требует Windows 3.1/95/98 на процессоре выше 386 и немножко оперативной памяти. Эта 16-битная программа использует только системные модули: KERNEL, USER, GDI и CTL3DV2. Программа НЕ БУДЕТ РАБОТАТЬ в Windows NT и Windows-эмуляторе OS/2, т.к. в этих операционных системах нет той "дырки", на которой основана работа моей программы.
ОПИСАНИЕ ПРИМЕНЕНИЯ
    Программа может быть использована при отладке программ, для изучения архитектуры микропроцессоров Intel и просто так - без цели.
    Программа выполняет следующие функции:
ПРИНЦИП РАБОТЫ И ФУНКЦИОНАЛЬНЫЕ ОГРАНИЧЕНИЯ
    Инструкции процессора SGDT и SIDT не являются привилегированными. Выполнив их, можно узнать линейные базовые адреса и пределы этих дескрипторных таблиц. Затем с помощью сервиса DPMI создаются дескрипторы сегментов с этими адресами и пределами, доступные с низшего уровня привилегий (кольцо 3). Особенностью Microsoft Windows (но не NT!!!) является то, что дескрипторные таблицы расположены на страницах памяти, доступных с уровня пользователя (т.е. защита на уровне страниц для дескрипторных таблиц не используется). Таким образом организуется доступ к GDT и IDT. После этого программа, в случае необходимости, самостоятельно создаёт шлюзы вызова и переходит в кольцо 0 для выполнения некоторых процедур.
    Программа самостоятельно находит все LDT и TSS и предоставляет возможность интерпретации их содержимого в удобном для пользователя виде. Программа предполагает, что LDT и TSS могут находиться только в GDT, поэтому дескрипторы этих объектов в LDT и IDT игнорируются (они там не могут появиться и не появятся, если Вы в процессе экспериментов с программой их там не создадите). Программа может работать только в системе, в которой GDT содержит не более 500 дескрипторов LDT и не более 500 дескрипторов TSS. Если это правило не выполняется, то поведение программы непредсказуемо.
    Программа выводит содержимое только основных регистров, которые гарантированно присутствуют в любом процессоре выше 386, т.к. процедура анализа поколения процессора и его возможностей в этой версии не реализована. Программа не позволяет Вам изменять содержимое системных регистров процессора. Дело в том, что очень сложно придумать такие новые значения регистров, чтобы машина не "повесилась". Хотя программа называется "Hanger", всё же "повесить" машину не является её основной целью (Windows сделает это без Вашего участия).
    В этой версии программы нет своих обработчиков исключений процессора, поэтому чуть что не так - вылетает либо программа, либо Windows. А именно: при попытке обратиться к неприсутствующим страницам памяти, Windows иногда отказывается подгружать их с диска и прерывает программу по страничному нарушению. Хотя в программе реализована возможность доступа к памяти через процедуру в нулевом кольце привилегий, прочитать память по старшим линейным адресам пока не удаётся (там находится блок страниц с уровнем привилегий супервизора).
    Эта версия программы не работает с элементами уровня страничного преобразования.
КАК РАБОТАТЬ С ПРОГРАММОЙ
    Прежде всего - о ключах запуска. Программа имеет две опции настроек: Картинка окна программы     При нормальном запуске программы без ключей сразу же открываются окошки, содержащие GDT, IDT и регистры процессора. При этом в меню View заносятся все найденные TSS и LDT, так что Вы можете открыть окошко с соответствующей структурой. Вы можете просмотреть также все сегменты, дескрипторы которых содержатся в GDT или LDT. Для этого надо выбрать команду меню View/Selected segment, при этом сегмент, дескриптор которого выделен в данный момент, открывается в окошке для просмотра в шестнадцатеричном виде. Если в дескрипторе выставлен бит гранулярности (предел выражен в 4К-страницах), то в окне этого сегмента после значения предела стоит буква "G". Для больших сегментов выводятся сначала только 8192 строки дампа памяти (0х20000 байт). Чтобы посмотреть другой кусок сегмента, надо изменить базовое смещение в поле "Memory dump from ofs".
    Если Вы решитесь что-нибудь изменить, то для этого надо будет всего лишь два раза щёлкнуть мышкой по изменяемому элементу. Для дескрипторной таблицы изменяемым элементом является дескриптор (64-битное число). Для TSS - поле соответствующего регистра (16/32-битное число). Для дампа памяти - строка из шестнадцати 8-битных чисел. Все числа вводятся в шестнадцатеричном виде. Встретив неверный знак, программа его игнорирует, не выдавая никаких предупреждений.
    Хотя программа не предназначена для работы в DOS, тем не менее, вместо стандартной заглушки "This program can not run in DOS mode" выполняется коротенькая процедурка, выводящая на экран содержание GDT. Чтобы она сработала, надо, во-первых, чтобы процессор находился в защищённом режиме (драйвер расширенной памяти (EMM, QEMM, ...) переводит процессор в защищённый режим, так что чаще всего это условие выполняется), вторым условием является наличие DPMI-host версии не ниже 0.9. DPMI-host в памяти сам по себе не появляется, его надо загрузить (например Quarterdeck DPMI host, Borland DOS extender, ...)
    Горячие клавиши:

СКАЧАТЬ: hanger.zip (19,7 Kбайт)

Последние изменения 08.03.1999.