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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Драйверы Windows режима ядра, как это делается в Delphi 
:(
    Опции темы
ama_kid
Дата 7.12.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(Pavia @  7.12.2008,  04:57 Найти цитируемый пост)
Такое впечатление что неправильно экспортирую функции
Есть подозрение, что экспортировать их надо следующим образом:
Цитата
... stdcall; external NtKernel name '_MmMapIoSpace@16';

Цитата(Pavia @  6.12.2008,  20:13 Найти цитируемый пост)
А еще dbgprint не работает.
Не сильно понятное описание ошибки, телепатировать сложно... smile 
Вообще, для тематических вопросов есть соответствующий раздел форума smile
Цитата(ReInit @  7.12.2008,  12:01 Найти цитируемый пост)
Спасибо! Отличная инфа!
Не за что smile
microxa, действительно, достаточно ценное замечание, использование try...except...end сильно упростит жизнь во многих случаях...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 7.12.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(microxa @  2.12.2008,  05:49 Найти цитируемый пост)
Вобщем куда удобней использовать собственный линкер delphi, устраняя некоторые неровности в производимых им PE dll-ках, таким вот напильником: 


А можно меня ткнуть носом в тот потолок, с которого взялись все  (без исключения) константы в напильнике ? smile

P.S.
 На всякий случай оговорюсь: я не утверждаю, что что-то "не так",
 просто не умею воспринимать любые магические числа в коде, акромя разве что нуля и единицы smile  



Это сообщение отредактировал(а) Riply - 7.12.2008, 18:15
PM MAIL   Вверх
bems
Дата 7.12.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



ну как минимум там добавляется not pageable

Добавлено через 5 минут и 9 секунд
и еще discardable 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ama_kid
Дата 7.12.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(bems @  7.12.2008,  19:37 Найти цитируемый пост)
ну как минимум там добавляется
Больше похоже что просто копируются значения, генерируемые мелкомягким линкером. Потому что если этот напильник натравить на нормальный драйвер - эти магические числа равны содержащимся в образе...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 7.12.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(ama_kid @  7.12.2008,  18:58 Найти цитируемый пост)
Больше похоже что просто копируются значения, генерируемые мелкомягким линкером. Потому что если этот напильник натравить на нормальный драйвер - эти магические числа равны содержащимся в образе... 


Если это так (просто копируются), то где гарантии, что и у другого драйвера в образе тоже самое  ?
Или под другим SP-ом или под другой версией Win  ?
PM MAIL   Вверх
ReInit
Дата 8.12.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Riply
Если ты про характеристики секций, то это комбинации констант IMAGE_SCN_...

http://www.wasm.ru/article.php?article=green2red02
Цитата
DWORD   Characteristics;
Это поле содержит атрибуты секции. Атрибуты секции указывают на права доступа к ней, а также на некоторые особенности влияния на нее загрузчика. Флаги секций могут преобразовываться загрузчиком в атрибуты страниц и сегментов.

PM MAIL   Вверх
Riply
Дата 8.12.2008, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(ReInit @  8.12.2008,  00:15 Найти цитируемый пост)
Если ты про характеристики секций


Да я про все, ибо если мне вместо SizeOf(BYTE) напишут 1, то я перестану понимать smile
Хотя, себе любимой, иногда такое и позволяю smile

Цитата(ReInit @  8.12.2008,  00:15 Найти цитируемый пост)
это комбинации констант IMAGE_SCN


Во. Уже что-то. Спасибо smile

PM MAIL   Вверх
microxa
Дата 8.12.2008, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую адептов столь продвинутой "дельфийской магии" smile
Цитата(Ripli)

А можно меня ткнуть носом в тот потолок, с которого взялись все (без исключения) константы в напильнике ?

Насчет констант - мне просто не хотелось перегружать прогу километровыми PAGE_EXECUTE_READ or IMAGE_SCN_MEM_NOT_PAGED и тп. (имеються в модуле windows) 

Напильник пришлось немного доработать в области "фиксатора" import table:
Код

// fix incorrect data in the import table (PE images from D4-D7) 
    if str= '.idata' then begin 
    p0:= pointer(integer(img.MappedAddress)+Section.PointerToRawData);
// copy FirstThunk to OriginalFirstThunk 
   while (pInteger(integer(p0)+$10)^ <> 0) do
    begin
      p0^ := pInteger(integer(p0)+$10)^; 
      inc (p0,5); //process next descriptor
    end;
   end;

(гм.. FirstThunk OriginalFirstThunk взяты из описания структур PE формата из windows.h)

Переделаные таким образом DLL, работают (по моему опыту) ничуть не хуже слинкованых мc-линкером.

Ну и какбы в качестве примера..

Одним из возможных применений драйвера - вызов Ring0 процедур непосредственно в самой программе.  Понятное дело - трюк связан с определенным  риском, и расчитан на "железячников" более менее знакомых с архитектурой PC/х86 (или желающих изучать это дело).

В режиме ядра снимаються проблемы только с операциями in/out и доступом к привелигированиым регистрам и инструкциям CPU. Это в ряде случаев  может оказаться недостаточным, например для обращения к физическим адресам  памяти, что потребует вызова системных ф-кций. 

В противном случае  несогласование этого вопроса с системой, может приведет к bsod (и даже SEH не пикнет)))... 

