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

Вниз

Интерфейс защищенного режима в Дельфи   Найти похожие ветки 

 
IronMan   (2002-08-10 18:18) [0]

Уважаемые мастера! Помогите разобраться в следующей проблеме. Есть программа на Дельфи со своими сегментами кода и данных в памяти. Значения в сегментных регистрах CS и DS - селекторы соответственно для кода и данных, которые описаны в таблице LDT ( Local Descriptor Table). Требуется из этой таблицы получить значения дескрипторов для данных селекторов средствами Дельфи и Windows API. В программе допускаются ассемблерные вставки и вообще все что допускается в Дельфи. Сервер DPMI допускает подобный сервис но помоему Дельфи его не поддерживает поскольку он нужен был только для старых программ. Возможно реализовать это в Borland Pascal for Windows, где DPMI присутствует но это уже Win Old API для программ под Windows 3.1 (если кто еще помнит такую) и я не в курсе не отказалась ли Microsoft от этого API в своих новых версиях Windows - в любом случае это не то решение проблемы которое меня бы устроило. Десрипторы нужны по разным причинам но дескриптор кода нужен для того чтобы с его помощьй создать алиасный дескриптор для кода (с параметрами как для данных и с разрешением на запись).
Заранее выражаю признательность за ответы.


 
Cobalt   (2002-08-11 19:12) [1]

Попробуй загрузить таблицу LDT (LLDT, кажется) если Дженерал Протект Еррор не схватишь, то тогда ищи, как новые сегменты/селекторы добавлять.


 
Serious Sam   (2002-08-11 21:32) [2]

На sources.ru лежал исходничек -- пример проникновения в ring0 для Windows 9x. Правда, он вторичный. Некоторое время назад можно было найти оригинальную статью через поисковики.......
Проще считать, что нет такого ^^^ интерфейса, и по правилам игры, быть не может.......


 
Digitman   (2002-08-12 09:13) [3]

Этот код поможет тебе "погулять" по системным таблицам Маздая.
Код - для изучения.
Модификация элементов таблиц - по образу и подобию.
Не забывай, что в NT/XP/Винтукее это работать не будет !


const
// mask of TI-bit in selector
TI_GDT = 0;
TI_LDT = 4;
SYSDESC_ACCESS_TYPE_MASK = $0F;

type
TSysTableKind = (tkGDT, tkLDT, tkIDT);
TSysSegDescType = ( stUnused,
stTSS,
stLDT,
stTSS_BUSY,
stGATE_16,
stTASKGATE,
stINTRPT_16,
stEXCEPT_16,
stWRONG_TYPE,
stTSS_32,
stRESERVED1,
TSS_32_BUSY,
stGATE_32,
stRESERVED2,
stINTRPT_32,
stTRAP_32
);

TBaseLo = packed record
LoWord: Word;
LoByteHiWord: byte;
end;
PBaseLo = ^TBaseLo;

TSegmentDescriptor = packed record
LimitLo: Word;
BaseLo: TBaseLo;
ARPL: byte;
LimitHi: byte;
BaseHi: byte;
end;
PSegmentDescriptor = ^TSegmentDescriptor;

TLDTEntry = TSegmentDescriptor;
TGDTEntry = TSegmentDescriptor;
PLDTEntry = PSegmentDescriptor;
PGDTEntry = PSegmentDescriptor;

TIDTEntry = packed record
OffsetLo: Word;
Selector: Word;
Params: Byte;
Access: Byte;
OffsetHi: Word;
end;
PIDTEntry = ^TIDTEntry;

TSegmentInfo = packed record
Limit: Word;
Base: DWord;
end;
PSegmentInfo = ^TSegmentInfo;

function GetSegmentInfo(Selector: Word): PSegmentInfo;
function GetSegmentDesc(Selector: Word): PSegmentDescriptor;
function GetInterruptDesc(const InterruptNumber: Byte): PIDTEntry;
function GetSysTableCapacity(const SysTable: TSysTableKind): Integer;

implementation

var
GDTInfo, LDTInfo, IDTInfo: TSegmentInfo;
LDTSelector: Word;

// чтение инф-ции о местоположении и размере GDT, LDT
procedure ReadWin9xSysTableInfo;
asm
sgdt [GDTInfo]
sidt [IDTInfo]
sldt eax
mov [LDTSelector], ax
and ax, $FFF8
add eax, [GDTInfo.Base]
mov dl, [eax + TGDTEntry.BaseLo.LoByteHiWord]
mov dh, [eax + TGDTEntry.BaseHi]
shl edx, 16
mov dx, [eax + TGDTEntry.BaseLo.LoWord]
mov [LDTInfo.Base], edx
mov dx, [eax + TGDTEntry.LimitLo]
mov [LDTInfo.Limit], dx
end;

