WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Интересный код

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Интересный код
Emerald опубликован 08-11-2001 21:33 MSK   Click Here to See the Profile for Emerald   Click Here to Email Emerald  
Рылся я тут в исходнике Чернобыля. И вот что нашел:
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     Click Here to See the Profile for x  Click Here to Email x     
гм весьма прикольно

вообще формат ловушки

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     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Я тоже как-то рался в исходах чиха. Не гарантирую что у меня точно такой же код был, но принцип тот же.
Код РАБОТАЕТ на 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     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
А вот ещё одна интересная мысль...
Как работают try{}? Ведь что бы словить exception надо изменить IDT, что бы нужный exception указывал на нужный обработчик...
x опубликован 10-11-2001 02:21 MSK     Click Here to See the Profile for x  Click Here to Email x     
насчет отсутствия дескриптора
то что память есть=не означает что она используется

IDT может быть в области на которую дескриптор просто не создан

маразм ситуации в том што КАЖДЫЙ ПРОЦЕСС ИМЕЕТ БАЗУ 40000 (ну почти каждый)
И ЯСНО ЧТО ТУТ ТЫ НЕ ПОЛУЧИШЬ РЕАЛЬНЫЙ АДРЕС ИЛИ АДРЕС В GDT
тут явно используется LDT текущего процесса

а это значит что exception это есть шлюз задачи и может работать только в ее адресном пространстве

devilray опубликован 15-11-2001 10:01 MSK     Click Here to See the Profile for devilray  Click Here to Email devilray     
да вы че !!! Это вам не unix, где у каждого процесса своя LDT. А насчет адреса 400000h - просто у каждого процесса своя запись в каталоге страниц памяти для данного адреса.
Sourcer опубликован 15-11-2001 10:35 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
когдато рылся в awdflash
и саме интересное, что порты контора биосом скрыты в памете...
Во извращенци...
Он видимо из FFFF:AAAA делает физ-адресс
Emerald опубликован 15-11-2001 13:58 MSK     Click Here to See the Profile for Emerald  Click Here to Email Emerald     
2ServerMouse: там какая-то другая вещь: как объяснить простоту ON ERROR GOTO ... в Visual Basic??
server_mouse опубликован 15-11-2001 14:40 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
2Emerald: Ты насчёт try-блоков? Хм. Не знаю, как ещё можно отловить что-то типа
mov [00000000h],0FFh

????

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.