Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ в Ring0 под Windows 9x, переводим "сишный" код на Паскаль 
:(
    Опции темы
Romikgy
Дата 27.6.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

                         unit Ring09x; 
interface 
uses 
  Windows; 
  function CallRing0(pvRing0FuncAddr: Pointer; ulECX: DWORD; pulEAX: pULONG; pulEDX: pULONG): integer; 
  procedure Ring0ReadMSR; cdecl; 
implementation 
type 
  TGDT_DESCRIPTOR = record 
    Limit_0_15  : Word; 
    Base_0_15   : Word; 
    Base_16_23  : Byte; 
    Type_System_DPL_Present     : Byte;
    Limit_16_19_Available_Reserved_D_B_Granularity : Byte;
    Base_24_31  : Byte; 
  end; 
  TCALLGATE_DESCRIPTOR = record 
    Offset_0_15 : Word; 
    Selector    : Word; 
    ParamCount_Unused       : byte;
    Type_System_DPL_Present     : byte;
    Offset_16_31: Word; 
  end; 
  CALLGATE_DESCRIPTOR=^TCALLGATE_DESCRIPTOR; 
  TGDTR = record 
    wGDTLimit : Word; 
    dwGDTBase : dWord;
  end; 
procedure Ring0ReadMSR; cdecl; 
asm 
  rdmsr 
  mov [ebx],eax 
  mov [edi],edx 
end; 
procedure Ring0WriteMSR; cdecl; 
asm 
  mov eax,[ebx] 
  mov edx,[edi] 
  wrmsr 
end; 
function CallRing0(pvRing0FuncAddr: Pointer; ulECX: DWORD; pulEAX: pULONG; pulEDX: pULONG): integer; 
var 
  pGDTDescriptor : ^TGDT_DESCRIPTOR; 
  pCallgate : CALLGATE_DESCRIPTOR; 
  gdtr: TGDTR; 
  wGDTIndex : Integer;     
  CallgateAddr : array [0..2] of Word; 
begin 
  with pGDTDescriptor^ do begin 
    Type1:=4; 
    System1:=1; 
    DPL:=2; 
    Present:=1; 
    Limit_16_19:=4; 
    Available:=1; 
    Reserved:=1; 
    D_B:=1; 
    Granularity:=1; 
  end; 
  with pCallgate^ do begin 
    ParamCount:=5; 
    Unused:=3; 
    Type1:=4; 
    System1:=1; 
    DPL:=2; 
    Present:=1; 
  end; 
  asm sgdt [gdtr] end;     
  pGDTDescriptor:=ptr(gdtr.dwGDTBase + 8);     
  for wGDTIndex:=1 to (gdtr.wGDTLimit div 8) do 
    begin     
      if (pGDTDescriptor^.Type_System_DPL_Present = 0)  then
        begin 
          pCallgate:=CALLGATE_DESCRIPTOR(pGDTDescriptor); 
          pCallgate^.Offset_0_15:=LoWord(pvRing0FuncAddr); 
          pCallgate^.Selector:=$28; 
          pCallgate^.ParamCount_Unused:=0;
          //pCallgate^.Unused:=0;
          pCallgate^.Type_System_DPL_Present:=$EC;

          pCallgate^.Offset_16_31:=HiWord(DWORD(pvRing0FuncAddr)); 
          CallgateAddr[0]:=0; 
          CallgateAddr[1]:=0;     
          CallgateAddr[2]:=(wGDTIndex shl 3) or 3;     
          asm     
            mov ebx, pulEAX     
            mov edi, pulEDX     
            mov ecx, ulECX     
            call dword ptr [CallgateAddr]     
          end;     
          ZeroMemory(pGDTDescriptor, 8);     
          CallRing0:=1; 
          exit; 
        end; 
      Inc(pGDTDescriptor); 
    end;     
    CallRing0:=0; 
end; 
end.

Так попробуй 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jungle
Дата 27.6.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Нет, не катит. Пишет "Access violation at address.... Read of address....".  
PM MAIL WWW   Вверх
Romikgy
Дата 27.6.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



jungle, после какой команды это? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SergeCpp
Дата 27.6.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Что касается RDTSC (MSR#10h), то он читается и без перехода в 0 кольцо...

В DOS-овской программе, работающей в Win9x-окне, правда не проходит... 

Это сообщение отредактировал(а) SergeCpp - 27.6.2006, 15:58
PM MAIL WWW ICQ   Вверх
jungle
Дата 27.6.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Romikgy
Цитата(Romikgy @  27.6.2006,  15:27 Найти цитируемый пост)
jungle, после какой команды это?  

Откуда ж мне знать? smile Я ж говорю, на тачке с Windows 98 нет свободного места для Delphi 6.0, чтобы продебажить код. Поэтому запустил скомпилированный EXE-файл и получил очередной облом. А почему структуры TGDT_DESCRIPTOR и TCALLGATE_DESCRIPTOR почиканы и не заполнены?  ИМХО инициализация большинства переменных обязательна. Сейчас припоминаю код из книжки «Программирование аппаратных средств под Windows», дык там тоже переменные инициализировались. Вечером сверюсь.

Цитата(SergeCpp @  27.6.2006,  15:50 Найти цитируемый пост)
Что касается RDTSC (MSR#0), то он читается и без перехода в 0 кольцо...  

Мне не нужна инструкция RDTSC, хотя и ее тоже можно сделать привилегированной через установку единственного бита CR-регистр процессора. TSC регистр взят в качестве совместимого как для всех AMD, так и Intel процессоров.

Добавлено @ 16:04 
Цитата(SergeCpp @  27.6.2006,  15:50 Найти цитируемый пост)
Что касается RDTSC (MSR#10h), то он читается и без перехода в 0 кольцо...


RDTSC - типичная инструкция процессора, а MSR 10h - регистр процессора, т.е. это абсолютно разные вещи. 
PM MAIL WWW   Вверх
Romikgy
Дата 27.6.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



jungle,  дай весь исходник , что компилируешь, я дома проверю 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jungle
Дата 27.6.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Romikgy, наиболее корректный: http://forum.vingrad.ru/index.php?showtopic=101839&st=0# (моё второе сообщение в этой ветке) 
Код, с учетом твоих последних поправок, также не рабочий. Поэтому код надо юзать тот, что указан по ссылке выше.
  

Это сообщение отредактировал(а) jungle - 27.6.2006, 17:00
PM MAIL WWW   Вверх
Romikgy
Дата 27.6.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



jungle,  нда , трудно было свой проект сжать и сюда закинуть ?
Или ты считаешь , что 
Цитата(jungle @  27.6.2006,  15:57 Найти цитируемый пост)
Поэтому код надо юзать тот, что указан по ссылке выше.

у меня этого кода нет?
Странный ты , тебе помочь , хочу, а ты не шивелишься smile
Как знаешь , сегодня я уже домой иду, буду в нете (нормальном) только послезавтра) бывай smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jungle
Дата 27.6.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Лови!

Добавлено @ 17:14 
Надеюсь успел smile   

Это сообщение отредактировал(а) jungle - 27.6.2006, 17:21

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  Ring09x.zip 6,88 Kb
PM MAIL WWW   Вверх
jungle
Дата 29.6.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Здарова!

Заново переписал аналогичный сишный код, позаимствованный из книжки «Программирование аппаратных средств в Windows». Код отличается тем, что функция вызывает в нулевом кольце процедуры не чтения MSR-регистров, а чтения-записи портов. Сама суть поиска свободных дескрипторов та же самая. Прилагаемый архив содержит 4 страницы подробного сишного кода из вышеназванной книги и почти завершенный Delphi проект. Однако полагаю, что проблема как раз с передачей адреса вызываемой процедуры:

call fword ptr [CallgateAddr]

В Delphi типа fword не существует. Т.е. проблема с переводом кода на Delphi уже решена, остаётся только найти конкретную ошибку.
 

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Ring09x.zip 106,79 Kb
PM MAIL WWW   Вверх
Romikgy
Дата 29.6.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(jungle @  27.6.2006,  16:11 Найти цитируемый пост)
Надеюсь успел

нет
У меня все работает, кроме:
эти асм команды не воспринимаются

Цитата(jungle @  26.6.2006,  10:39 Найти цитируемый пост)
rdmsr


Цитата(jungle @  26.6.2006,  10:39 Найти цитируемый пост)
 wrmsr

,
немного помучился с SGDT ,
и его заюать получилось smile
но в ХР он ссылается на реальный участок памяти , в 98 в никуда smile

Что должно возращать эта команда?
и что за команды , которые не воспринимаются? с какого проца они есть ? у меня дома Атлон и или он не видит , или компилятор дельфей smile пробовал на 5 дельфе
Пробовал даже исходник на си запустить в си билдере, тоже не работает smile
отсель вопрос откуда код взят? и почему ты решил что он рабочий? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jungle
Дата 29.6.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Romikgy

Замени инструкции следующими эквивалентами в ассемблерной вставке

rdmsr – dw $320F
wrmsr – dw $300F

Инструкции rdmsr и wrmsr понимаются компилятором Delphi 6 и выше, иначе заменяй их опкодами, приведенными выше. 

Сорсис я нашел в инете – Гуглой по запросу Ring0+Delphi+Windows9x. Очень много ссылок приводилось на китайские сайты. С одного из них я и слил cpp и h-файл, ссылку, увы, не запомнил. Но сейчас я больше доверяю коду, который перевёл с книги, название которой я уже приводил.

Сейчас у меня проблема одна: компилятор Delphi 6 спотыкается на строчке
call fword ptr [CallgateAddr]
в ассемблерной вставке.
 
PM MAIL WWW   Вверх
Romikgy
Дата 29.6.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(jungle @  29.6.2006,  13:26 Найти цитируемый пост)
fword

А че это за тип такой? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jungle
Дата 29.6.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Похоже Паскальный аналог Int64 - 4 слова. 
PM MAIL WWW   Вверх
dumb
Дата 30.6.2006, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



не, не похоже smile
48 бит. селектор+оффсет

примерно так, чтобы не париться с компилером:
Код

push word ptr [CallgateAddr+4]
push dword ptr [CallgateAddr]
call fword ptr [esp]
add esp, 6

если что, заменить "call fword ptr [esp]" на "dd 90241cffh" 
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.