Припитомување USB/IP

Редовно се појавува задачата за поврзување на USB-уред со оддалечен компјутер преку локална мрежа. Подолу е историјата на моите пребарувања во оваа насока и патот до готово решение засновано на проект со отворен код USB/IP со опис на пречките внимателно поставени од различни луѓе на оваа патека, како и начини за нивно заобиколување.

Прв дел, историски

Ако машината е виртуелна, сето ова е лесно. Функционалноста за препраќање преку USB од домаќинот до виртуелната машина се појави во VMWare 4.1. Но, во мојот случај, безбедносниот клуч, идентификуван како WIBU-KEY, мораше да биде поврзан со различни машини во различно време, а не само со виртуелни.
Првиот круг на пребарување во 2009 година ме доведе до парче хардвер наречено TrendNet TU2-NU4
Позитивни:

  • понекогаш дури и функционира

Конс:

  • не секогаш функционира. Да речеме дека заштитниот клуч Guardant Stealth II не започнува преку него, пцуејќи се со грешката „уредот не може да се стартува“.
  • Софтверот за управување (читај: монтирање и демонтирање USB-уреди) е исклучително лош. Прекинувачи на командната линија, автоматизација - не, не сме слушнале. Сè е направено со вашите раце. Кошмар.
  • Контролниот софтвер го бара самиот хардвер на мрежата преку емитување, така што работи само во еден сегмент од мрежата. Не можете рачно да ја одредите IP адресата на хардверот. Дали хардверот е на друга подмрежа? Тогаш имате проблем.
  • Програмерите се откажаа од уредот, испраќањето извештаи за грешки е бескорисно.

Вториот круг се случи во не толку далечно време и ме доведе до темата на статијата - USB/IP проект. Привлекува со својата отвореност, особено што момците од ReactOS Потпишаа драјвер за Windows, па сега и на x64 се работи без никакви патерици како тест режим. За што голема благодарност до тимот на ReactOS! Сè звучи убаво, ајде да се обидеме да го почувствуваме, дали е навистина така? За жал, самиот проект е исто така напуштен и не можете да сметате на поддршка - но таму каде што нашата не исчезна, изворниот код е таму, ние ќе го откриеме!

Втор дел, сервер-Linux

USB/IP сервер што споделува USB уреди преку мрежа може да се инсталира само во оперативен систем базиран на Linux. Па, Linux е Linux, инсталирајте го Debian 8 на виртуелната машина во минимална конфигурација, стандардно движење на раката:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Основана. Тогаш Интернетот сугерира дека треба да го преземете модулот usbip, но - здраво, прво гребло. Не постои таков модул. Тоа е затоа што повеќето од прирачниците на мрежата се однесуваат на постарата гранка 0.1.x, а во најновата 0.2.0, usbip модулите имаат различни имиња.

Затоа:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Па, ајде да ги додадеме следните линии во /etc/modules за да ги вчитаат автоматски кога ќе се стартува системот:

usbip-core
usbip-host
vhci-hcd

Ајде да го стартуваме usbip серверот:

sudo usbipd -D

Понатаму, универзалната мудрост ни кажува дека usbip доаѓа со скрипти кои ни овозможуваат да управуваме со серверот - да покажеме кој уред ќе го сподели преку мрежата, да го види статусот итн. Овде нè чека уште една градинарска алатка - овие скрипти во гранката 0.2.x, повторно, се преименувани. Можете да добиете листа на команди користејќи

sudo usbip

Откако ќе го прочитате описот на командите, станува јасно дека за да го сподели потребниот USB уред, usbip сака да го дознае неговиот Bus ID. Почитувани гледачи, гребло број три во арената: ИД на автобусот што ќе ни го даде lsusb (се чини најочигледен начин) - не и одговара! Факт е дека usbip игнорира хардвер како USB хабови. Затоа, ќе ја користиме вградената команда:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Забелешка: овде и понатаму во списоците ќе опишам сè користејќи го примерот на мојот специфичен USB клуч. Вашето име на хардвер и парот VID:PID може и ќе бидат различни. Мојот се вика Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Сега можеме да го споделиме нашиот уред:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Ура, другари!

user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

Три здравје, другари! Серверот го сподели хардверот преку мрежата и можеме да го поврземе! Останува само да се додаде автостарт на usbip демонот во /etc/rc.local

usbipd -D

Трет дел, од страна на клиентот и збунувачки

Веднаш се обидов да го поврзам споделениот уред преку мрежата со машина што работи со Debian на истиот сервер и сè беше совршено поврзано:

sudo usbip attach --remote=localhost --busid=1-1

Ајде да преминеме на Windows. Во мојот случај тоа беше Windows Server 2008R2 Standard Edition. Официјалниот прирачник бара од вас прво да го инсталирате драјверот. Постапката е совршено опишана во readme вклучена со клиентот на Windows, правиме сè како што е напишано, сè функционира. Работи и на XP без никакви тешкотии.

Откако го распакувавме клиентот, се обидуваме да го монтираме нашиот клуч:

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

О, ох. Нешто тргна наопаку. Ајде да ја искористиме вештината на Google. Има фрагментарни споменувања дека нешто не е во ред со константите; во делот на серверот, програмерите ја сменија верзијата на протоколот кога се префрлија на верзијата 0.2.0, но во клиентот Win заборавија да го направат ова. Предложеното решение е да се смени константата во изворниот код и повторно да се изгради клиентот.

Но, навистина не сакам да го преземам Visual Studio за оваа постапка. Но, јас го имам стариот добар Hiew. Во изворниот код, константата се декларира како двоен збор. Ајде да бараме 0x00000106 во датотеката, заменувајќи ја со 0x00000111. Не заборавајте, редоследот на бајти е обратен. Резултатот е два натпревари, закрпиме:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Ааааааа... да!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

Ова можеше да биде крајот на приказната, но музиката не свиреше долго. Откако го рестартирав серверот, открив дека уредот на клиентот не е монтиран!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Тоа е се. Дури и сезнајниот Гугл не можеше да ми одговори на ова. И во исто време, командата за прикажување на уредите достапни на серверот сосема правилно покажува - тука е, клучот, можете да го монтирате. Се обидувам да монтирам од Linux - работи! Што ако се обидеме сега од Windows? О хорор - функционира!

Последното гребло: нешто не беше напишано во кодот на серверот. Кога споделувате уред, тој не го чита бројот на USB дескриптори од него. И кога монтирате уред од Linux, ова поле се пополнува. За жал, запознаен сум со развојот на Линукс на ниво „направи и и направи инсталирање“. Затоа, проблемот беше решен со користење на прилично валкан хак - додавање на /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Завршен дел

По одредено искушение, тоа функционира. Посакуваното е постигнато, сега клучот може да се монтира на кој било компјутер (и откачен, се разбира, исто така), вклучително и надвор од сегментот за емитување на мрежата. Ако сакате, можете да го направите ова користејќи скрипта за командна школка. Она што е убаво е што задоволството е апсолутно бесплатно.
Се надевам дека моето искуство ќе им помогне на хакерите да го заобиколат греблоот што ми е втиснат на челото. Ви благодариме за вниманието!

Извор: www.habr.com

Додадете коментар