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

 eXeL@B —› Программирование —› энумерация USB-устройств в драйвере
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 00:50
· Личное сообщение · #1

Собственно возникла задача из кода драйвера определять наличие подключенных юсб-устройств и получить от них для начала хоть дескрипторы. Познания в написании драйверов ближе к начальному уровню, поэтому прошу сильно не пинать. Как вариант решения вижу (слыхал) нужно опросить хабы на наличие подключенных к портам устройств, но вот как это реализовать в коде ring0 не знаю. Подскажите, с чего начинать, а может есть готовые примеры? Или юсб-устройства можно тоже получить по перебору типа phisicalDevice?



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 01:10
· Личное сообщение · #2

Попробую немного уточнить детали, если перебирать например phisicalDevice в ринг3, то юсб-флеха обнаруживается, а юсб хасп ключ нет, почему? надо находить именно все устройства юсб



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 03 марта 2011 01:34
· Личное сообщение · #3

Tolkin пишет:

Попробую немного уточнить детали, если перебирать например phisicalDevice в ринг3, то юсб-флеха обнаруживается, а юсб хасп ключ нет, почему?


скорее всего не обнаруживается потому, что в ринг3 перебираете



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 01:55
· Личное сообщение · #4

не, не думаю что это зависит от уровня перебора, ибо все PhysicalDrive мы видим в проводнике хотя-бы, а хасп ключи там никогда не появляются, это видимо определяется свойствами подключаемого девайса(дескрипторами например или еще как-то). Поэтому думаю перебор по PhysicalDrive не подходит, ибо инетересуют в основном то ключи.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 05:24 · Поправил: PE_Kill
· Личное сообщение · #5

NikolayD пишет:
скорее всего не обнаруживается потому, что в ринг3 перебираете

Потому что интерфейсы устройств разные, соответственно и CLASS GUID другой. Это то же самое что искать клавиатуру в мониторах.

ЗЫ Из ring3 нужно работать с PnP

