информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
На то и 2000, чтобы не прыгали в r0 14.02.02 10:51  Число просмотров: 902
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
В правильно написанной многопользовательской операционке gdt не то что на запись, но и на чтение не должна быть доступна (за исключением штатной загрузки селекторов аппаратным образом). Если нет дырок в софте, уже работающем под r0, то шансов нет.
<programming>
Это под мд98. А в 2000 есть аналогичный способ прыгнуть в r0? 14.02.02 06:37  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
bool CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize)
{

struct GDT_DESCRIPTOR *pGDTDescriptor;
struct GDTR gdtr;
WORD CallgateAddr[3];
WORD wGDTIndex = 1;
_asm Sgdt [gdtr]
// пропускаем "пустые" дескрипторы
pGDTDescriptor = (struct GDT_DESCRIPTOR *)(gdtr.dwGDTBase + 8);
// ищем свободный GDT дескриптор
for (wGDTIndex = 1; wGDTIndex < (gdtr.wGDTLimit >> 3); wGDTIndex++)
{
if (pGDTDescriptor->Type == 0 &&
pGDTDescriptor->System == 0 &&
pGDTDescriptor->DPL == 0 &&
pGDTDescriptor->Present == 0)
{
// Нашли! Теперь преобразуем его в шлюз вызова
struct CALLGATE_DESCRIPTOR *pCallgate;
pCallgate = (struct CALLGATE_DESCRIPTOR *) pGDTDescriptor;
pCallgate->Offset_0_15 = LOWORD(pvRing0FuncAddr);
pCallgate->Selector = 0x28;
pCallgate->ParamCount = 0;
pCallgate->Unused = 0;
pCallgate->Type = 0xc;
pCallgate->System = 0;
pCallgate->DPL = 3;
pCallgate->Present = 1;
pCallgate->Offset_16_31 = HIWORD(pvRing0FuncAddr);
// Вычисляем адрес вызова шлюза
CallgateAddr[0] = 0x0;
CallgateAddr[1] = 0x0;
CallgateAddr[2] = (wGDTIndex << 3) | 3;
// вызываем RING 0.

_asm Mov DX, [wPortAddr]
_asm Mov EBX, [pdwPortVal]
_asm Mov CL, [bSize]
_asm Call FWORD PTR [CallgateAddr]

// ну и далее убираем за собой
memset(pGDTDescriptor, 0, 8
return true;
}
// если не нашли, переходим к след.
pGDTDescriptor++;
}
// нет свободных!
return false;
}
Это под мд98. А в 2000 есть аналогичный способ прыгнуть в r0? 14.02.02 14:31  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> pCallgate->Selector = 0x28;

вот тут надо быть очень осторожным
я даже так делал - искал несколько дыр в GDT и делал свои дескрипторы (вернее алиасы) для CS и SS с PL=0

> _asm Call FWORD PTR [CallgateAddr]

не забудь что для SS PL должен совпадать с PL CS
здесь есть такие решения:
1) все пройти на IF=0
2) дать свой SS но помнить что при аппаратном прерывании на PL=0 SS не перегружается автоматически
3) работать с SS_0 текущего TSS (для виндов он единственный вроде)
с моей практической точки зрения 2 и 3 варианты дают редкие/странные глюки под виндой

> // нет свободных!

а вот эту интереснейшая ситуация - сам видел многократно - разные версии чикаги дают разный начальный и по-разному меняют размер GDT более того возможны ситуации когда в системе не одна GDT и кстати ситуация теоретически разрешима бекапом каких-то позиций в GDT (например СВОИХ!!! CS/SS)

по-поводу NT/2000 - этот номер не пройдет по защите страниц и вообще никакой (проверено) такой номер не пройдет кроме очень билд-зависимых срывов стека (например при вызове int 2e)
я делал так: патчил NTLDR
но тебе же надо в прогу
[Win32] Задача наша такая: 15.02.02 04:30  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
собственно, мне нужно организовать низкоуровневый доступ к диску не перезагружая систему и не требуя прав админа
[Win32] Экстренный вопрос: 15.02.02 06:02  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
нужно сотворить нечто подобное
прямо из 32разр. кода (не создавая и не загружая 16 dll)
les di, lpCallStruct ; Real mode call structure
int 31h ; Call DPMI
Вопрос: пойдет ли оттуда int и как сделать так, чтобы lpCallStruct загрузился в база:смещение виде?
можно, конечно базу грузить прямо в ES, а смещение в di, но как их получить из 32-разр. адреса?
[Win32] Экстренный вопрос: 15.02.02 10:39  
Автор: Chingachguk <Chingachguk> Статус: Member
Отредактировано 15.02.02 10:51  Количество правок: 2
<"чистая" ссылка>
> нужно сотворить нечто подобное
> прямо из 32разр. кода (не создавая и не загружая 16 dll)
> les di, lpCallStruct ; Real mode call structure
> int 31h ; Call DPMI
> Вопрос: пойдет ли оттуда int и как сделать так, чтобы
> lpCallStruct загрузился в база:смещение виде?
> можно, конечно базу грузить прямо в ES, а смещение в di, но
> как их получить из 32-разр. адреса?

У сервиса int 31h есть ф-ция - получить линейный адрес по селектору и наоборот(назад немного сложнее).

В досе CallStruc я в селектор кидал то, что DPMI засовывало в DS при переключении(lim=64K и т.д.), offset = обычный оффсет:

