Émuler divers appareils avec Pi Zero - comment faire?



Si vous souhaitez émuler une carte réseau, un clavier, un périphérique de stockage et tout le reste avec l'aide de Pi Zero, et en même temps - tout cela peut être fait. LibComposite vient à la rescousse, cependant, dans ce cas, vous devez vous rappeler qu'il n'y a pas de solution sous Windows, la méthode ne convient que pour Linux ou Mac OS X. Une description détaillée des actions de l'utilisateur pour obtenir le résultat décrit dans l'en-tête se trouve dans la suite ( source ).

Étape 0 - configurer la carte SD


Téléchargez et installez la dernière distribution Raspbian Jessie sur une carte SD appropriée (devrait être suffisamment grande) et augmentez la partition racine.

Étape 1 - Le noyau


Vous devez utiliser le noyau 4.4, qui n'est pas fourni par défaut avec la distribution Rasbian. Mais la mise à jour est assez facile, il vous suffit d'exécuter cette commande de console:

sudo BRANCH = next rpi-update

Après cela, faites ceci:

echo "dtoverlay = dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a / etc / modules


Enfin, activez le pilote libcomposite:

sudo echo "libcomposite" | sudo tee -a / etc / modules

Étape 2 - Configurer les appareils


Vous devez maintenant décider quel appareil émuler - une carte réseau, un clavier ou tout cela ensemble?

Nous le configurons à l'aide de ConfigFS, le système de fichiers virtuel dans / sys /. Il est automatiquement monté au début de la "framboise", donc à l'avenir vous pourrez travailler avec.
Il existe un excellent exemple pour un périphérique appelé USBArmory, un exemple ici . Tout le reste sera affiché sur sa base.

Nous créons un script de configuration que

vous devrez exécuter à chaque démarrage de l'appareil. Créez l'isticktoit_usb dans / usr / bin / file à l'aide de votre éditeur de texte préféré. Nous écrivons ceci:
sudo touch / usr / bin / isticktoit_usb #créer le fichier
sudo chmod + x / usr / bin / isticktoit_usb #make it executable
sudo nano / usr / bin / isticktoit_usb #modifier le fichier