Code:
  1.   // Get a handle for the Plug and Play node and request currently active HID devices
  2.   PnPHandle := SetupDiGetClassDevsA(@НУЖНЫЙ_ГУИД_КЛАССА, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
  3.   if PnPHandle = Pointer(INVALID_HANDLE_VALUE) then  Exit;
  4.  
  5.   Devn := 0;
  6.   repeat
  7.     DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
  8.     // Is there a HID device at this table entry?
  9.     Success := SetupDiEnumDeviceInterfaces(PnPHandle, nil, НУЖНЫЙ_ГУИД_КЛАССА, Devn, DeviceInterfaceData);
  10. ***************************


-----
Yann Tiersen best and do not fuck


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


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

Создано: 03 марта 2011 09:49
· Личное сообщение · #6

Tolkin

Даже когда вот так обходите, то не видите хасп?
--> Тутор <--

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





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

Создано: 03 марта 2011 11:35 · Поправил: DenCoder
· Личное сообщение · #7

Тутор грамотный, но я об этом уже давно смекнул... Как в продолжение мысли, в подразделе Services можно найти службу хаспа, где в подразделе Enum можно найти ключ Count, а за ним нужный подключ в root!!!

-----
IZ.RU




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

Создано: 03 марта 2011 11:56
· Личное сообщение · #8

Нужно проенумить хабы, а затем послать им запрос на подключенные устройства.

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





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

Создано: 03 марта 2011 12:17
· Личное сообщение · #9

И раз уж нужно реализовывать в р0, то без виртуальных машин не обойтись. А раз так, то ставьте WMware нпример, создавайте вм, ставьте ось, ставьте WinDbg подключайтесь к вм через виртуальный com-порт или usb и дебажьте, должно во мнгом помочь.

Для работы с реестром обычно используют сервисы nt!ZwQueryKey, nt!ZwCreateKey, nt!ZwOpenKey... Для получения хендла хаспа можно использовать nt!ZwCreateFile.

-----
IZ.RU





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

Создано: 03 марта 2011 12:41
· Личное сообщение · #10

Какова конечная цель всего этого? Ну, вот, допустим, опросили хабы, получили список девайсов, а что дальше?

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





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 12:44
· Личное сообщение · #11

Драйвер/Фильтр/Сниффер

-----
Yann Tiersen best and do not fuck




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 12:57
· Личное сообщение · #12

Ринг3 варианты как-бы не нужны, ибо там все намного проще(через те же CLASS GUID) и есть реализовано.

- По поводу парсинга реестра из драйвера - вполне приемлимый вариант, т.е. ищем символьные имена типа \??\USB#VID_0529&PID_0001#5&22a20d61&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, а дальше через ZwCreateFile пробуем открыть устройство, и если все нормально то можно слать IOCTL. Недостаток такого способа - мы будем также нумеровать и все виртуальные юсб мули, а они в даной задаче не нужны.

- r_e пишет:
Нужно проенумить хабы, а затем послать им запрос на подключенные устройства.

можно этот способ поподробней? т.е. опять же какие имена перебирать для открытия хабов и какие потом запросы слать. Но если я правильно знаю через информацию с порта хаба можно получить только дескрипторы устройства? можно ли через опрос хаба получить символьное имя присоединенного устройства(или какое другое), чтоб открыть его потом через ZwCreateFile, или надо идти какими другими обходными путями?



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 12:59 · Поправил: Tolkin
· Личное сообщение · #13

ARCHANGEL пишет:
Какова конечная цель всего этого?

Конечная цель - работать из драйвера с реальным донглом (т.е. вызывать его функи)
т.е.
1. найти необходимое имя реального девайса для его открытия.
2. пробовать работать с донглом минуя его родные дрова (только куда надо слать запросы в таком случае и то ли устройство мы открываем, чтоб (пример хаспа) слать уже сам пакет URB_FUNCTION_VENDOR_DEVICE)
ЗЫ. хотя после открытия устройства и посыла ему IOCTL хз как он пойдет, через родные дрова хаспа или нет.
Кстати тот же хасп имеет типа 3 разных символьных имени, соответственно вероятно и пути следования пакетов будут разные.



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

Создано: 03 марта 2011 13:38
· Личное сообщение · #14

Tolkin
Можете попробовать usb_lib для реализации своих фантазий.
Для каждого найденного через реестр устройства отсылаете GET_DESCRIPTOR с нужным типом и получаете символьное имя.

Работать с усб устройствами мимо их родных дров - не самый надежный способ. И если вы таким образом собираетесь обойти эмуляторы могу вас огорчить - ничего не выйдет.

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




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 03 марта 2011 15:19
· Личное сообщение · #15

r_e пишет:
И если вы таким образом собираетесь обойти эмуляторы

Не, у меня суть не в этом, да пусть себе будут, мне нужен сам механизм, открыть нужной девайс и иметь возможность слать в него ioctl из драйвера



Ранг: 128.8 (ветеран), 21thx
Активность: 0.060.05
Статус: Участник

Создано: 03 марта 2011 18:59
· Личное сообщение · #16

Tolkin

А чем не нравится ответ r_e ?

Можете попробовать usb_lib для реализации своих фантазий.
Для каждого найденного через реестр устройства отсылаете GET_DESCRIPTOR с нужным типом и получаете символьное имя.





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

Создано: 03 марта 2011 20:40 · Поправил: DenCoder
· Личное сообщение · #17

Tolkin пишет:
т.е. ищем символьные имена типа \??\USB#VID_0529&PID_0001#5&22a20d61&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}


DenCoder пишет:
в подразделе Services можно найти службу хаспа, где в подразделе Enum можно найти ключ Count, а за ним нужный подключ в root!!!

служба хаспа - одно, служба эмуля - другое, другими словами они в разных ветках!

Tolkin пишет:
Подскажите, с чего начинать

Прочитать все про kernel services, порядок загрузки драйверов... Ключом к поиску может служить EnumServicesStatusEx, например.

Tolkin пишет:
а может есть готовые примеры?

Должны быть. Но не рекомендую изучать kernel-простанство по исходникам, лучше сначала подготовиться теоретически. Только в "экстренных" случаях можно по кодам дров учиться, но и то параллельно долбить теоретическую часть! Хотя бы, связанную с используемыми сервисами.

-----
IZ.RU




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 04 марта 2011 01:53
· Личное сообщение · #18

Нашел пример (в драйвере от программы) где идет энумерация через хабы, кода там не много, так что думаю разберусь.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 04 марта 2011 14:23 · Поправил: Hexxx
· Личное сообщение · #19

Если хочется общаться на самом низком уровне то через UsbBuildGetDescriptorRequest UsbBuildInterruptOrBulkTransferRequest и дальше фигачить в пайп хаба. Как найти пайп хаба не знаю, не пробовал. Обычно хватало энумерации девайсов более высокоуровневыми методами.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 04 марта 2011 15:29
· Личное сообщение · #20

Нарыл еще полезный материал по этой теме. Оказывается, полезный и рабочий код режима ядра можно найти только в сорсах например руткитов ) Вот один такой мне попался, там реализована работа (кроме всего прочего) с файлами через Irp пакеты, на примере которых все становится намного понятней.
А код энумерации хабов с получением обьектов донглов нашел в одной проге с драйвером - код используется для детектирования эмуляторов.
Вообщем вот такой винегрет )



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 05 марта 2011 21:29
· Личное сообщение · #21

