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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Доку бы хорошо, а еще: кто из корифеев знает? 19.02.02 04:12  Число просмотров: 917
Автор: Zef <Alloo Zef> Статус: Elderman
Отредактировано 19.02.02 04:14  Количество правок: 1
<"чистая" ссылка>
а то вчера весь Инет прогуглил, а вразумительной доки по Int 2F не нашел. А вообще проблема в том, что все известные мне способы обращения к CD в 95-й кривы: либо пиши 16бит дллку, к-рая будет работать через Int 2F, а к ней еще один файл - 32/16 thunk и через него из 32бит - проги обращайся (стандартный путь, предлагаемый МД), либо делай "незаконный" прыжок в Ring0 и оттуда...
Но но для прыжка может не найтись свободного дескриптора (см выше).
А вот, как чтобы одним файлом, и всегда срабатывало?
Есть правда мысль: скопировать Таблицу Дескрипторов на новое место, затем добавить к ней Дескриптор Шлюза, а потом подменить указатель на системную таблицу своим. Только как? И сработает ли? Кто из корифеев подскажет?
<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: 0 s   Design: Vadim Derkach