Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

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

Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 ноября 2014 18:47
· Личное сообщение · #1

Пытаюсь загрузить драйвер через сабж, создал нужные ветки реестра, скопировал драйвер в system32/drivers, при загрузке драйвера возникает сообщение, что винда заблокировала неподписанный драйвер - но сам драйвер не загружается! NtLoadDriver возвращает 0, проверку подписи дров, ессно. отключил. Через SCM драйвер грузится нормально.

В чем может быть причина? Винда - х64, 8.1



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 12 ноября 2014 19:42 · Поправил: dosprog
· Личное сообщение · #2

KillerX пишет:
Пытаюсь загрузить драйвер через сабж, создал нужные ветки реестра, скопировал драйвер в system32/drivers, при загрузке драйвера возникает сообщение, что винда заблокировала неподписанный драйвер - но сам драйвер не загружается! NtLoadDriver возвращает 0, проверку подписи дров, ессно. отключил. Через SCM драйвер грузится нормально.

В чем может быть причина? Винда - х64, 8.1

Причина в том, что драйвер не подписан.
Либо подпишите драйвер (есть утилита в сети для этой цели),
либо при начальной загрузке Windows выберите (по F8) пункт меню "Загружать неподписанные драйвера".
Мне тоже не удавалось насовсем отключить эту опцию, следуя рекомендациям.
Времени ковыряться на чужой машине не было - грузился как описано выше, через выбор пункта в загрузочном меню.

Посмотрите материалы по теме "Driver Signing". Например, --> тут <--





Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 ноября 2014 21:11
· Личное сообщение · #3

Интересно, я даже не знал, что есть утилита.

Но вопрос в том, что я именно включал при загрузке оси опцию загружать неподписанные дрова!!!) Я же говорю - прикол в том, что через scm дров прекрасно загружается и работает)

Добавлено спустя 1 час 6 минут


Так... попытаюсь рассказать подробнее. Загружаю винду через параметры загрузки, отключающие проверку подписей дров. При таком раскладе при попытке загрузить неподписанный драйвер все равно возникает сообщение, что дескать винда заблокировала установку неподписаного дрова, но по факту дров загружается. Пробовал загружать через SCM - работает, дров есть в списке загруженных драйверов.

Когда загружаю драйвер, используя NtLoadDriver, то так же возникает это же сообщение от винды - но драйвер по факту не загружается. Использую для загрузки такой код:

Code:
  1.  
  2.          DWORD dwType = SERVICE_KERNEL_DRIVER;
  3.          DWORD dwStart = SERVICE_DEMAND_START;
  4.          HKEY hKey;
  5.          WCHAR szMain[512] = { 0 };
  6.          WCHAR szImgPath[512] = { 0 };
  7.          wchar_t szRegPath[512] = { 0 };
  8.  
  9.          wsprintfW(szMain, L"%s%s", L"SYSTEM\CurrentControlSet\Services\", szDriverName);
  10.          wsprintfW(szImgPath, L"%s%s", L"\??\", pszDestSys);
  11.          if (RegCreateKeyW(HKEY_LOCAL_MACHINE, szMain, &hKey) == ERROR_SUCCESS) cout << "GoodReg\n"; else cout << "Error code " << GetLastError();
  12.  
  13.          RegSetValueExW(hKey, L"DisplayName", 0, REG_SZ, (LPBYTE)szDriverName, (DWORD)lstrlenW(szDriverName) * 2);
  14.          RegSetValueExW(hKey, L"ImagePath", 0, REG_EXPAND_SZ, (LPBYTE)szImgPath, (DWORD)lstrlenW(szImgPath) * 2);
  15.          RegSetValueExW(hKey, L"Type", 0, REG_DWORD, (LPBYTE)&dwType, (DWORD)sizeof(dwType));
  16.          RegSetValueExW(hKey, L"Start", 0, REG_DWORD, (LPBYTE)&dwStart, (DWORD)sizeof(dwStart));
  17.  
  18. TOKEN_PRIVILEGES tp = { 0 };
  19.          HANDLE hToken = 0;
  20.          NTSTATUS status;
  21.  
  22.          tp.PrivilegeCount = 1;
  23.          tp.Privileges[0].Attributes = 2;
  24.          status = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
  25.          if (status == 0) cout << "OpenProcessToken filed\n";
  26.  
  27.          status = LookupPrivilegeValue(NULL, L"SeLoadDriverPrivilege", &tp.Privileges[0].Luid);
  28.          if (status == 0) cout << "LookupPrivilegeValue filed\n";
  29.  
  30.          status = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
  31.          if (status == 0) cout << "AdjustTokenPrivileges filed\n";
  32.  
  33.          CloseHandle(hToken);
  34.  
  35. NTSTATUS status;
  36.          UNICODE_STRING driverServicePath = { 0 };
  37.  
  38.  
  39.          RtlInitUnicodeString(&driverServicePath, pszDestSys);
  40.  
  41.          status = NtLoadDriver(&driverServicePath);
  42.          if (status == 0x00000000)
  43.          printf("NtLoadDriver STATUS_SUCCESS\n");
  44.  




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 12 ноября 2014 23:25 · Поправил: dosprog
· Личное сообщение · #4

KillerX пишет:
Интересно, я даже не знал, что есть утилита.


Собственно, для работы таких "непроверенных" подписанных драйверов в системе должен быть всё равно включён "тестовый режим". Я не экспериментировал с этой всей фигнёй. Вообще, по-моему, это натуральное скотство микрософтовское и стоило бы выковырять бообще такое счастье из системы, но, повторюсь, для этого нужна собственно система и желание\время с этим возиться.

Ну, попробуйте включить у себя этот самый "тестовый режим" и "подписать драйвер непроверенной подписью". Что получится..
--> Вот <--статья на эту тему.

KillerX пишет:
Добавлено спустя 1 час 6 минут


Я столкнулся с этой лажей из-за драйвера эмулятора донгла к одному софту под Win7/64bit.
При загрузке по F8 c "отключением проверки подписи" та система грузила без вопросов ВСЕ драйвера - и подписанные, и неподписанные, и динамически и при начальной загрузке. Никаких сообщений не выдавалось.
У меня даже мелькнула мысль поковырять загрузчик Windows для дефолтного запуска режима "без проверки подписи" (как сделал тот чел в статье выше для Vista). Но на чужой машине не было возможностей этим заниматься.



| Сообщение посчитали полезным: KillerX


Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 13 ноября 2014 13:36 · Поправил: Gideon Vi
· Личное сообщение · #5

раз

d44a_13.11.2014_EXELAB.rU.tgz - Driver Signature Enforcement Overrider v1.3b.part1.rar

Добавлено спустя
два

6812_13.11.2014_EXELAB.rU.tgz - Driver Signature Enforcement Overrider v1.3b.part2.rar

Как отладить драйвер на windows 7 x64?

| Сообщение посчитали полезным: KillerX, dosprog

Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 ноября 2014 15:26 · Поправил: KillerX
· Личное сообщение · #6

Спасибо за программу - буду пробовать)

А почему тогда неподписанный драйвер средствами SCM загружается?)



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 13 ноября 2014 19:22 · Поправил: dosprog
· Личное сообщение · #7

Gideon Vi пишет:
Как отладить драйвер на windows 7 x64?


Мне нравится --> Такое решение <--
Но это, к сожалению, выход только на моей машине, перенести куда-то потом софтину проблематично.

P.S.
Кстати, аттач с dseo13b вышел нерабочим.





Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 ноября 2014 20:10
· Личное сообщение · #8

dosprog пишет:
Мне нравится --> Такое решение <--


Интересно, будет ли в 8-ке работать. Хотя врятли, конечно(

dosprog пишет:
Кстати, аттач с dseo13b вышел нерабочим.


А у меня работает...) Всмысле этож 2 части рара, они у меня распаковываются в приложение, которое работает)

Добавлено спустя -58 минут
А все таки - почему же драйвер работает через SCM ?




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 14 ноября 2014 04:00
· Личное сообщение · #9