Пример, нписанный под х32 бсодит при х64.
Подозрение что структуры IRP пакетов для х32 и 64 разные? (например та же URB_CONTROL_DESCRIPTOR_REQUEST в иде имеют разные длины)
ну структуры я поменяю, вопрос вот в чем.
1. Формируем новый IRP через IoBuildDeviceIoControlRequest
2. Отдельно формируем нужный нам URB_CONTROL_DESCRIPTOR_REQUEST
3. Подставляем указатель на наш URB в сам IRP. Вот здесь я немного запутался, куда именно его подставить в х64. в моем варианте в х32 ставится сюда
Code:
  1. *((_DWORD *)irp->Tail.Overlay.CurrentStackLocation - 8) = Pnew_data;

меняется ли эта точка входа в х64? и может есть имя этого параметра без смещения как тут (-8) ?



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

Создано: 06 марта 2011 00:12
· Личное сообщение · #22

Tolkin
Почитайте для начала книжки, что ли.
Данные URB должны быть в irpStack->Parameters.Others.Argument1
А игры с (CurrentStackLocation - 8) - это все от лешего.

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




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 06 марта 2011 01:08
· Личное сообщение · #23

r_e
Спасибо, уже тоже наткнулся что urb идет оттуда.
А вот эту строку (CurrentStackLocation - 8) выдала ИДА, почему так - хз, но работает. Проверю новое.
А книги я бы с удовольствием почитал бы, были бы только они толковые и было бы время ;)



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

Создано: 06 марта 2011 01:17
· Личное сообщение · #24

Tolkin
Есть такая классическая книга Уолтера Они. Программирование Windows Driver Model. 2-е издание.
То что вам ида выдала - это что-то типа заинлайненного IoSkipCurrentStackLocation. Не помню уж точно.

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





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

Создано: 06 марта 2011 09:15
· Личное сообщение · #25

r_e
Нет такого макроса IoSkipCurrentStackLocation, есть IoSkipCurrentIrpStackLocation

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




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 06 марта 2011 11:23 · Поправил: Tolkin
· Личное сообщение · #26

ARCHANGEL
да этот есть
Code:
  1. FORCEINLINE
  2. VOID
  3. IoSkipCurrentIrpStackLocation (  __inout PIRP Irp)
  4. {
  5.     ASSERT(Irp->CurrentLocation <= Irp->StackCount);
  6.     Irp->CurrentLocation++;
  7.     Irp->Tail.Overlay.CurrentStackLocation++;
  8. }

но по сути вроде не то, а похоже на
Code:
  1. FORCEINLINE
  2. VOID
  3. IoSetNextIrpStackLocation ( __inout PIRP Irp )
  4. {
  5. //This routine is invoked to set the current IRP stack location to
  6. // the next stack location, i.e. it "pushes" the stack.
  7.     ASSERT(Irp->CurrentLocation > 0);
  8.     Irp->CurrentLocation--;
  9.     Irp->Tail.Overlay.CurrentStackLocation--;
  10. }

только непонятно зачем нужно это
ЗЫ. И если это точно вызов IoSetNextIrpStackLocation, то (-8) значит что вызываем дважды ?



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

Создано: 06 марта 2011 11:58
· Личное сообщение · #27

Я написал фигню, а вы давай поддерживать. Вяснили ж уже куда URB пихать.

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




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 06 марта 2011 12:16
· Личное сообщение · #28

r_e
мож и не фигня, я проверю.
ведь проходя по цепочке драйверов стек irp пополняется их IO_STACK_LOCATION, мы же по сути начинаем с середины этого процесса, мож поэтому и надо поставить наш IO_STACK_LOCATION типа на свое место



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 06 марта 2011 15:17
· Личное сообщение · #29

Что-то уперся я в структуру_IRP, не понять.
что там по смещению 0xE0 (смотрю в отладчике на XP SP3)? подскажите.
А то указатель на URB_CONTROL_DESCRIPTOR_REQUEST записывается именно туда, в область URB ничего не пишется, она располагается дальше.



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

Создано: 06 марта 2011 17:41
· Личное сообщение · #30

Смотри команду dt в WinDbg

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



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


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