Пример простого драйвера:
Код

library TestDrv;
                uses DDDK, drvobj;

function MmMapIoSpace (PhysicalAddress:int64; NumberOfBytes, 
                       CacheEnable:Cardinal):pointer; stdcall; external NtKernel;

procedure MmUnmapIoSpace(BaseAddress:pointer;NumberOfBytes:cardinal); 
                          stdcall; external NtKernel;

var 
    Drv:TDRV;

function DrvDeviceControl(DrvObj:PDRIVER_OBJECT;Irp:PIRP):integer;stdcall;
var
    Ring0Proc : procedure(Drv:pointer);
begin                  
    Ring0Proc := Irp.UserBuffer;
  try
    Ring0Proc(@Drv);
   except
 end;
    IoCompleteRequest(Irp, 0);
    Result := STATUS_SUCCESS;
end;

const
    DevStr  = '\Device\TestDrv';
    DosStr  = '\DosDevices\TestDrv';
var
    UdevStr : UNICODE_STRING = (Length:0);
    UdosStr : UNICODE_STRING = (Length:0);

function DrvCreateDispatch(DrvObj:PDRIVER_OBJECT;Irp:PIRP):integer;stdcall;
begin
    IoCompleteRequest(Irp,0);
    Result := STATUS_SUCCESS;
end;

procedure DrvUnload(DrvObj:PDRIVER_OBJECT);stdcall;
begin
    IoDeleteSymbolicLink(@UDosStr);
    IoDeleteDevice(DrvObj.DeviceObject);
end;

function DriverEntry(DrvObj: PDRIVER_OBJECT; RegistryPath :pointer):integer;stdcall;
var DevObj: PDeviceObject;
begin
    RTlInitUnicodeString(@UdevStr,devStr);
    RTlInitUnicodeString(@UdosStr,dosStr);

    IoCreateDevice(DrvObj,0,@UDevStr,FILE_DEVICE_UNKNOWN,0,false,DevObj);

    IoCreateSymbolicLink(@UDosStr,@UDevStr);
    DrvObj.DriverUnload := @DrvUnload;
    DrvObj.MajorFunction[IRP_MJ_CREATE] := @DrvCreateDispatch;
    DrvObj.MajorFunction[IRP_MJ_DEVICE_CONTROL] := @DrvDeviceControl;

    DRV.MmMapIoSpace := @MmMapIoSpace;
    DRV.MmUnmapIoSpace := @MmUnmapIoSpace;
    HalMakeBeep (1000);
    Result := STATUS_SUCCESS;
end;

asm jmp DriverEntry
end.

Собираеться в любой среде (IDE delphi/CMD32), главное в папку с проектом 
драйвера не забыть поместить облегченные версии RTL. 

Для упрощения, здесь адрес процедуры передаеться в драйвер в качестве параметра в  DeviceIOControl, а так как user-space программа,  экспортировать функции ядра  не может, между драйвером и программкой будет некоторый общий интерфейс:

Код

unit drvobj;
interface
type 
     TDRV = record 
     MmMapIoSpace : function(PhysicalAddress:int64;NumberOfBytes, 
                             CacheEnable:Cardinal):pointer; stdcall;
     MmUnmapIoSpace: procedure(BaseAddress:pointer;
                               NumberOfBytes:cardinal); stdcall; 
end; PDRV = ^TDRV;
implementation
end.


Код

{$apptype console}
program testDrv; uses windows, drvobj;

var
    str: pChar = 'Hello World from Kernel Mode!';

procedure Ring0(Drv:PDRV);
const
    size = $2000; 
