Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];

Вниз

Прерывания в Delphi   Найти похожие ветки 

 
SDW_syscoder   (2003-05-12 01:33) [0]

Можно ли в Delphi, в ассемблерных вставках использовать прерывания (например, int 21) и где про это прочитать.


 
Ihor Osov'yak   (2003-05-12 01:54) [1]

Нет, нельзя.


 
NightAngel   (2003-05-12 04:50) [2]

Можно.
Рассмотрим некую Win32-программу. Как известно, программа эта вызывает Kernel, а Kernel уже вызывает ring0.
Под Win9X VMM/VWIN32 реализует специальные сервисы для Kernelа. Вызываются они так:
kernel@int21:
015F:BFF712B9 push ecx
push eax
push 002A0010 ; <-- service-number
call kernel@ord0
ret
kernel@ord0:
015F:BFF713D4 mov eax, [esp+4]
pop dword ptr [esp]
call far cs:[BFFC9734]
...
015F:BFF79734 dd 000003C8h ; offset
dw 003Bh ; selector
...
003B:03C8 int 30h
...

где service-number -- номер сервиса, например 0x002A0010 для INT 21, 0x002A0029 для INT 31, и так далее. С номерами VxD-callов эти сервисы не имеют ничего общего. Найти полный список соответствий всяких номеров именам сервисов можно в Питреке. Под WinNT ноль вызывается из кернела посредством INT 2E. В Win9x в VMMе существует NTKERN.VXD, который реализует NT-евые сервисы. Называются они что-то типа ntoskrnl!DbkBreakPoint и вызываются так же -- через INT 2E. И у этого Int-а DPL=3, то есть его можно вызывать прямо из PE файла. Более того, в обработчике нет никаких проверок - откуда пришел вызов. INT 2E активно используется при загрузке Win9x. Можно вызывать INT 2E из PE файлов одним из следующих способов:
1.
mov eax, service-number
lea edx, stk
int 2Eh
stk: dd param1
dd param2
dd param3
...
2.
...
push param3
push param2
push param1
mov edx, esp
mov eax, service-number
int 2Eh
add esp, 4*n
При вызове INT 2E в EAX должен быть номер сервиса, а в EDX указатель на кадр стэка. Перед тем как вызвать соответствующую функцию, обработчик Int-а копирует данные из EDX в свой стэк.


 
Morfein   (2003-05-12 10:53) [3]

>>NightAngel:
А в каком кольце защиты работает KERNEL32.DLL?


 
Digitman   (2003-05-12 11:37) [4]


> Morfein


вопрос некорректен.

ф-ции этой библиотеки работают в том кольце привелегий, в котором работает процесс, вызывающий эти ф-ции

Но ! В моменты, когда внутри вызванных ф-ций производятся обращения к программным шлюзам (те самые IntXX), возможна смена тек.кольца защиты (как в случае с Int2E под NT). Обработчик шлюзового прерывания будет работать с тем уровнем привелений, который задан соответствующим дескриптором в IDT. А дескрипторы в IDT инициализируются на этапе старта ОС. И инициализируются они отнюдь не в ходе инициализации библ-ки kernel32. Последняя - лишь оболочка для использования прикладными задачами "внутренних" ф-ций ядра, в т.ч. и ф-ций, предусмотренных "телами" программных шлюзов.
На то и шлюзы существуют !


 
Ihor Osov'yak   (2003-05-12 13:08) [5]

Мой столь категоричный ответ обьяснялся тем, что во первых, вызов IntXX есть платформо-зависимый. Во вторых, очень трудно придумать прикладную задачу на делфи, где эту технику действительно оправдано использовать. В третьих, по постановке вопроса я сделал предположение, что вопрошающему еще рано погружаться в такие дебри. Что ж, я возможно и был не прав. Прошу извинения.

Зы- очень подробно о технике работы с Int2E написано в Sven B. Schreiber, Undocumented Windows 2000 secrets (издан также русский перевод в 2002, Свен Шрайберг, Недоументированные возможности Windows 2000)


 
Игорь Шевченко   (2003-05-12 13:34) [6]

> Morfein © (12.05.03 10:53)
> >>NightAngel:

> А в каком кольце защиты работает KERNEL32.DLL?


В третьем


 
Digitman   (2003-05-12 15:51) [7]


> Игорь Шевченко


Ну почему обязательно - в третьем ?
Тот же Маздай, указанный автором в списке ОС, интересующих его в рамках вопроса, позволяет без особых проблем получить 0-й уровень привелегий. После получения оного ничто не мешает точно так же вызывать ф-ции kernel32, и при этом их код, получив управление, начнет свое выполнение c CPL = 0 )


 
hunter   (2003-05-17 23:11) [8]

может кто вышлет примерчик как организовать доступ к диску?


 
Игорь Шевченко   (2003-05-19 11:56) [9]

Digitman © (12.05.03 15:51)

И что от этого изменится ? AFAIK, функции Kernel32 разработаны с учетом работы в третьем кольце...


 
Digitman   (2003-05-19 13:39) [10]


> Игорь Шевченко


да ничего не изменится)... просто как-то уж больно странным показался твой пост про "в третьем"... я и уточнил - в каком кольце вызвали ф-цию, в таком она и выполняется (если не учитывать всякие проходы через шлюзы в ходе исполнения ей неких вложенных системных вызовов)


 
Игорь Шевченко   (2003-05-20 10:23) [11]

Digitman © (19.05.03 13:39)

Сергей, мой пост "в третьем" подразумевал штатную работу kernel32.dll. Так как это библиотека пользователського режима то и работать ей штатно в третьем кольце защиты, не так ли ? А про получение привилегий и вызова функций это ты прав.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.01 c
11-100655
oleg_poligon
2002-11-24 11:47
2003.07.31
Работа с KOLSocket


14-100883
Nemra
2003-07-15 17:27
2003.07.31
Читаю из файла


1-100769
Aleksandr
2003-07-15 15:52
2003.07.31
Допустимо ли такое обращение со строками в DLL?


14-100905
Till
2003-07-10 08:05
2003.07.31
HARDCORE DELPHI


1-100697
cjiohobaji
2003-07-18 13:31
2003.07.31
path





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский