Автор
|
Тема: Интересный код
|
Emerald |
опубликован 08-11-2001 21:33 MSK
Рылся я тут в исходнике Чернобыля. И вот что нашел: push eax; sidt [esp-02h]; Get IDT Base Address pop ebx; add ebx, HookExceptionNumber*08h+04h;ZF=0 cli mov ebp, [ebx] ; Get Exception Base mov bp, [ebx-04h] ; Entry Point lea esi, MyExceptionHook-@1[ecx] push esi mov [ebx-04h], si ; shr esi, 16 ; Modify Exception mov [ebx+02h], si ; Entry Point Address pop esi; ************************************* ; * Generate Exception to Get Ring0 * ; ************************************* int HookExceptionNumber ; GenerateException ReturnAddressOfEndException = $ И у меня вопрос: что за команда процессора SIDT, и почему так просто получить доступ к таблице векторов прерываний? Разве она не защищается виртуальной машиной во время выполнения программы? это камень в огород тех, кто ещё уважает Windows... 8)
|
x
|
опубликован 09-11-2001 05:06 MSK
гм весьма прикольновообще формат ловушки struct trar { WORD ofs_lo; WORD selector; BYTE reserved; BYTE attrib; WORD ofs_hi }; и того 8 байт SIDT=store Interrupt Descriptor table SIDT вываливает нам 32битный линейный адрес в ФИЗИЧЕСКОЙ памяти + размер IDT этот код вообще не может работать потому что 0.SIDT = any ring; LIDT=ring0 1.IDT может и не иметь дескриптора 2.даже если она его имеет как его узнать 3.если узнал кто тебе даст доступ к нему? 4.ладно дали=а как узнать физический адрес и GDT своего кода? 5.можно конечно использовать и LDT но тогда это должен будет уже шлюз задачи а не прерывание |
server_mouse
|
опубликован 09-11-2001 11:07 MSK
Я тоже как-то рался в исходах чиха. Не гарантирую что у меня точно такой же код был, но принцип тот же. Код РАБОТАЕТ на 9x. Проверял из SoftIce.Не будем забывать что код специализирован конкретно для 9х при ring3. Поэтому: 0. нормально получаем адрес IDT >1.IDT может и не иметь дескриптора Не совсем понял что ты имеешь в виду. В защищённом режиме IDTR всегда загружен правильным адресом. 2.----- 3.А вот доступ как раз-то и есть. :) 4.Да, к GDT так просто не подкатишь.... Я во всём НЕ разобрался, но как я понял здесь используется та фенька, что процессу для чтения доступно все 4G, и эти же 4G тут же юзает и винда, т.е. процесс не загружается в полностью отдельном адресном пространстве в 4Г, а подгружается в пространство самой винды. И менять данные самой винды и др. процессов тебе мешает тока доступ. Используя это феньку я напрямую из ring3 читал содержимое биос. А ведь по идее такое невозможно. Ведь если следовать идеологии ProtectMode мой процесс получает 4G абсолютно левых. Никаких биосов. |
server_mouse
|
опубликован 09-11-2001 12:17 MSK
А вот ещё одна интересная мысль... Как работают try{}? Ведь что бы словить exception надо изменить IDT, что бы нужный exception указывал на нужный обработчик... |
x
|
опубликован 10-11-2001 02:21 MSK
насчет отсутствия дескриптора то что память есть=не означает что она используетсяIDT может быть в области на которую дескриптор просто не создан маразм ситуации в том што КАЖДЫЙ ПРОЦЕСС ИМЕЕТ БАЗУ 40000 (ну почти каждый) И ЯСНО ЧТО ТУТ ТЫ НЕ ПОЛУЧИШЬ РЕАЛЬНЫЙ АДРЕС ИЛИ АДРЕС В GDT тут явно используется LDT текущего процесса а это значит что exception это есть шлюз задачи и может работать только в ее адресном пространстве |
devilray
|
опубликован 15-11-2001 10:01 MSK
да вы че !!! Это вам не unix, где у каждого процесса своя LDT. А насчет адреса 400000h - просто у каждого процесса своя запись в каталоге страниц памяти для данного адреса. |
Sourcer
|
опубликован 15-11-2001 10:35 MSK
когдато рылся в awdflash и саме интересное, что порты контора биосом скрыты в памете... Во извращенци... Он видимо из FFFF:AAAA делает физ-адресс |
Emerald
|
опубликован 15-11-2001 13:58 MSK
2ServerMouse: там какая-то другая вещь: как объяснить простоту ON ERROR GOTO ... в Visual Basic?? |
server_mouse
|
опубликован 15-11-2001 14:40 MSK
2Emerald: Ты насчёт try-блоков? Хм. Не знаю, как ещё можно отловить что-то типа mov [00000000h],0FFh???? |