nike_zp
Гость
|
|
« : 09-12-2003 12:18 » |
|
Как узнать значение переменной KeServiceDescriptorTable, которая экспортируется из микроядра ntoskrnl.exe
|
|
|
Записан
|
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 10-12-2003 21:56 » |
|
Как узнать значение переменной KeServiceDescriptorTable
Если переменная экспортируется- то напиши ее имя и все. ULONG ptr=KeServiceDescriptorTable; и заранее объяви ее, если не объявлена extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable; микроядра ntoskrnl.exe
Начиная с Windows NT 4.0 нельзя называть систему микроядерной, ядро монолитное с возможностью динамического подключения драйверов и модулей.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #3 : 11-12-2003 07:03 » |
|
Начиная с Windows NT 4.0 нельзя называть систему микроядерной, ядро монолитное с возможностью динамического подключения драйверов и модулей.
на мой взгляд это достаточно странное утверждение... на сколько я понимаю ядро 3.x отличается от 4-го тем что в 4-м в ядро добавились GUI сервисы - как это могло повлиять на "микроядерность"? point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #4 : 11-12-2003 20:30 » |
|
на мой взгляд это достаточно странное утверждение... на сколько я понимаю ядро 3.x отличается от 4-го тем что в 4-м в ядро добавились GUI сервисы - как это могло повлиять на "микроядерность"?
До NT 4 графическая подсистема жила в отдельном процессе, что позволяло говорить о некоторых признаках микроядерности, начиная с 4 версии графическая подсистема стала обыкновенным драйвером. Вот так и повлияло- не микроядерная система- это бесспорно, такое же мнение имеют D. Solomon и M. Russinovich, с ним можно ознакомится в книге "Windows 2000 Internals". Ядро не микроядерное- нет ни одного признака микроядерности. Все драйвера, даже видеоподсистемы, находятся в одном адресном пространстве. Крах одного драйвера означает крах системы. Код всех драйверов отображается на адресное пространство всех процессов. Микроядерная система грузит большую часть драйверов в отдельные процессы, именно поэтому она и называется микроядерная, как пример Windows CE имеет несколько процессов- один на ядро nk.exe, второй для загрузки драйверов, третий для видеоподсистемы и устройств ввода, четвертый для драйверов файловой системы. Для обращения к драйверам необходимо переключение процессов, причем при желании можно не запускать например процесс графической подсистемы, если он не нужен. Или посмотри на ядро Mach.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #5 : 12-12-2003 08:36 » |
|
на счет "нет ни одного признака микроядерности", вопрос спорный, однако называть ядро NT исключительно монолитным я бы не стал. признаки "микроядерности" все же присутствуют. готов согласится в том это ядро не является чисто "микроядерным", это скорее помесь монолитного ядра с микроядерным.
point.
|
|
|
Записан
|
|
|
|
nike
Гость
|
|
« Ответ #6 : 16-12-2003 13:37 » |
|
В структуре, на которую указывает эта переменная, есть поле - массив, который содержит адреса сервисов. Так вот, вопрос в том как, например, узнать значение этого массива с индексом 20 (NtCreateFile). Я обращаюсь, как к обычному массиву(типа addr=mas[20] , но выводится ошибка, что размер этого массива неизвестен. P.S. Я основываюсь на статье http://he4dev.e1.bmstu.ru/HookSysCall/
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #7 : 16-12-2003 14:49 » |
|
структуре, на которую указывает эта переменная, есть поле - массив, который содержит адреса сервисов. Так вот, вопрос в том как, например, узнать значение этого массива с индексом 20 (NtCreateFile). Я обращаюсь, как к обычному массиву(типа addr=mas[20], но выводится ошибка, что размер этого массива неизвестен.
Странно. Это же обыкновенный С. Это наверно из-за typedef void* SSTAT[]; у массива неизвестный размер, переопредели как typedef void** SSTAT; или typedef void* SSTAT; в зависимости от того что понимаешь под этим.
|
|
|
Записан
|
|
|
|
Yura
Гость
|
|
« Ответ #8 : 23-12-2003 22:29 » |
|
Народ А существут ли функция INT2Eh чтения/записи в физические сектора жёсткого диска? А то я чёта такой API-функции не помню и соответственно не могу применить методику изложеную в: http://he4dev.e1.bmstu.ru
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #9 : 24-12-2003 06:09 » |
|
А существут ли функция INT2Eh чтения/записи в физические сектора жёсткого диска?
NtReadFile/ NtWriteFile для объекта \Device\HarddiskN\DRN (или \Device\HarddiskN\Partition0 в <=NT 4), где N - номер физического диска.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #10 : 24-12-2003 13:33 » |
|
а что за метод описанный у he4 требует чтения физ. секторов hdd? point.
|
|
|
Записан
|
|
|
|
Yura
Гость
|
|
« Ответ #11 : 24-12-2003 14:43 » |
|
NtReadFile/ NtWriteFile для объекта \Device\HarddiskN\DRN (или \Device\HarddiskN\Partition0 в <=NT 4), где N - номер физического диска.
Спасибо это уже что-то. Я так понял что для записи в в любое устройство (COMпорт, файл, физический сектор) используется один и тот же системный сервис mov ax,const1 int 2Eh связаный с API функциями NtReadFile/ NtWriteFile а что за метод описанный у he4 требует чтения физ. секторов hdd?
Нет там изложен метод получения через функции API номера функции (или функций) прерывания INT 2Eh. (в рамках более общей задачи) Методы описаные в he4 не требуют чтения физ. секторов hdd просто у меня есть идея к которой я иду медленно но упорно.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #12 : 24-12-2003 14:56 » |
|
Я так понял что для записи в в любое устройство (COMпорт, файл, физический сектор) используется один и тот же системный сервис mov ax,const1 int 2Eh связаный с API функциями NtReadFile/ NtWriteFile
Правильно понял. А связано это с тем, что почти у всех драйверов для записи на то чем они управляют используется один код- IRP_MJ_WRITE, который и делает NtWriteFile. Иногда используют RP_MJ_DEVICE_CONTROL, но это уже реже.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 24-12-2003 14:58 » |
|
Кстати- тема чтения с диска обсуждалось на этих форумах, только не помню где, там даже примеры кода были приведены.
|
|
|
Записан
|
|
|
|
Yura
Гость
|
|
« Ответ #14 : 24-12-2003 15:47 » |
|
to SlavaI
Спасибо за подробный коментарий но вопрос для меня так и остался открытым: Не найдуться ли вдруг обходные пути по которым какая-нибудь специфичная APIфункция, не имеющая прямого отношения к чтению\записи на диск, через другой системный сервис читает\пишет на диск в обход KeWriteFile/KReadFile. Если это так то где надо поставить заплатку чтобы контролировать этот процесс. Если есть необходимость делать заплатку в виде драйвера фильтра то интересно знать между какими драйверами её надо ставить и каков пртокол взаимодействия с драйвером более низкого уровня?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 26-12-2003 14:02 » |
|
Вот по диску у себя порылся и нашел код из обсуждения про прямое чтение с диска #include <windows.h>
extern "C" | #include "NTDLL.h" " #define OBJ_KERNEL_HANDLE 0x00000200L
//#include "native.h"
#define BUFF_SIZE 0x2000
BYTE* buffer;//[512(; LARGE_INTEGER byteoffset;
int _tmain)int argc, _TCHAR* argv[(: | UNICODE_STRING UnicodeFilespec; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE FileHandle = NULL; IO_STATUS_BLOCK Iosb; NTSTATUS status; // ULONG MessageLength = )ULONG:strlen)Message:;
RtlInitUnicodeString)&UnicodeFilespec, L"\\Device\\Harddisk0\\DR0":; InitializeObjectAttributes)&ObjectAttributes,&UnicodeFilespec, OBJ_INHERIT /*| OBJ_KERNEL_HANDLE*/,NULL,NULL:;
status = NtCreateFile)&FileHandle,GENERIC_READ,&ObjectAttributes,&Iosb,0, FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ | FILE_SHARE_WRITE , FILE_OPEN,FILE_NON_DIRECTORY_FILE | FILE_NO_INTERMEDIATE_BUFFERING,NULL,0:; if)!NT_SUCCESS)status:: wprintf)L"Error! In NtCreateFile, Error=0x%X \n",status:; else wprintf)L"File handle = %X\n",FileHandle:;
buffer = )BYTE*:VirtualAlloc)NULL,BUFF_SIZE,MEM_COMMIT,PAGE_READWRITE:; wprintf)L"buffer = 0x%X\n", buffer:; memset)buffer,0x0,BUFF_SIZE:; byteoffset.QuadPart=0x0000; Iosb.uInformation = 0; status = NtReadFile)FileHandle,NULL,NULL,NULL,&Iosb,buffer,BUFF_SIZE,&byteoffset,NULL:; WaitForSingleObject)FileHandle,INFINITE:;
if)!NT_SUCCESS)status:: wprintf)L"Error in ZwReadFile = %X!\n", status:; else | printf)"Iosb.Information = %X\n", Iosb.uInformation:; printf)"buffer[0( = %X\n",buffer[0(:; printf)"buffer[1( = %X\n",buffer[1(:; printf)"buffer[2( = %X\n",buffer[2(:; printf)"buffer[3( = %X\n",buffer[3(:; printf)"buffer[4( = %X\n",buffer[4(:; printf)"buffer[5( = %X\n",buffer[5(:; printf)"buffer[6( = %X\n",buffer[6(:; printf)"buffer[7( = %X\n",buffer[7(:; printf)"buffer[8( = %X\n",buffer[8(:; printf)"buffer[9( = %X\n",buffer[9(:; "
NtClose)FileHandle:; return 0; "
|
|
|
Записан
|
|
|
|
Yura
Гость
|
|
« Ответ #16 : 01-01-2004 20:03 » |
|
Спасибо за пример. Надеюсь мои опасения напрасны о обходного пути записи/чтения на диск не существует (в рамках стандартной поставки О.С.)
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #17 : 12-01-2004 06:24 » |
|
Надеюсь мои опасения напрасны о обходного пути записи/чтения на диск не существует (в рамках стандартной поставки О.С.)
По моему нет. Выбор у приложений такой- или Nt(Zw)Read/WriteFile или Nt(Zw)DeviceIoControlFile.
|
|
|
Записан
|
|
|
|
|