mov bl,16h ; Call int 16h
mov byte ptr CallDPMIS.RegEAX+1,0 ; reg ah=0h
lahf
and ah,0feh
mov bh,ah
mov cx,0
mov di,offset CallDPMIS
and edi,0ffffh
push ds
pop es
mov ax,0300h
int 31h
jnc @CallV86

Я думаю, из 32 надо кидать в DI обычный оффсет, селектор и так в порядке, DPMI(а точнее, винда) сама разберется. Ж)

ЗЫ А исчо есть апи такая - вызвать прерывание реального режима, так на дискетку "царапины" для защиты записывают. Я про int 25h/26h на 99.666% уверен, что можно.
[Win32] Так, уже теплее, но: 15.02.02 10:48  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
А как int 31h из 32-разрядной проги вызвать? При любой попытке я получаю "синяк" или вылетаю в WinIce (если он загружен)
[Win32] Так, уже теплее, но: 15.02.02 12:43  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> А как int 31h из 32-разрядной проги вызвать? При любой
> попытке я получаю "синяк" или вылетаю в WinIce (если он
> загружен)

это смотря какая прога
если win32 - не выйдет
если dos32 (екстендеры всякие включая самодельные) - сколько угодно и из-под любой винды (у win3.x были некоторые (небольшие) проблемы с DPMI)
сделай две проги и организуй обмен
[Win32] Войдет и выйдет, но: 15.02.02 13:03  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
[Win32] Че-то не понял, почему мою месягу обрезало? 18.02.02 05:15  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Я хотел сказать, что есть такая бяка - VWIN32_DIOC_DOS_INT25/26 в DeviceIoControl, но вот проблема: для ее работы нужен хендёл устройства, но в 95 его можно получить тока для файла, а что делать, если нужен диск?
[Win32] Все у Гейтса через Ж: 18.02.02 05:38  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Оказывется, чтобы получить хендл для доступа к дискам под 95 надо сделать так:
hDevice = CreateFile("\\\\.\\vwin32",...
[Win32] Опять не то! Помогите, загибаюсь!!! 18.02.02 14:26  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Короче, нужно читать на прямую с сидюка под МД95/98, а еще лучше сделать аналог НТёвой IOCTL_CDROM_RAW_READ, чтобы все сидело в одном .ехе-файле и ни каких драйверов или 16бит дллок не писать!
[Win32] Опять не то! Помогите, загибаюсь!!! 18.02.02 17:11  
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Короче, нужно читать на прямую с сидюка под МД95/98, а еще
> лучше сделать аналог НТёвой IOCTL_CDROM_RAW_READ, чтобы все
> сидело в одном .ехе-файле и ни каких драйверов или 16бит
> дллок не писать!

ну и пиши
чем тебе помочь-то конкретно?
может тебе доку по MSCDEX кинуть?
[Win32] Доку бы хорошо, а еще: кто из корифеев знает? 19.02.02 04:12  
Автор: Zef <Alloo Zef> Статус: Elderman
Отредактировано 19.02.02 04:14  Количество правок: 1
<"чистая" ссылка>
а то вчера весь Инет прогуглил, а вразумительной доки по Int 2F не нашел. А вообще проблема в том, что все известные мне способы обращения к CD в 95-й кривы: либо пиши 16бит дллку, к-рая будет работать через Int 2F, а к ней еще один файл - 32/16 thunk и через него из 32бит - проги обращайся (стандартный путь, предлагаемый МД), либо делай "незаконный" прыжок в Ring0 и оттуда...
Но но для прыжка может не найтись свободного дескриптора (см выше).
А вот, как чтобы одним файлом, и всегда срабатывало?
Есть правда мысль: скопировать Таблицу Дескрипторов на новое место, затем добавить к ней Дескриптор Шлюза, а потом подменить указатель на системную таблицу своим. Только как? И сработает ли? Кто из корифеев подскажет?
[Win32] Так, уже теплее, но: 15.02.02 10:52  
Автор: Chingachguk <Chingachguk> Статус: Member
Отредактировано 15.02.02 10:54  Количество правок: 1
<"чистая" ссылка>
> А как int 31h из 32-разрядной проги вызвать? При любой
> попытке я получаю "синяк" или вылетаю в WinIce (если он
> загружен)

ЗЫ А исчо есть апи такая - вызвать прерывание реального режима, так на дискетку "царапины" для защиты записывают. Я про int 25h/26h на 99.666%
уверен. Так парень один делал в конторе по защите данных. Из си плюса-плюса.
На то и 2000, чтобы не прыгали в r0 14.02.02 10:51  
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
В правильно написанной многопользовательской операционке gdt не то что на запись, но и на чтение не должна быть доступна (за исключением штатной загрузки селекторов аппаратным образом). Если нет дырок в софте, уже работающем под r0, то шансов нет.
На то и 2000, чтобы не прыгали в r0 14.02.02 16:55  
Автор: Sandy <Alexander Stepanov> Статус: Elderman
Отредактировано 14.02.02 16:56  Количество правок: 1
<"чистая" ссылка>
> В правильно написанной многопользовательской операционке
> gdt не то что на запись, но и на чтение не должна быть
> доступна (за исключением штатной загрузки селекторов
> аппаратным образом). Если нет дырок в софте, уже работающем
> под r0, то шансов нет.

Не совсем понятно в части "gdt не то что на запись, но и на чтение не должна быть доступна". Недоступна кому? Если пользовательским аппликациям - то это так и есть. А если самому ядру - каким образом готовить дескрипторы для переключения контекста при передаче кванта процессорного времени создаваемому процессу? Здесь как ни крути, а планировщик ДОЛЖЕН иметь возможность и читать и писать в GDT.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach