Zbutja e USB/IP

Detyra e lidhjes së një pajisjeje USB me një kompjuter të largët nëpërmjet një rrjeti lokal lind rregullisht. Më poshtë është historia e kërkimeve të mia në këtë drejtim dhe rruga drejt një zgjidhjeje të gatshme bazuar në një projekt me burim të hapur USB/IP me një përshkrim të pengesave të instaluara me kujdes nga njerëz të ndryshëm përgjatë kësaj rruge, si dhe mënyrat për t'i anashkaluar ato.

Pjesa e parë, historike

Nëse makina është virtuale, e gjithë kjo është e lehtë. Funksionaliteti i përcjelljes USB nga hosti në makinën virtuale u shfaq në VMWare 4.1. Por në rastin tim, çelësi i sigurisë, i identifikuar si WIBU-KEY, duhej të lidhej me makina të ndryshme në kohë të ndryshme, dhe jo vetëm me ato virtuale.
Raundi i parë i kërkimit në vitin 2009 më çoi te një pjesë e harduerit të quajtur TrendNet TU2-NU4
Pro:

  • ndonjëherë edhe funksionon

Cons:

  • jo gjithmonë funksionon. Le të themi se çelësi i mbrojtjes Guardant Stealth II nuk fillon përmes tij, duke u betuar me gabimin "pajisja nuk mund të ndizet".
  • Softueri për menaxhimin (lexo: montimi dhe çmontimi i pajisjeve USB) është jashtëzakonisht i dobët. Ndërprerësit e linjës së komandës, automatizimi - jo, nuk kemi dëgjuar. Gjithçka bëhet me duart tuaja. Makth.
  • Softueri i kontrollit kërkon vetë harduerin në rrjet duke transmetuar, kështu që funksionon vetëm brenda një segmenti të transmetimit të rrjetit. Nuk mund të specifikoni manualisht adresën IP të pjesës së harduerit. A është pjesa e harduerit në një nënrrjet tjetër? Atëherë ju keni një problem.
  • Zhvilluesit kanë hequr dorë nga pajisja, dërgimi i raporteve të gabimeve është i padobishëm.

Raundi i dytë ndodhi në një kohë jo aq të largët dhe më çoi në temën e artikullit - Projekt USB/IP. Tërheq me hapjen e saj, veçanërisht pasi djemtë nga ReactOS Ata nënshkruan një shofer për Windows, kështu që tani edhe në x64 gjithçka funksionon pa asnjë paterica si modaliteti i testimit. Për të cilën shumë faleminderit ekipit të ReactOS! Gjithçka tingëllon bukur, le të përpiqemi ta ndiejmë, a është vërtet kështu? Fatkeqësisht, vetë projekti është gjithashtu i braktisur dhe nuk mund të mbështeteni në mbështetje - por aty ku i yni nuk është zhdukur, kodi burim është atje, ne do ta kuptojmë!

Pjesa e dytë, server-Linux

Një server USB/IP që ndan pajisjet USB përmes një rrjeti mund të instalohet vetëm në një OS të bazuar në Linux. Epo, Linux është Linux, instaloni Debian 8 në makinën virtuale në një konfigurim minimal, lëvizje standarde të dorës:

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

E themeluar. Pastaj Interneti sugjeron që ju duhet të shkarkoni modulin usbip, por - përshëndetje, së pari rake. Nuk ka një modul të tillë. Kjo për shkak se shumica e manualeve në rrjet i referohen degës më të vjetër 0.1.x, dhe në versionin më të fundit 0.2.0 modulet usbip kanë emra të ndryshëm.

Prandaj:

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

Epo, le të shtojmë rreshtat e mëposhtëm në /etc/modules për t'i ngarkuar ato automatikisht kur të fillojë sistemi:

usbip-core
usbip-host
vhci-hcd

Le të fillojmë serverin usbip:

sudo usbipd -D

Më tej, mençuria universale na thotë se usbip vjen me skriptet që na lejojnë të menaxhojmë serverin - të tregojmë se çfarë pajisje do të ndajë në rrjet, të shikojmë statusin, etj. Këtu na pret një tjetër vegël kopshti - këto skripta në degën 0.2.x janë riemërtuar përsëri. Ju mund të merrni një listë të komandave duke përdorur

sudo usbip

Pas leximit të përshkrimit të komandave, bëhet e qartë se për të ndarë pajisjen e kërkuar USB, usbip dëshiron të zbulojë ID-në e tij të autobusit. Të nderuar shikues, grabujë numër tre në arenë: ID e autobusit që do të na japë lsusb (do të duket mënyra më e dukshme) - nuk i përshtatet asaj! Fakti është se usbip injoron harduerin si shpërndarës USB. Prandaj, ne do të përdorim komandën e integruar:

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

Shënim: këtu dhe më tej në listat do të përshkruaj gjithçka duke përdorur shembullin e çelësit tim specifik USB. Emri juaj i harduerit dhe çifti VID:PID mund dhe do të jenë të ndryshëm. E imja quhet Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Tani mund të ndajmë pajisjen tonë:

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

Urra, shokë!

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 brohoritje, shokë! Serveri ka ndarë harduerin përmes rrjetit dhe ne mund ta lidhim atë! Gjithçka që mbetet është të shtoni autostart të demonit usbip në /etc/rc.local

usbipd -D

Pjesa e tretë, nga ana e klientit dhe konfuze

Unë u përpoqa menjëherë të lidh pajisjen e përbashkët përmes rrjetit me një makinë që funksionon Debian në të njëjtin server dhe gjithçka u lidh në mënyrë të përsosur:

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

Le të kalojmë te Windows. Në rastin tim ishte Windows Server 2008R2 Standard Edition. Manuali zyrtar ju kërkon që fillimisht të instaloni drejtuesin. Procedura përshkruhet në mënyrë të përkryer në readme-në e përfshirë me klientin Windows, ne bëjmë gjithçka siç është shkruar, gjithçka funksionon. Gjithashtu funksionon në XP pa asnjë vështirësi.

Pasi kemi shpaketuar klientin, ne përpiqemi të montojmë çelësin tonë:

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

Oh oh. Dicka shkoi keq. Le të përdorim aftësinë e Google. Ka përmendje fragmentare se diçka nuk është në rregull me konstantet; në pjesën e serverit, zhvilluesit ndryshuan versionin e protokollit kur kaluan në versionin 0.2.0, por në klientin Win ata harruan ta bënin këtë. Zgjidhja e propozuar është ndryshimi i konstantës në kodin burimor dhe rindërtimi i klientit.

Por me të vërtetë nuk dua të shkarkoj Visual Studio për këtë procedurë. Por unë kam Hiew-in e vjetër. Në kodin burimor, konstanta deklarohet si një fjalë e dyfishtë. Le të kërkojmë 0x00000106 në skedar, duke e zëvendësuar atë me 0x00000111. Mos harroni, rendi i bajtit është i kundërt. Rezultati është dy ndeshje, ne patch:

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

Aaaand... po!

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

Ky mund të kishte qenë fundi i historisë, por muzika nuk luajti për shumë kohë. Pas rindezjes së serverit, zbulova se pajisja në klient nuk ishte montuar!

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

Kjo eshte e gjitha. Edhe Google i gjithëdijshëm nuk mund t'i përgjigjej kësaj për mua. Dhe në të njëjtën kohë, komanda për të shfaqur pajisjet e disponueshme në server tregon mjaft saktë - këtu është, çelësi, mund ta montoni. Unë përpiqem të montoj nga Linux - funksionon! Po sikur të provojmë tani nga Windows? Oh tmerr - funksionon!

Rezultati i fundit: diçka nuk ishte shkruar në kodin e serverit. Kur ndani një pajisje, ajo nuk lexon numrin e përshkruesve USB prej saj. Dhe kur montoni një pajisje nga Linux, kjo fushë plotësohet. Fatkeqësisht, jam i njohur me zhvillimin e Linux-it në nivelin "bëj && bëj instalim". Prandaj, problemi u zgjidh duke përdorur një hak mjaft të ndyrë - duke shtuar në /etc/rc.local

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

Pjesa e fundit

Pas disa vështirësish, funksionon. Dëshira është arritur, tani çelësi mund të montohet në çdo PC (dhe të çmontuar, natyrisht, gjithashtu), duke përfshirë edhe jashtë segmentit të transmetimit të rrjetit. Nëse dëshironi, mund ta bëni këtë duke përdorur një skript të guaskës së komandës. Ajo që është e bukur është se kënaqësia është absolutisht falas.
Shpresoj që përvoja ime do t'i ndihmojë hakerët të kapërcejnë grabujën që është ngulitur në ballin tim. Faleminderit per vemendjen!

Burimi: www.habr.com

Shto një koment