Emulando varios dispositivos con Pi Zero: ¿cómo hacerlo?
Si desea emular un adaptador de red, teclado, dispositivo de almacenamiento y todo lo demás con la ayuda de Pi Zero, y al mismo tiempo, todo esto puede hacerse. LibComposite viene al rescate, sin embargo, en este caso, debe recordar que no hay solución en Windows, el método es adecuado solo para Linux o Mac OS X. Una descripción detallada de las acciones del usuario para lograr el resultado descrito en el encabezado está en la secuela ( fuente ).Paso 0 - configura la tarjeta SD
Descargue e instale la última distribución de Raspbian Jessie en una tarjeta SD adecuada (debe ser lo suficientemente amplia) y aumente la partición raíz.Paso 1 - El Kernel
Necesita usar Kernel 4.4, que no viene por defecto con la distribución Rasbian. Pero la actualización es bastante fácil, solo necesita ejecutar este comando de consola:sudo BRANCH = next rpi-updateDespués de eso, haga esto:echo "dtoverlay = dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a / etc / modulesFinalmente, active el controlador libcomposite:sudo echo "libcomposite" | sudo tee -a / etc / modulesPaso 2 - configurar dispositivos
Ahora debe decidir qué dispositivo emular: ¿una tarjeta de red, un teclado o todo esto junto?Configuramos esto usando ConfigFS, el sistema de archivos virtual en / sys /. Se monta automáticamente al comienzo de la "frambuesa", por lo que en el futuro puede trabajar con ella.Hay un gran ejemplo para un dispositivo llamado USBArmory, un ejemplo aquí . Todo lo demás se mostrará sobre su base.Creamos un script de configuración.Deberá ejecutarlo cada vez que inicie el dispositivo. Cree el archivo isticktoit_usb en / usr / bin / file usando su editor de texto favorito. Escribimos esto:sudo touch / usr / bin / isticktoit_usb #crea el archivo
sudo chmod + x / usr / bin / isticktoit_usb #hazlo ejecutable
sudo nano / usr / bin / isticktoit_usb #editar el archivoDespués de eso, el script debe ejecutarse automáticamente al inicio. Para obtener el mejor rendimiento, puede crear un archivo de unidad systemd, pero por ahora, recorramos rc.local. (Esto es parte del antiguo sistema sysvinit, pero se ejecuta en frambuesa pi por defecto).Abra la raíz /etc/rc.local y agregue una línea (antes !!!) una línea que contenga la palabra "salir":sudo nano /etc/rc.local
/etc/rc.local.../usr
/ bin / isticktoit_usb # libcomposite
salir de la configuraciónCrear un gadgetEsta es una configuración global, por lo que no importa cuántos dispositivos USB le gustaría usar. Puede cambiar el número de serie, el fabricante y el nombre del producto en este bloque./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
# Funciones finales
ls / sys / class / udc>Adaptador Ethernet UDC Enprimer lugar, agreguemos esto a nuestro archivo de configuración:sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Agregue funciones aquí
mkdir -p functions / ecm .usb0
# el primer byte de dirección debe ser
HOST = "48: 6f: 73: 74: 50: 43" # "HostPC"
SELF = "42: 61: 64: 55: 53: 42" # "BadUSB"
echo $ HOST> funciones / ecm.usb0 / host_addr
echo $ SELF> funciones / ecm.usb0 / dev_addr
ln -s funciones / ecm.usb0 configs / c.1 /
# Funciones finales
ls / sys / class / udc> UDC
#escriba esto en el final del archivo:
ifconfig $ N 10.0.0.1 máscara de red 255.255.255.252 up
route add -net default gw 10.0.0.2Guardamos y salimos, luego vamos a la PC host:si hay problemas con la conexión automática, desconecte y haga esto:dmesg | grep cdc_ether
[13890.668557] cdc_ether 1-1: 1.2 eth0: registre 'cdc_ether' en usb-0000: 00: 14.0-1, Dispositivo CDC Ethernet, 48: 6f: 73: 74: 50: 43
[13890.674117] usbcore: nuevo controlador de interfaz registrado cdc_ether
[13890.687619] cdc_ether 1-1: 1.2 enp0s20u1i2: renombrado desde eth0 Puedecambiar el nombre del adaptador incluso después, mientras llamémoslo enp0s20u1i2sudo ifconfig enp0s20u1i2 10.0.0.2 netmask 255.255.255.252y conéctenos mediante ssh a PI:ssh 10.0.0.1 -l piTeclado, mouse, joystick (HID)sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Agregue funciones aquí
mkdir -p funciones / hid.usb0
echo 1> funciones / hid.0 / protocol
echo 1> funciones / hid.0 / subclase
echo 8> funciones / 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> funciones / hid.0 / report_desc
ln - s funciones / hid.usb0 configs / c.1 /
# Funciones finalesAquí está la forma más fácil de enviar pulsaciones de teclas al archivo del dispositivo:echo "\ 0 \ 0 \ x4 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 # presione el botón A
echo "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 # libera todas las teclasPero esta no es la forma más práctica, por lo que debes usar este ejemplo y descargarlo en tu PC. Luego lo extraemos a la tarjeta SD "frambuesa" y lo iniciamos.En Pi:
cd PATH_TO_HARDPASS_REPO
hacer que #compile el programa
echo -n "¡hola mundo!" El | sudo ./scan / dev / hidg0 1 2Aquí ‚1 'significa la distribución del teclado estadounidense y" 2 "- alemán-austriaco. el segundo número es necesario para ingresar caracteres que no están en su teclado (2 = Linux, 3 = Windows (aunque no hay controladores para este sistema operativo)).ConducirEsto es más difícil de hacer. Solo puede usar un archivo de imagen de disco. El ejemplo crea un archivo de imagen de disco muy pequeño para guardar la configuración del host de Ethernet.Primero, hagamos un disco. Este es un proceso bastante largo, el tutorial está aquí .Luego, nuevamente, vamos a la configuración:sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Agregue funciones aquí
FILE = / home / pi / usbdisk.img
mkdir -p $ {FILE / img / d}
mount -o loop, ro, offset = 1048576 -t ext4 $ FILE $ {FILE / img / d}
mkdir -p funciones / mass_storage.usb0
echo 1> funciones / mass_storage.usb0 / stall
echo 0> funciones / mass_storage.usb0 / lun.0 / cdrom
echo 0> funciones / mass_storage.usb0 / lun.0 / ro
echo 0> funciones / mass_storage.usb0 / lun.0 / nofua
echo $ FILE> funciones / mass_storage.usb0 / lun.0 / file
ln -s functions / mass_storage.usb0 configs / c.1 /
# Funciones finales
Después de eso debería haber hay disponible un disco extraíble en formato FAT32, que se mostrará después de la próxima conexión de Pi a la PC principal. Para acceder a los archivos almacenados en el Pi, puede ejecutar desmontar y luego volver a conectarlo en otro lugar.Que mas
En total, hay unos 20 dispositivos USB que el kernel de Linux puede emular. ¡Aquí hay más información sobre esto !Enlaces útiles:Tutorial de gbamanlibcomposite en la documentación del Kernel-> hardpass - Proyecto PiZero (emulación Keyboad) <- Página Wiki de USBArmorySource: https://habr.com/ru/post/es391099/
All Articles