Сейчас на форуме: _MBK_, tyns777, UniSoft (+10 невидимых)

 eXeL@B —› Программирование —› Почемуто не идет управление
Посл.ответ Сообщение

Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 апреля 2012 12:35
· Личное сообщение · #1

есть к примеру код драйвера
Code:
  1. #include "ntddk.h"
  2.  
  3. #define NT_DEVICE_NAME L"\Device\NTName"
  4. #define WIN32_DEVICE_NAME L"\DosDevices\MYDRIVER"
  5. #define IOCTL_READ CTL_CODE  (FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) 
  6. #define IOCTL_WRITE CTL_CODE (FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) 
  7.  
  8. NTSTATUS CtlCreate(IN PDEVICE_OBJECT, IN PIRP);
  9. NTSTATUS CtlClose(IN PDEVICE_OBJECT, IN PIRP);
  10. NTSTATUS CtlDispatch(IN PDEVICE_OBJECT,IN PIRP);
  11. VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject);
  12.  
  13. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)  
  14. {
  15.          PDEVICE_OBJECT pDeviceObject;
  16.          UNICODE_STRING uniNtName;
  17.          UNICODE_STRING uniWin32Name;
  18.          RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME);
  19.          RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME);
  20.          IoCreateSymbolicLink(&uniWin32Name, &uniNtName);
  21.          IoCreateDevice(pDriverObject,0,&uniNtName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject);
  22.          pDriverObject->MajorFunction[IRP_MJ_CREATE]=CtlCreate;
  23.          pDriverObject->MajorFunction[IRP_MJ_CLOSE]=CtlClose;
  24.          pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=CtlDispatch;
  25.          pDriverObject->DriverUnload = UnloadOperation;
  26.  
  27.          return STATUS_SUCCESS;
  28. }
  29.  
  30. NTSTATUS CtlCreate(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  31. {
  32.          Irp->IoStatus.Status=STATUS_SUCCESS;
  33.          Irp->IoStatus.Information=0;
  34.          IoCompleteRequest(Irp,IO_NO_INCREMENT);
  35.          return STATUS_SUCCESS;
  36. }     
  37.  
  38. NTSTATUS CtlClose(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  39. {
  40.          Irp->IoStatus.Status=STATUS_SUCCESS;
  41.          Irp->IoStatus.Information=0;
  42.          IoCompleteRequest(Irp,IO_NO_INCREMENT);
  43.          return STATUS_SUCCESS;
  44. }
  45.  
  46. VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject)
  47. {
  48.          PDEVICE_OBJECT  deviceObject = pDriverObject->DeviceObject;
  49.          UNICODE_STRING  uniWin32NameString;
  50.          RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME );
  51.          IoDeleteSymbolicLink( &uniWin32NameString );
  52.          IoDeleteDevice( deviceObject );
  53.          return;
  54. }
  55.  
  56. NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  57. {
  58.          PIO_STACK_LOCATION pIrpStack;
  59.          PUSHORT pIOBuffer;
  60.  
  61.          USHORT Port;
  62.          USHORT ValueToPort;
  63.  
  64.          pIrpStack=IoGetCurrentIrpStackLocation(Irp);
  65.          pIOBuffer=Irp->AssociatedIrp.SystemBuffer;
  66.  
  67.          switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
  68.          {
  69.  
  70.          case IOCTL_READ:
  71.                  Port=pIOBuffer[0];
  72.                  pIOBuffer[0]=READ_PORT_UCHAR((PUCHAR)Port);
  73.                  Irp->IoStatus.Information=2;
  74.                  break;
  75.  
  76.          case IOCTL_WRITE:
  77.                  Port=pIOBuffer[0];
  78.                  ValueToPort=pIOBuffer[1];
  79.                  WRITE_PORT_USHORT((PUSHORT)Port,(USHORT)ValueToPort);
  80.                  Irp->IoStatus.Information=0;
  81.                  break;
  82.  
  83.          }
  84.  
  85.          Irp->IoStatus.Status=STATUS_SUCCESS;
  86.          IoCompleteRequest (Irp,IO_NO_INCREMENT);
  87.          return STATUS_SUCCESS;
  88. }


так вот ..
компилю .. беру запускаю через KmdManager
из набора KmdKit..

драйвер запускается замечательно
но при попытке отослать ему через этот менеджер управляющий код к примеру 800 или 801
выдается сообщение (менеджером)
каннот гет дривер хандле
а в лог идет запись контрол файл неудается найти указаный файл