Après cela, le script doit être exécuté automatiquement au démarrage. Pour de meilleures performances, vous pouvez créer un fichier d'unité systemd, mais pour l'instant, contournons rc.local. (Cela fait partie de l'ancien système Sysvinit, mais il fonctionne par défaut sur Raspberry Pi).

Ouvrez la racine /etc/rc.local et ajoutez une ligne (avant !!!) une ligne contenant le mot "exit":

sudo nano /etc/rc.local
/etc/rc.local.../
usr / bin / isticktoit_usb # libcomposite configuration
exit


Création d'un gadget

Il s'agit d'une configuration globale, peu importe le nombre de gadgets USB que vous souhaitez utiliser. Vous pouvez modifier le numéro de série, le fabricant et le nom du produit dans ce bloc.

/usr/bin/isticktoit_usbcd /sys/kernel/config/usb_gadget/
mkdir -p isticktoit
cd isticktoit
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo «fedcba9876543210» > strings/0x409/serialnumber
echo «Tobias Girstmair» > strings/0x409/manufacturer
echo «iSticktoit.net USB Device» > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo «Config 1: ECM network» > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
# Add functions here
# see gadget configurations below
# Fonctions
terminales ls / sys / class / udc>


Adaptateur Ethernet UDC

Tout d'abord, ajoutons ceci à notre fichier de configuration:

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Ajoutez des fonctions ici
mkdir -p fonctions / ecm .usb0
# le premier octet d'adresse doit être pair
HOST = "48: 6f: 73: 74: 50: 43" # "HostPC"
SELF = "42: 61: 64: 55: 53: 42" # "BadUSB"
echo $ HÔTE> fonctions / ecm.usb0 / host_addr
echo $ SELF> fonctions / ecm.usb0 / dev_addr
ln -s fonctions / ecm.usb0 configs / c.1 /
# Fin fonctions
ls / sys / class / udc> UDC
#put this at at la toute fin du fichier:
ifconfig $ N 10.0.0.1 masque de réseau 255.255.255.252 up
route add -net default gw 10.0.0.2


Nous enregistrons et quittons, puis allons sur le PC hôte:
s'il y a des problèmes de connexion automatique, déconnectez-vous et faites ceci:

dmesg | grep cdc_ether
[13890.668557] cdc_ether 1-1: 1.2 eth0: enregistrez 'cdc_ether' à usb-0000: 00: 14.0-1, CDC Ethernet Device, 48: 6f: 73: 74: 50: 43
[13890.674117] usbcore: nouveau pilote d'interface enregistré cdc_ether
[13890.687619] cdc_ether 1-1: 1.2 enp0s20u1i2: renommé en eth0 Vous pouvez


renommer l'adaptateur même après, pendant appelons-le enp0s20u1i2

sudo ifconfig enp0s20u1i2 10.0.0.2 netmask 255.255.255.252

et connectez-vous via ssh à PI:

ssh 10.0.0.1 -l pi

Clavier, souris, joystick (HID)

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Ajouter des fonctions ici
mkdir -p fonctions / hid.usb0
echo 1> fonctions / hid.0 / protocole
echo 1> fonctions / hid.0 / sous-classe
echo 8> fonctions / hid.0 / report_length
echo - ne \\ x05 \\ x01 \\ x09 \\ x06 \\ xa1 \\ x01 \\ x05 \\ x07 \\ x19 \\ xe0 \\ x29 \\ xe7 \\ x15 \\ x00 \\ x25 \\ x01 \ \ x75 \\ x01 \\ x95 \\ x08 \\ x81 \\ x02 \\ x95 \\ x01 \\ x75 \\ x08 \\ x81 \\ x03 \\ x95 \\ x05 \\ x75 \\ x01 \\ x05 \\ x08 \\ x19 \\ x01 \\ x29 \\ x05 \\ x91 \\ x02 \\ x95 \\ x01 \\ x75 \\ x03 \\ x91 \\ x03 \\ x95 \\ x06 \\ x75 \\ x08 \\ x15 \\ x00 \\ x25 \\ x65 \\ x05 \\ x07 \\ x19 \\ x00 \\ x29 \\ x65 \\ x81 \\ x00 \\ xc0> functions / hid.0 / report_desc
ln - s fonctions / hid.usb0 configs / c.1 /
# Fin des fonctions


Voici la façon la plus simple d'envoyer des frappes au fichier du périphérique:
echo "\ 0 \ 0 \ x4 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 #appuyez sur le bouton A
echo "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 #release all keys


Mais ce n'est pas le moyen le plus pratique, vous devez donc utiliser cet exemple et le télécharger sur votre PC. Ensuite, nous l'extrayons sur la carte SD «framboise» et la démarrons.

Sur Pi:
cd PATH_TO_HARDPASS_REPO
faire #compiler le programme
echo -n "hello world!" | sudo ./scan / dev / hidg0 1 2


Ici, «1» signifie la disposition du clavier américain et «2» - allemand-autrichien. le deuxième chiffre est nécessaire pour saisir des caractères qui ne sont pas sur votre clavier (2 = Linux, 3 = Windows (bien qu'il n'y ait pas de pilotes pour ce système d'exploitation)).

Conduire

C'est plus difficile à faire. Vous ne pouvez utiliser qu'un fichier d'image disque. L'exemple crée un très petit fichier image disque pour enregistrer la configuration de l'hôte Ethernet.
Commençons par créer un disque. C'est un processus assez long, le tutoriel est ici .
Ensuite, nous allons à la configuration:

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Ajouter des fonctions ici
FILE = / home / pi / usbdisk.img
mkdir -p $ {FILE / img / d}
boucle de montage -o, ro, offset = 1048576 -t ext4 $ FILE $ {FILE / img / d}
mkdir -p functions / mass_storage.usb0
echo 1> functions / mass_storage.usb0 / stall
echo 0> functions / mass_storage.usb0 / lun.0 / cdrom
echo 0> fonctions / mass_storage.usb0 / lun.0 / ro
echo 0> functions / mass_storage.usb0 / lun.0 / nofua
echo $ FILE> functions / mass_storage.usb0 / lun.0 / file
ln -s functions / mass_storage.usb0 configs / c.1 /
# Fin des fonctions

Après cela, il devrait y avoir un disque amovible au format FAT32 est disponible, qui sera affiché après la prochaine connexion Pi au PC principal. Pour accéder aux fichiers stockés sur le Pi, vous pouvez exécuter démonter puis reconnecter ailleurs.

Quoi d'autre?



Au total, il existe environ 20 gadgets USB pouvant être émulés par le noyau Linux. Voici plus d' informations à ce sujet !

Liens utiles:
Tutoriel par gbaman
libcomposite dans la documentation du noyau
-> hardpass - Projet PiZero (émulation Keyboad) <- Page wiki USBArmory

Source: https://habr.com/ru/post/fr391099/


All Articles