Malsovaĝigi USB/IP

La tasko konekti USB-aparaton al fora komputilo per loka reto regule aperas. Sub la tranĉo estas la historio de miaj serĉoj en ĉi tiu direkto, kaj la vojo al preta solvo bazita sur malfermfonta projekto USB/IP kun priskribo de la obstakloj zorge instalitaj de diversaj homoj laŭ tiu ĉi vojo, kaj ankaŭ manieroj por eviti ilin.

Unua parto, historia

Se la maŝino estas virtuala, ĉio ĉi estas facila. La funkcieco de USB-sendo de la gastiganto al la virtuala maŝino aperis en VMWare 4.1. Sed en mia kazo, la sekurecŝlosilo, identigita kiel WIBU-KEY, devis esti konektita al malsamaj maŝinoj en malsamaj tempoj, kaj ne nur virtualaj.
La unua raŭndo de serĉo reen en 2009 kondukis min al peco de aparataro nomita TrendNet TU2-NU4
Pros:

  • foje ĝi eĉ funkcias

Kons:

  • ne ĉiam funkcias. Ni diru, ke la protektoŝlosilo Guardant Stealth II ne komenciĝas per ĝi, ĵurante per la eraro "la aparato ne povas esti komencita."
  • La programaro por administri (legu: muntado kaj malmuntado de USB-aparatoj) estas ege malbona. Komandliniaj ŝaltiloj, aŭtomatigo - ne, ni ne aŭdis. Ĉio estas farita per viaj manoj. Koŝmaro.
  • La kontrolprogramaro serĉas la aparataron mem sur la reto per elsendado, do ĝi funkcias nur ene de unu elsendosegmento de la reto. Vi ne povas specifi la IP-adreson de la aparataro permane. Ĉu la aparataro estas sur alia subreto? Tiam vi havas problemon.
  • La programistoj rezignis pri la aparato, sendi cimraportojn estas senutila.

La dua raŭndo okazis en tempo ne tiel malproksima, kaj kondukis min al la temo de la artikolo - USB/IP-projekto. Altiras per ĝia malfermiteco, precipe ĉar la infanoj de ReactOS Ili subskribis ŝoforon por Vindozo, do nun eĉ sur x64 ĉio funkcias sen lambastonoj kiel testreĝimo. Pro kio koran dankon al la teamo ReactOS! Ĉio sonas bele, ni provu senti ĝin, ĉu vere estas tiel? Bedaŭrinde, ankaŭ la projekto mem estas forlasita, kaj vi ne povas fidi je subteno - sed kie la nia ne malaperis, la fontkodo estas tie, ni eltrovos ĝin!

Dua parto, servilo-Linukso

USB/IP-servilo kiu kunhavas USB-aparatojn tra reto povas nur esti instalita en Linuks-bazita OS. Nu, Linukso estas Linukso, instalu Debian 8 sur la virtuala maŝino en minimuma agordo, norma manmovo:

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

Establita. Tiam la Interreto sugestas, ke vi devas elŝuti la usbip-modulon, sed - saluton, unue rake. Ne ekzistas tia modulo. Ĉi tio estas ĉar la plej multaj el la manlibroj en la reto rilatas al la pli malnova branĉo 0.1.x, kaj en la plej nova 0.2.0 la usbip-moduloj havas malsamajn nomojn.

Sekve:

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

Nu, ni aldonu la sekvajn liniojn al /etc/modules por ŝargi ilin aŭtomate kiam la sistemo komenciĝas:

usbip-core
usbip-host
vhci-hcd

Ni lanĉu la usbip-servilon:

sudo usbipd -D

Plue, la universala saĝo diras al ni, ke usbip venas kun skriptoj, kiuj ebligas al ni administri la servilon - montru kian aparaton ĝi dividos tra la reto, vidu la statuson, ktp. Jen alia ĝardenilo atendas nin - ĉi tiuj skriptoj en la branĉo 0.2.x denove estis renomitaj. Vi povas akiri liston de komandoj uzante

sudo usbip