кто знает в чем грабли ?



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 30 апреля 2012 13:31
· Личное сообщение · #2

Открываешь дос-девайс, надеюсь?
Возьми старую утиль, типа NtObjectView и посмотри доступные устройства.

-----
старый пень





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 апреля 2012 15:11
· Личное сообщение · #3

У меня смутное чувство, что слеши в строках надо экранировать.

| Сообщение посчитали полезным: Dart Sergius, Cigan

Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 апреля 2012 16:44
· Личное сообщение · #4

в результате экспериментов выяснилось что походу косячит сама утилита KmdManager ..
написал утилитку консольную и она нормально общается с драйвером ...

тут всплыл еще вопрос кто нить в курсе как можно из драйвера!!! получить реальный адресс к примеру NtOpenProcess (в SSDT стоит хук на эту функцию )

ПыСы кстати таки да в коде
Code:
  1. #define NT_DEVICE_NAME L"\Device\NTName"
  2. #define WIN32_DEVICE_NAME L"\DosDevices\MYDRIVER"


нужно с двумя слешами имена девайсов писать




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 30 апреля 2012 18:11 · Поправил: ARCHANGEL
· Личное сообщение · #5

CKA3KA
Решили сами, что ж - похвально! Ключевым моментом в определении правильных (оригинальных) адресов сервисов является чтение этих самых адресов из ntoskrnl.exe или аналогичного с диска, т.к. имя этого файла может варьироваться. Сделать это проще из юзермода, но если нужно чисто из драйвера, то можно и так. Для начала следует определить полный путь к нашей версии ntoskrnl.exe. Это можно сделать так:

Code:
  1. ZwQuerySystemInformation(SystemModuleInformation,TheBuffer,
  2.                                    Needsize*sizeof(SYSTEM_MODULE_INFORMATION),NULL);


где ранее был дефайн
Code:
  1. #define SystemModuleInformation 11


Первой в этом списке будет идти инфа про модуль, который, собственно, нас и интересует. Известно, что первый DWORD содержит в себе счётчик (количество) структур SYSTEM_MODULE_INFORMATION, поэтому он нам неинтересен, и его надо пропустить:

Code:
  1. OutPut = ((PBYTE) TheBuffer) + sizeof(ULONG);


Далее поле ImageName содержит адрес, но без указания буквы диска, на котором файл был расположен. В юзермоде это легко решается определением буквы через GetSystemDirectoryA, используя тот факт, что ядро лежит на то же диске, на котором и установлена ось.

Далее в ядре нам нужно поределить виртаульное семещение, по которому располагается KiServiceTable. Простейший способ это сделать - воспользоваться экспортируемым KeServiceDescriptorTable. Теперь считаем, что всё нужное у нас уже есть, теперь считаем оригинал KiServiceTable из файла на диске:

