Форум: "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