Post legado de la priskribo de la komandoj, evidentiĝas, ke por dividi la bezonatan USB-aparaton, usbip volas eltrovi ĝian Bus-ID. Karaj spektantoj, rake numero tri en la areno: la Bus ID kiu donos al ni lsusb (ŝajnus la plej evidenta maniero) - ne konvenas al ŝi! La fakto estas, ke usbip ignoras aparataron kiel USB-nabojn. Tial ni uzos la enkonstruitan komandon:

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

Noto: ĉi tie kaj plue en la listoj mi priskribos ĉion uzante la ekzemplon de mia specifa USB-ŝlosilo. Via aparatara nomo kaj VID:PID-paro povas kaj estos malsamaj. La mia nomiĝas Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Nun ni povas dividi nian aparaton:

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

Hura, kamaradoj!

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)

Tri samideanoj, kamaradoj! La servilo dividis la aparataron tra la reto, kaj ni povas konekti ĝin! Restas nur aldoni aŭtomatan starton de la usbip-demono en /etc/rc.local

usbipd -D

Parto tri, klient-flanko kaj konfuza

Mi tuj provis konekti la komunan aparaton per la reto al maŝino kuranta Debian sur la sama servilo, kaj ĉio konektis perfekte:

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

Ni transiru al Vindozo. En mia kazo ĝi estis Windows Server 2008R2 Standard Edition. La oficiala manlibro petas vin unue instali la pelilon. La proceduro estas perfekte priskribita en la readme inkluzivita kun la Vindoza kliento, ni faras ĉion kiel skribite, ĉio funkcias. Ĝi ankaŭ funkcias ĉe XP sen malfacilaĵoj.

Malpakinte la klienton, ni provas munti nian ŝlosilon:

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

Ho ho. Io misfunkciis. Ni uzu la Guglo-kapablon. Estas fragmentaj mencioj, ke io misas kun la konstantoj; en la servila parto, la programistoj ŝanĝis la protokolan version dum moviĝado al versio 0.2.0, sed en la Win-kliento ili forgesis fari tion. La proponita solvo estas ŝanĝi la konstantan en la fontkodo kaj rekonstrui la klienton.

Sed mi vere ne volas elŝuti Visual Studion por ĉi tiu proceduro. Sed mi havas la bonan maljunan Hiew. En la fontkodo, la konstanto estas deklarita kiel duobla vorto. Ni serĉu 0x00000106 en la dosiero, anstataŭigante ĝin per 0x00000111. Ne forgesu, la bajta ordo estas inversa. La rezulto estas du matĉoj, ni flikas:

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

Aaaand... jes!

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

Ĉi tio povus esti la fino de la rakonto, sed la muziko ne ludis longe. Post rekomenco de la servilo, mi malkovris, ke la aparato sur la kliento ne estis muntita!

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

Tio estas ĉio. Eĉ la ĉioscia Guglo ne povis respondi ĉi tion por mi. Kaj samtempe, la komando montri la disponeblajn aparatojn sur la servilo sufiĉe ĝuste montras - jen ĝi estas, la ŝlosilo, vi povas munti ĝin. Mi provas munti de Linukso - ĝi funkcias! Kio se ni provas nun de Vindozo? Ho hororo - ĝi funkcias!

La lasta rastilo: io ne estis skribita en la servila kodo. Dum kunhavado de aparato, ĝi ne legas la nombron da USB-priskribiloj de ĝi. Kaj kiam oni muntas aparaton de Linukso, ĉi tiu kampo estas plenigita. Bedaŭrinde, mi konas Linuksan disvolviĝon ĉe la nivelo "faru && instali". Tial, la problemo estis solvita per iom malpura hako - aldonante al /etc/rc.local

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

Fina parto

Post iom da suferado, ĝi funkcias. La dezirata estis atingita, nun la ŝlosilo povas esti muntita al ajna komputilo (kaj malmuntita, kompreneble, ankaŭ), inkluzive ekster la elsendo segmento de la reto. Se vi volas, vi povas fari tion uzante komandan ŝelan skripton. Kio estas agrable estas, ke la plezuro estas absolute senpaga.
Mi esperas, ke mia sperto helpos la hackers ĉirkaŭiri la rastilon, kiu estas presita sur mia frunto. Dankon pro via atento!

fonto: www.habr.com

Aldoni komenton