Code:
  1. KernelFileHandle = CreateFileA((LPSTR) &(SysInfo ->KernelLocation),GENERIC_READ,
  2.                         FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
  3.                  if (KernelFileHandle != INVALID_HANDLE_VALUE)
  4.                  {
  5.                         KernelMapHandle = CreateFileMappingA(KernelFileHandle,NULL,PAGE_READONLY,0,0,NULL);
  6.                         if (KernelMapHandle)
  7.                         {
  8.                               KernelPointer = MapViewOfFile(KernelMapHandle,FILE_MAP_READ,0,0,0);
  9.                               if (KernelPointer)
  10.                               {
  11.                                    KernelHeaders = ImageNtHeader(KernelPointer);
  12.                                    if (KernelHeaders)
  13.                                    {
  14.                                        KernelSection = ImageRvaToSection(KernelHeaders,NULL,RVAKiServTable);
  15.                                        if (KernelSection)
  16.                                        {
  17.                                           OriginalTable = (PVOID) (((RVAKiServTable - (KernelSection ->VirtualAddress)) + 
  18.                                             KernelSection ->PointerToRawData) + (ULONG) KernelPointer);
  19.                                           TempMem = VirtualAlloc(NULL,SizeInBytes,MEM_COMMIT,PAGE_READWRITE);
  20.                                           if (TempMem)
  21.                                           {
  22.                                             if (memcpy(TempMem,OriginalTable,SizeInBytes))
  23.                                             {
  24.                                              for (= 0;I < SysInfo ->NumberOfSST;I++)
  25.                                              {
  26.                                                       ((PULONG) TempMem)[I] = ((PULONG) TempMem)[I] - 
  27.                                                               KernelHeaders ->OptionalHeader.ImageBase + 
  28.                                                               (ULONG) SysInfo ->KernelBase;
  29.                                              }


Т.е. открываем файл для чтения, мэппируем его в память, ищем, какому виртуальному адресу соответствует Raw Offset на диске (да, кстати, нужно определить не только полный путь к файлу ядра, но и его базу загрузки, но это всё тоже есть в структуре SYSTEM_MODULE_INFORMATION), далее читаем оттуда эти адреса и правим их с учётом ImageBase ядра. Теперь осталось передать этот массив правильных адресов в ядро.

Как видите - ничего такого, чего бы нельзя было бы похожим способом сделать чисто из ринг0, в этом коде нет.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 мая 2012 11:58
· Личное сообщение · #6

Ну я бы не прочь отдать эту "работу" профессионалу который сделает это быстрее и качественнее меня
но вы не отвечаете на мои запросы так что приходится ковыряться самому ..

я нашол что все делают через Ring3 и юзают волшебную функцию FindKiServiceTable
но у меня пока все умирает на стадии

Code:
  1.  HMODULE   
  2.     hKerneltemp = LoadLibraryEx(pModules->smi->ImageName+pModules->smi->ModuleNameOffset,0,DONT_RESOLVE_DLL_REFERENCES);
  3.     if( !hKerneltemp )   
  4.     {   
  5.         printf("\n\n\n ERROR: OPEN FILE FAILED. hKerneltemp = 0x%0.8X INVALID \n",hKerneltemp);
  6.         _getch();
  7.         return 0;
  8.     }


ПыСЫ если всетаки надумаете пишите




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 01 мая 2012 15:11
· Личное сообщение · #7

Ну, это, по сути, одно и то же. Можно использовать LoadLibraryEx для подгрузки в адресное пространство ntoskrnl.exe, а можно CreateFile+CreateFileMapping+MapViewOfFile. Флаг DONT_RESOLVE_DLL_REFERENCES позволяет так подгрузить модуль, чтоб тот не начал выполнять свою DllMain. Первый параметр для LoadLibraryEx - это, что вполне логично, имя модуля. Вот и смотрите код, который это имя генерирует. А эта "волшебная" FindKiServiceTable - я уверен - не что иное, как изложенная выше методика.

Раз уж пошло такое дело - не могли б вы максимально подробно объяснить, что вам требуется сделать и как. Т.е. если всё нужно сделать из драйвера, то как этот драйвер будет стартовать, т.е. кто его будет устанавливать, запускать и т.д. Если доускается юзать ещё и ринг3, то какова будет его роль и т.д.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 31 мая 2012 21:54
· Личное сообщение · #8

Не хочу открывать новую тему спрошу тут возник вопрос :

запускаю драйвер через
RtlAdjustPrivilege
RtlInitUnicodeString

в реестр вношу \Registry\Machine\SYSTEM\CurrentControlSet\Services

NtLoadDriver

драйвер прекрасно стартует и работает ..
но когда использую
RtlAdjustPrivilege
RtlInitUnicodeString

в реестре сношу \Registry\Machine\SYSTEM\CurrentControlSet\Services

NtUnLoadDriver

он не выгружается !!!!

есть мысли в чем грабли




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 31 мая 2012 21:58
· Личное сообщение · #9

CKA3KA
Ага, есть. DriverUnload в дровине не реализован. И включать привелегию загрузки драйвера второй раз уже не нужно, одного раза достаточно. И последовательность действий должна быть другая - вначале надо NtUnloadDriver, а потом строки с реестра сносить, а вообще правильнее было бы Service Control Manager, а не через Native API.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 июня 2012 22:17
· Личное сообщение · #10

Новая хитрая проблема
в драйвере выгрузку делаю

VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT deviceObject = pDriverObject->DeviceObject;
UNICODE_STRING uniWin32NameString;
RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME );
IoDeleteSymbolicLink( &uniWin32NameString );
IoDeleteDevice( deviceObject );
return;
}


а в DriverEntry

добавил

RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME);
RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME);

IoDeleteSymbolicLink(&uniWin32Name);

в WinXP также некорректно работает (невыгружается) в виндах версии вые все ОК

это карма какаято


 eXeL@B —› Программирование —› Почемуто не идет управление
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати