Taming USB/IP

Oppgaven med å koble en USB-enhet til en ekstern PC via et lokalt nettverk oppstår regelmessig. Under snittet er historien til mine søk i denne retningen, og veien til en ferdig løsning basert på et åpen kildekode-prosjekt USB/IP med en beskrivelse av hindringene nøye installert av forskjellige personer langs denne stien, samt måter å omgå dem.

Del én, historisk

Hvis maskinen er virtuell, er alt dette enkelt. Funksjonaliteten til USB-videresending fra verten til den virtuelle maskinen dukket opp i VMWare 4.1. Men i mitt tilfelle måtte sikkerhetsnøkkelen, identifisert som WIBU-KEY, kobles til forskjellige maskiner til forskjellige tider, og ikke bare virtuelle.
Den første søkerunden tilbake i 2009 førte meg til en maskinvare kalt TrendNet TU2-NU4
Pros:

  • noen ganger fungerer det til og med

Cons:

  • fungerer ikke alltid. La oss si at Guardant Stealth II-beskyttelsesnøkkelen ikke starter gjennom den, og sverger med feilen "enheten kan ikke startes."
  • Programvaren for å administrere (les: montering og avmontering av USB-enheter) er ekstremt dårlig. Kommandolinjebrytere, automatisering - nei, vi har ikke hørt. Alt gjøres med hendene. Mareritt.
  • Kontrollprogramvaren søker etter selve maskinvaren på nettverket ved å kringkaste, så den fungerer kun innenfor ett kringkastingssegment av nettverket. Du kan ikke spesifisere IP-adressen til maskinvaren manuelt. Er maskinvaren på et annet subnett? Da har du et problem.
  • Utviklerne har gitt opp enheten, å sende feilrapporter er ubrukelig.

Den andre runden skjedde i en tid ikke så fjern, og førte meg til emnet for artikkelen - USB/IP-prosjekt. Tiltrekker med sin åpenhet, spesielt siden gutta fra ReactOS De signerte en driver for Windows, så nå fungerer alt på x64 uten krykker som testmodus. Tusen takk til ReactOS-teamet! Alt høres vakkert ut, la oss prøve å føle det, er det virkelig slik? Dessverre er selve prosjektet også forlatt, og du kan ikke regne med støtte - men der vår ikke har forsvunnet, er kildekoden der, vi finner ut av det!

Del to, server-Linux

En USB/IP-server som deler USB-enheter over et nettverk kan bare installeres i et Linux-basert operativsystem. Vel, Linux er Linux, installer Debian 8 på den virtuelle maskinen i en minimal konfigurasjon, standard håndbevegelse:

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

Etablert. Da foreslår Internett at du må laste ned usbip-modulen, men – hei, første rake. Det finnes ingen slik modul. Dette er fordi de fleste manualene på nettverket refererer til den eldre grenen 0.1.x, og i siste 0.2.0 har usbip-modulene forskjellige navn.

derfor:

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

Vel, la oss legge til følgende linjer i /etc/modules for å laste dem automatisk når systemet starter:

usbip-core
usbip-host
vhci-hcd

La oss starte usbip-serveren:

sudo usbipd -D

Videre forteller den universelle visdommen oss at usbip kommer med skript som lar oss administrere serveren – vise hvilken enhet den vil dele over nettverket, se status, og så videre. Her venter et annet hageverktøy på oss - disse skriptene i 0.2.x-grenen har igjen fått nytt navn. Du kan få en liste over kommandoer ved å bruke

sudo usbip

Etter å ha lest beskrivelsen av kommandoene, blir det klart at for å dele den nødvendige USB-enheten, ønsker usbip å finne ut sin buss-ID. Kjære seere, rake nummer tre i arenaen: Buss-IDen som vil gi oss lsusb (det virker som den mest åpenbare måten) - passer henne ikke! Faktum er at usbip ignorerer maskinvare som USB-huber. Derfor vil vi bruke den innebygde kommandoen:

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

Merk: her og videre i listene vil jeg beskrive alt ved å bruke eksemplet på min spesifikke USB-nøkkel. Maskinvarenavnet ditt og VID:PID-paret kan og vil være annerledes. Min heter Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nå kan vi dele enheten vår:

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

Hurra, kamerater!

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)

Tre hurra, kamerater! Serveren har delt maskinvaren over nettverket, og vi kan koble den til! Alt som gjenstår er å legge til autostart av usbip-demonen i /etc/rc.local

usbipd -D

Del tre, klient-side og forvirrende

Jeg prøvde umiddelbart å koble den delte enheten over nettverket til en maskin som kjører Debian på samme server, og alt koblet perfekt:

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

La oss gå videre til Windows. I mitt tilfelle var det Windows Server 2008R2 Standard Edition. Den offisielle håndboken ber deg installere driveren først. Prosedyren er perfekt beskrevet i readme som følger med Windows-klienten, vi gjør alt som skrevet, alt ordner seg. Det fungerer også på XP uten problemer.

Etter å ha pakket ut klienten prøver vi å montere nøkkelen vår:

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

Åh åh. Noe gikk galt. La oss bruke Google-ferdighetene. Det er fragmentariske omtaler om at noe er galt med konstantene; i serverdelen endret utviklerne protokollversjonen når de flyttet til versjon 0.2.0, men i Win-klienten glemte de å gjøre dette. Den foreslåtte løsningen er å endre konstanten i kildekoden og gjenoppbygge klienten.

Men jeg vil virkelig ikke laste ned Visual Studio for denne prosedyren. Men jeg har den gode gamle Hiew. I kildekoden er konstanten erklært som et dobbeltord. La oss se etter 0x00000106 i filen, og erstatte den med 0x00000111. Ikke glem, byte-rekkefølgen er omvendt. Resultatet er to kamper, vi lapper:

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

Aaaand... ja!

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

Dette kunne vært slutten på historien, men musikken spilte ikke lenge. Etter omstart av serveren oppdaget jeg at enheten på klienten ikke var montert!

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

Det er alt. Selv den allvitende Google kunne ikke svare på dette for meg. Og samtidig viser kommandoen for å vise enhetene som er tilgjengelige på serveren ganske riktig - her er den, nøkkelen, du kan montere den. Jeg prøver å montere fra Linux - det fungerer! Hva om vi prøver nå fra Windows? Å grusomt - det fungerer!

Den siste raken: noe ble ikke skrevet i serverkoden. Når du deler en enhet, leser den ikke antall USB-beskrivelser fra den. Og når du monterer en enhet fra Linux, fylles dette feltet ut. Dessverre er jeg kjent med Linux-utvikling på nivået "make && make install". Derfor ble problemet løst ved å bruke et ganske skittent hack - å legge til /etc/rc.local

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

Siste del

Etter noen prøvelser fungerer det. Ønsket er oppnådd, nå kan nøkkelen monteres på hvilken som helst PC (og avmontert selvfølgelig også), inkludert utenfor kringkastingssegmentet til nettverket. Hvis du vil, kan du gjøre dette ved å bruke et kommandoskallskript. Det som er fint er at gleden er helt gratis.
Jeg håper at min erfaring vil hjelpe hackerne å komme seg rundt raken som er innprentet i pannen min. Takk for din oppmerksomhet!

Kilde: www.habr.com

Legg til en kommentar