dosprog пишет:
Кстати, аттач с dseo13b вышел нерабочим.


Обновите архиватор.

Добавлено спустя -58 минут
KillerX пишет:
А все таки - почему же драйвер работает через SCM ?


что такое scm?



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 14 ноября 2014 07:56 · Поправил: dosprog
· Личное сообщение · #10

Gideon Vi пишет:
что такое scm?

Если не ошибаюсь, имеется в виду --> это <--


Gideon Vi пишет:
Обновите архиватор.

Мда.. Значит, вер.4.11 (2012 г.) уже не может распаковывать архив версии 5.11.
Головняк.






Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 14 ноября 2014 08:55
· Личное сообщение · #11

dosprog пишет:
Если не ошибаюсь, имеется в виду --> это <--


ну тогда смотреть, чего там и как. Может не стандартный способ юзается. Мну драйвера не пишет

dosprog пишет:
Мда.. Значит, вер.4.11 (2012 г.) уже не может распаковывать архив версии 5.11.


начиная с 5,хх серьезно изменился алгоритм, так что версия 5 поддерживает упаковку в обоих вариантах.



Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 ноября 2014 10:17 · Поправил: KillerX
· Личное сообщение · #12

Gideon Vi пишет:
что такое scm?


http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms685150(v=vs.85).aspx

https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BF%D0%B5%D1%82%D1%87%D0%B5%D1%80_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0%D0%BC%D0%B8

dosprog пишет:
Если не ошибаюсь, имеется в виду --> это <--


Это одна из функций менеджера. Загрузка дрова происходит так:

Code:
  1.  
  2. SC_HANDLE sch = OpenSCManager(
  3.                  NULL,
  4.                  NULL,
  5.                  SC_MANAGER_ALL_ACCESS);
  6.  
  7.          if (sch) cout << "OpenSCManager SUCCESS\n";
  8.          else
  9.                  cout << "OpenSCManager failed " << GetLastError() << "\n";
  10.  
  11.  
  12.          schService = CreateService(
  13.                  sch,
  14.                  drv_service_name,
  15.                  drv_service_description,
  16.                  SERVICE_ALL_ACCESS,
  17.                  SERVICE_KERNEL_DRIVER,
  18.                  SERVICE_DEMAND_START,
  19.                  SERVICE_ERROR_NORMAL,
  20.                  pszCurrentDest1,
  21.                  NULL,
  22.                  NULL,
  23.                  NULL,
  24.                  NULL,
  25.                  NULL);
  26.          if (schService) cout << "CreateService SUCCESS\n";
  27.          else
  28.                  printf("CreateService failed (%d)\n", GetLastError());
  29.  
  30.          if (StartService(schService, NULL, NULL)) cout << "StartService SUCCESS\n";
  31.          else
  32.                  printf("StartService failed (%d)\n", GetLastError());
  33.  


Gideon Vi пишет:
ну тогда смотреть, чего там и как. Может не стандартный способ юзается.


В том то и дело, что загрузка через SCM - как раз стандартный способ загрузки. Но фишка в том, что вроде как он делает как раз то, что и мой первоначальный код - повышает привилегии до права загрузки драйвера, а потом вызывает ту же NtLoadDriver(); Кстати через SCM работает KmdManager от Four-F




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 14 ноября 2014 16:03
· Личное сообщение · #13

Потыкайте палочкой Арчера, он в драйверах жутко грамотный.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 14 ноября 2014 17:56 · Поправил: dosprog
· Личное сообщение · #14

Раз стандартным способом драйвер грузится, тогда зачем ещё что-то изобретать и пытаться эмулировать этот стандартный способ?



Ранг: 10.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 ноября 2014 20:53
· Личное сообщение · #15

Gideon Vi пишет:
Потыкайте палочкой Арчера, он в драйверах жутко грамотный.


Вы имеете ввиду через личку?

dosprog пишет:
Раз стандартным способом драйвер грузится, тогда зачем ещё что-то изобретать и пытаться эмулировать этот стандартный способ?


Вообще просто хотелось поднабить скиллов по поводу загрузки дровин


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


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