var 
    i:integer; ptr: pointer;
begin
    ptr := Drv.MmMapIoSpace($B8000,size,0);

 for i := 0 to length(str) do
 begin
    pChar(integer(ptr)+i*2)^ := pChar(integer(str)+i)^; //put char
    pChar(integer(ptr)+(i*2)+1)^ := #$1F; //put attribute
 end;

 if ptr <> nil then Drv.MmUnMapIoSpace(ptr, size);
end;

var
    b:dword; hDrv:thandle; i:integer;
begin
    hDrv:=CreateFile('\\.\\TestDrv',$80000000,0,nil,3,$80,0);

    DeviceIoControl(hDrv,0,@b,4,@Ring0,0,b,nil);
    CloseHandle (hDrv);
    readln;
end.


Тестовый пример "хелловорлда" работает исключительно в режиме консольного fullscreen'а (80x25), поскольку маппит район $B8000 (видеопамять текстового режима, стандарт времен царя гороха))).
/added
Riply, спасибо! 
благодаря Вашему замечанию теперь я буду поступать так smile
Код

var
    b:dword; 
    f:file;
begin
     Assign (f, '\\.\\TestDrv');
     reset(f,1);
     DeviceIoControl(TFileRec(f).handle,0,@b,4,@Ring0,0,b,nil);
     Close(f);
     ReadLn;
end.

Для полноты художественной картины Осталось от DeviceIoControl избавиться 
(в нем куда больше странностей, касаемо нюансах в параметрах ;) )

Шерлок Холмс был прав, насчет того что голова не чердак, и не стоит ее захламлять! smile

ммм... даже интересно стало прикрутить к драйверу  IRP_MJ_READ/ IRP_MJ_WRITE   

Это сообщение отредактировал(а) microxa - 8.12.2008, 06:47
PM MAIL   Вверх
Riply
Дата 8.12.2008, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



microxa
Цитата(microxa @  8.12.2008,  02:42 Найти цитируемый пост)
Приветствую адептов столь продвинутой "дельфийской магии"


Здравствуйте smile

Цитата(microxa @  8.12.2008,  02:42 Найти цитируемый пост)
Насчет констант - мне просто не хотелось перегружать прогу километровыми PAGE_EXECUTE_READ or IMAGE_SCN_MEM_NOT_PAGED и тп. (имеються в модуле windows) 


Вот скажи-ка мне честно:
неужели, ты в следующей строчке сразу понимаешь, что и как создается ?
Цитата(microxa @  8.12.2008,  02:42 Найти цитируемый пост)
hDrv:=CreateFile('\\.\\TestDrv',$80000000,0,nil,3,$80,0);

Если да, то не кажется ли тебе, что уж лучше "перегружать прогу километровыми константами",
чем свой мозг ?  smile

P.S.
 Кстати, Шерлок Холмс сравнивал человеческий мозг с чердаком,
 на котором не так уж и много места smile


Это сообщение отредактировал(а) Riply - 8.12.2008, 03:32
PM MAIL   Вверх
ReInit
Дата 8.12.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Riply
Цитата

 Кстати, Шерлок Холмс сравнивал человеческий мозг с чердаком,
 на котором не так уж и много места 

Шерлок Холмс (точнее Конан Дойль) заблуждался...
PM MAIL   Вверх
EagleXK
Дата 18.1.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.9.2006
Где: Украина, Житомир

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



Хмм... Странно, но Ctrl+Alt+Del не перехватился на XP SP2...
PM MAIL WWW ICQ   Вверх
Riply
Дата 21.2.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



День добрый !

ama_kid, а ты не мог бы дать файлы sysinit.pas и system.pas,
которые послужили "прототипом" для dcu-шек ?
Ну и командную строчку, с которой собирались  smile 
PM MAIL   Вверх
bems
Дата 21.2.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Riply, в командной строке нужен ключ -Y
Это работало в 7ке. 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
jungle
Дата 16.6.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Добрый день!

Можно ли использовать 64-битовый линкер для сборки 64-разрядного драйвера? 
PM MAIL WWW   Вверх
Alexeis
Дата 16.6.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(jungle @  16.6.2009,  11:10 Найти цитируемый пост)
Можно ли использовать 64-битовый линкер для сборки 64-разрядного драйвера?  

  Разве он проглотит 32х разрядные бинарники? Кроме того как работать с указателями, ведь они 32х разрядные. Так что скорее всего нельзя.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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