//информация о сегменте (баз.адрес, предел)
//Selector - значение селектора интересующего сегмента

function GetSegmentInfo(Selector: Word): PSegmentInfo;
var
DescAddr: DWord;
begin
Result := nil;
DescAddr := Selector and $FFF8;
case Selector and TI_LDT of
TI_GDT:
if DescAddr < GDTInfo.Limit then begin
DescAddr := DescAddr + GDTInfo.Base;
New(Result);
with Result^, PGDTEntry(DescAddr)^ do begin
Limit := LimitLo;
Base := (BaseHi shl 8 + BaseLo.LoByteHiWord) shl 16 + BaseLo.LoWord;
end;
end;
TI_LDT:
if DescAddr < LDTInfo.Limit then begin
DescAddr := DescAddr + LDTInfo.Base;
New(Result);
with Result^, PLDTEntry(DescAddr)^ do begin
Limit := LimitLo;
Base := (BaseHi shl 8 + BaseLo.LoByteHiWord) shl 16 + BaseLo.LoWord;
end;
end;
end;
end;

//получение дескриптора интересующего сегмента
//Selector - значение селектора интересующего сегмента

function GetSegmentDesc(Selector: Word): PSegmentDescriptor;
begin
Result := nil;
case Selector and TI_LDT of
TI_GDT:
begin
New(Result);
CopyMemory(Result, PGDTEntry((Selector and $FFF8) + GDTInfo.Base), SizeOf(TGDTEntry));
end;
TI_LDT:
begin
New(Result);
CopyMemory(Result, PLDTEntry((Selector and $FFF8) + LDTInfo.Base), SizeOf(TLDTEntry));
end;
end;
end;

//чтение дескриптора шлюза/прерывания
//InterruptNumber - номер шлюза/прерывания

function GetInterruptDesc(const InterruptNumber: Byte): PIDTEntry;
begin
Result := nil;
if InterruptNumber <= (IDTInfo.Limit + 1) shr 3 then begin
New(Result);
CopyMemory(Result, PIDTEntry(InterruptNumber shl 3 + IDTInfo.Base), SizeOf(TIDTEntry));
end;
end;

//чтение инф-ции о размере системной таблицы
//SysTable - идентификатор таблицы

function GetSysTableCapacity(const SysTable: TSysTableKind): Integer;
begin
case SysTable of
tkGDT: Result := (GDTInfo.Limit + 1) shr 3;
tkLDT: Result := (LDTInfo.Limit + 1) shr 3;
tkIDT: Result := (IDTInfo.Limit + 1) shr 3;
else
Result := 0;
end;
end;


 
DiamondShark   (2002-08-12 11:32) [4]

Не поможет вам манипуляция с дескрипторами сегментов.

Несмотря на то, что в CS и DS загружены разные дескрипторы, эти сегменты отображены на одну и ту же физическую память. Сделано это для того, чтобы трактовать смещение в любом сегменте не как смещение, а как единое плоское адресное пространство кода-данных.
А защита доступа осуществляется на уровне страниц.

Читать и писать сегмент кода можно функциями ReadProcessMemory/WriteProcessMemory.
А исполняться будет даже код, помещенный в область данных.


 
Digitman   (2002-08-12 12:26) [5]

>DiamondShark

Почему не поможет-то ? Хотя бы в учебных целях "пощупать своими ручками" GDT/LDT/IDT очень даже занимательно и полезно ! Неужто писать свое мини-ядро для изучения возможностей CPU i80x86 в PM/VM ? Это глупо. А Маздай - пожалуйста : готовый "стенд" для изучения и экспериментов ...

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

Другой вопрос - надо ли лезть туда в практических целях ...



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

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

Наверх




Память: 0.47 MB
Время: 0.006 c
6-85622
Brand
2002-07-11 23:07
2002.09.26
ClientSocket, ServerSocket - несколько отправок


14-85705
murza
2002-08-26 15:26
2002.09.26
Почему вы пишете на Delphi?


1-85441
Yaro
2002-09-15 22:08
2002.09.26
Hook на вызов API-функций


14-85676
spROOT13
2002-09-01 16:14
2002.09.26
*.ha


1-85606
greenrul
2002-09-15 13:53
2002.09.26
Непрямоугольная форма и Регионы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский