ПредишенСледващото

Идеята за написването на псевдо-шофьор не дойде веднага. В началото на пътя за мен на преден план имаше въпрос - и дали тази програма е полезна на всички? Моята дали обикновен програмист, и още повече, че от страна на потребителя, заключващ механизъм квоти диск, да речем, или да пишете на памет с атрибут "няма достъп"? Сега, получени първите резултати от тестовете в операционната система Windows NT, въпросът вече не остава. По мое мнение най-полезни за тази програма ще бъдат експерти в областта на информационната сигурност, използването на WindowsNT операционна система, т.е. Тази програма ще помогне на разработчиците на приложения за ефективно obespchenie WindoewsNT информационна сигурност.

Желателно е също така да има представа за архитектурния модел на драйвери на устройства. Особен акцент се поставя върху софтуерната среда взаимодействат със системата I / O мениджър.

2. Режимът на ядрото и режима на потребителя
Pentium микропроцесор има четири нива привилегия (нива привилегия), известен също като пръстенът (пръстени), която се контролира, например, достъп до паметта, възможността да се използва някаква критична команден процесор (като команди, свързани със защитата), и т.н. Всяка нишка работи на едно от нивата на привилегия. Ring 0 - най-привилегированата ниво, с пълен достъп до цялата памет, както и до всички команди на процесора. Ring 3 - най-малко привилегировано ниво.
За да се гарантира съвместимост със системи, базирани на процесори, различни от тези освободени, Intel, Windows NT поддържа само две нива на привилегии - Ring 0 и 3. Ако конецът минава през пръстен 0, казват, че тя работи в режим на ядрото (режима на ядрото) , В режим на ядрото литература понякога се нарича режим на ръководител. Ако конецът се изпълнява в пръстен 3, каза, че той работи в режим на потребител (потребителски режим). приложения и подсистема софтуерна среда, работещи в потребителски режим (Win32, OS / 2 и POSIX). план на графична система драйвери на устройства, графични драйвери принтер и прозоръчна мениджър в режим на ядрото (вж. схема «Windows NT архитектура в опростена форма"). Режим на изпълнение потребителски режим е много по-надежден, но изисква допълнителни разходи, което намалява общата производителност на процеса. Код работи в режим на потребител не може да наруши целостта на изпълними система ядрото и драйвери за устройства на Windows NT. Интересното е, че драйверите за устройствата работят в режим на ядрото. Това има две последици. На първо място, за разлика от добре работеща програма шофьор погрешно устройство може да попречи на работата на цялата система, тъй като тя има достъп до целия код на системата и всички паметта. На второ място, програмист на приложения може да получи достъп до защитени ресурси като пишете псевдо-шофьор (фалшив устройство), макар че това не е лесна задача.

#ifdef _X86_ // структура се отнася до x86 модел процесор
typedef структура _CONTEXT

// набор от битови флагове, който определя съдържанието на структурата
DWORD ContextFlags;

// отстраняваме регистри
DWORD Dr0;
DWORD DR1;
DWORD DR2;
DWORD DR3;
DWORD DR6;
DWORD DR7;

// плаваща запетая регистри
FLOATING_SAVE_AREA FloatSave;

// сегменти регистри
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;

// целочислени регистри
DWORD Еди;
DWORD Еси;
DWORD EBX;
DWORD EDX;
DWORD ECX;
DWORD EAX;

// Контролни регистри
DWORD ЕВР;
DWORD ППИ;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;

// Допълнителни регистри
BYTE ExtendedRegisters [MAXIMUM_SUPPORTED_EXTENSION];

# endif
// алфа, _ MIPS_, _AMD64_, _M_IA64 и др.

д) Обява 2
/ * ++
Модул Име:
spurp.h
Описание:
Дефинира SPURP, свързана с типа на устройството,
обработка функция и IOCTL код за приложения и драйвери
--* /
#ifndef SPURP_H
#define SPURP_H

// макрос, който определя кода на нов IOCTL
#define IOCTL_SWITCH_CONTEXTS CTL_CODE (FILE_DEVICE_UNKNOWN, 0x802, \
METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)

# определят SPURP_DEVICE_NAME_U L "\\ Устройство \\ SPURP"
#define SPURP_WIN_DEVICE_NAME_U L "\\ \\ DosDevices SPURP"

NTSTATUS
DriverEntry (
В PDRIVER_OBJECT DriverObject,
В PUNICODE_STRING ПътКъмСистемнияРегистър
);

NTSTATUS
SwitchStackDispatchIoctl (
В PDEVICE_OBJECT DeviceObject,
В PIRP МКК);

VOID
SpurpUnload (
В PDRIVER_OBJECT DriverObject
);
# endif

д) Обява 3
/ * ++
Модул Име:
spurp.c
Описание:
шофьор извършване на потребителски функции
с аргументите в режима на ядрото
--* /
#include
#include "spurp.h"

#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#pragma alloc_text (PAGE, SwitchStackDispatchIoctl)
#pragma alloc_text (PAGE, SpurpUnload)
# endif

NTSTATUS
DriverEntry (
В PDRIVER_OBJECT DriverObject,
В PUNICODE_STRING ПътКъмСистемнияРегистър
)
NTSTATUS статус = STATUS_SUCCESS;

UNICODE_STRING unicodeDeviceName;
UNICODE_STRING unicodeWinDeviceName;
PDEVICE_OBJECT deviceObject;

статус = IoCreateDevice (
DriverObject,
0
unicodeDeviceName,
FILE_DEVICE_UNKNOWN,
0
(BOOLEAN) вярно,
deviceObject
);

ако (! NT_SUCCESS (статус))
върне статус;
>
//
// Разпределяне и инициализира UNICODE - низ с името на
// нашето устройство, който се вижда в подсистемата Win32
//
(Свободен) RtlInitUnicodeString ( unicodeWinDeviceName, SPURP_WIN_DEVICE_NAME_U);

статус = IoCreateSymbolicLink (
(PUNICODE_STRING) unicodeWinDeviceName,
(PUNICODE_STRING) unicodeDeviceName
);

ако (! NT_SUCCESS (статус))
IoDeleteDevice (deviceObject);
върне статус;
>

DriverObject-> MajorFunction [IRP_MJ_DEVICE_CONTROL] = SwitchStackDispatchIoctl;
DriverObject-> DriverUnload = SpurpUnload;

// ++
// SwitchStackDispatchIoctl
//
// Това е комбинация на изпращане, който обработва
// Устройство I / O функции за контрол, изпратени до това устройство
//
// Параметри:
// DeviceObject - обект указател устройство
// IRP - указател към въвеждане на данни / изход пакета (I / O Заявка Packet)
//
// Връщане стойност:
// NSTATUS състояние на IRP завършване
//
// -

NTSTATUS SwitchStackDispatchIoctl (PDEVICE_OBJECT DeviceObject, PIRP МКК)
PIO_STACK_LOCATION Io_s;
NTSTATUS Статус;
//
// Получаване на указател към текущата позиция на входно / изходна стека (I / O стека)
//
Io_s = IoGetCurrentIrpStackLocation (МКК);
//
// Уверете се, че това е валидно IOCTL за нас.
//
ако (Io_s-> Parameters.DeviceIoControl.IoControlCode! = IOCTL_SWITCH_CONTEXTS)
Състояние = STATUS_INVALID_PARAMETER;
>
още
//
// Взимаме указател към функция повикването.
//
VOID (* UserFunctToCall) (PULONG) = Irp-> UserBuffer;
//
// и аргумента за прехвърляне
//
PVOID UserArg;
UserArg = Io_s-> Parameters.DeviceIoControl.Type3InputBuffer;
//
// потребителски Call параметри се подават на функцията
//
(Свободен) (* UserFunctToCall) ((UserArg));
Състояние = STATUS_SUCCESS;
>
Irp-> IoStatus.Status = положение;
Irp-> IoStatus.Information = 0;
IoCompleteRequest (МКК, IO_NO_INCREMENT);
се върне (Status);
>
// ++
// SpurpUnload
//
// Тази функция се освобождава шофьора
// ресурси и премахва обект устройство (устройство обект).
//
// Параметри:
// DeviceObject - указател към обект на устройството
//
// Връщане стойност:
// VOID (функция спира действието на водача)
//
// -
VOID SpurpUnload (IN PDRIVER_OBJECT DriverObject)
UNICODE_STRING uniWin32NameString;
//
// Изтриване на потребител вижда името на устройството,
//
RtlInitUnicodeString ( uniWin32NameString, SPURP_WIN_DEVICE_NAME_U);

IoDeleteSymbolicLink ( uniWin32NameString);
//
// премахване на компоненти на устройството
//
IoDeleteDevice (DriverObject-> DeviceObject);

ж) Обявата 4
; Модул Име:
; spurp.inf
; Описание:
; настройки на данните за spurp.sys шофьор

[DestinationDirs]
SPURP.Files.x86_12 = 12

[SPURP_Inst.ntx86.Services]
AddService = spurp, 0x00000002, SPURP_Service_Instx86,

[SPURP_Service_Instx86]
ServiceType =% SERVICE_KERNEL_DRIVER%
StartType =% SERVICE_SYSTEM_START%
ErrorControl =% SERVICE_ERROR_NORMAL%
ServiceBinary =% 12% \ spurp.sys

[SPURP_EventLog_Inst]
AddReg = SPURP_EventLog_Inst.AddReg

[SPURP_EventLog_Inst.AddReg]
HKR ,, EventMessageFile,% REG_EXPAND_SZ% ", %% %% SystemRoot \ System32 \ IoLogMsg.dll"
HKR ,, TypesSupported,% REG_DWORD%, 7

; ******* Във локализируемите ленти *******

SERVICE_BOOT_START = 0x0
SERVICE_SYSTEM_START = 0x1
SERVICE_AUTO_START = 0x2
SERVICE_DEMAND_START = 0x3
SERVICE_DISABLED = 0x4

SERVICE_KERNEL_DRIVER = 0x1
SERVICE_ERROR_IGNORE = 0x0
SERVICE_ERROR_NORMAL = 0x1
SERVICE_ERROR_SEVERE = 0x2
SERVICE_ERROR_CRITICAL = 0x3

Всъщност, това е моето изследване, по време на която написах шофьор псевдо-устройство.
Целта на тази разработка е предвидено в текста на изследването, както и за възможностите, които, според мен, и така всичко е ясно (изпълнение на команди на нивото на ядрото от потребителски режим, което значително разширява възможностите за използване на системата).

  • Контекст вътре (контексти отвътре навън)
  • Контекст вътре (контексти отвътре навън)
  • Контекст вътре (контексти отвътре навън)
  • Контекст вътре (контексти отвътре навън)

Подкрепете проекта - споделете линка, благодаря!