Emulando vários dispositivos com o Pi Zero - como fazer isso?



Se você deseja emular um adaptador de rede, teclado, unidade e tudo mais com o Pi Zero, tudo ao mesmo tempo, você pode fazer tudo. LibComposite vem em socorro, no entanto, nesse caso, é necessário lembrar que não há solução no Windows, o método é adequado apenas para Linux ou Mac OS X. Uma descrição detalhada das ações do usuário para alcançar o resultado descrito no cabeçalho está na sequela ( fonte ).

Etapa 0 - configurar o cartão SD


Baixe e instale a distribuição mais recente do Raspbian Jessie em um cartão SD adequado (deve ter capacidade suficiente) e aumente a partição raiz.

Etapa 1 - O Kernel


Você precisa usar o Kernel 4.4, que não vem por padrão com a distribuição Rasbian. Mas a atualização é fácil, basta executar este comando do console:

sudo BRANCH = next rpi-update

Depois disso, faça o seguinte:

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


Finalmente, ative o driver libcomposite:

sudo echo “libcomposite” | sudo tee -a / etc / modules

Etapa 2 - configurar dispositivos


Agora você precisa decidir qual dispositivo emular - uma placa de rede, teclado ou tudo isso junto?

Nós configuramos isso usando o ConfigFS, o sistema de arquivos virtual em / sys /. Ele é montado automaticamente no início do "raspberry", para que você possa trabalhar no futuro.
Há um ótimo exemplo para um dispositivo chamado USBArmory, um exemplo aqui . Tudo o resto será mostrado em sua base.

Criamos um script de configuração.

Você precisará executá-lo sempre que iniciar o dispositivo. Crie o isticktoit_usb em / usr / bin / file usando seu editor de texto favorito. Escrevemos o seguinte:
sudo touch / usr / bin / isticktoit_usb #crie o arquivo
sudo chmod + x / usr / bin / isticktoit_usb # torne-o executável
sudo nano / usr / bin / isticktoit_usb #edit o arquivo


Depois disso, o script deve ser executado automaticamente na inicialização. Para um melhor desempenho, você pode criar um arquivo de unidade systemd, mas, por enquanto, vamos contornar o rc.local. (Isso faz parte do sistema sysvinit antigo, mas é executado no raspberry pi por padrão).

Abra a raiz /etc/rc.local e adicione a seguinte linha (antes !!!) à linha que contém a palavra "exit":

sudo nano /etc/rc.local
/etc/rc.local.../usr
/ bin / isticktoit_usb # libcomposite
saída de configuração


Criando um gadget

Essa é uma configuração global, portanto, não importa quantos gadgets USB você gostaria de usar. Você pode alterar o número de série, o fabricante e o nome do produto neste bloco.

/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
# End functions
ls / sys / class / udc>


Adaptador Ethernet UDC

Primeiro, vamos adicionar isso ao nosso arquivo de configuração:

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Adicionar funções aqui
mkdir -p functions / ecm .usb0
# o primeiro byte do endereço deve ser par
HOST = "48: 6f: 73: 74: 50: 43" # "HostPC"
SELF = "42: 61: 64: 55: 53: 42" # "BadUSB"
echo $ HOST> funções / ecm.usb0 / host_addr
echo $ SELF> funções / ecm.usb0 / dev_addr
ln -s funções / ecm.usb0 configs / c.1 /
# Funções finais
ls / sys / class / udc> UDC
#put this at o final do arquivo:
ifconfig $ N 10.0.0.1 máscara de rede 255.255.255.252 up
route add -net default gw 10.0.0.2


Nós salvamos e saímos, e depois vamos para o PC host:
Se houver problemas com a conexão automática, desconecte e faça o seguinte:

dmesg | grep cdc_ether
[13890.668557] cdc_ether 1-1: 1.2 eth0: registre 'cdc_ether' em usb-0000: 00: 14.0-1, CDC Ethernet Device, 48: 6f: 73: 74: 50: 43
[13890.674117] usbcore: registrou o novo driver de interface cdc_ether
[13890.687619] cdc_ether 1-1: 1.2 enp0s20u1i2: renomeado de eth0 Você pode


renomear o adaptador mesmo depois, enquanto vamos chamá-lo enp0s20u1i2

sudo ifconfig enp0s20u1i2 10.0.0.2 máscara de rede 255.255.255.252

e conectar via ssh ao PI:

ssh 10.0.0.1 -l pi

Teclado, mouse, joystick (HID)

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Adicione funções aqui
mkdir -p funções / hid.usb0
eco 1> funções / hid.0 / protocolo
eco 1> funções / hid.0 / subclasse
eco 8> funções / 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> funções / hid.0 / report_desc
ln - Funções s / hid.usb0 configs / c.1 /
# Funções finais


Aqui está a maneira mais fácil de enviar pressionamentos de teclas para o arquivo do dispositivo:
eco "\ 0 \ 0 \ x4 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 # pressione o botão A
echo "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"> / dev / hidg0 # libera todas as chaves


Mas essa não é a maneira mais prática, portanto, você deve usar este exemplo e fazer o download para o seu PC. Depois, extraímos para o cartão SD "raspberry" e o iniciamos.

No Pi:
cd PATH_TO_HARDPASS_REPO,
faça #compilar o programa
eco -n "olá mundo!" | sudo ./scan / dev / hidg0 1 2


Aqui ‚1 'significa o layout do teclado americano e" 2 "- austríaco-alemão. o segundo número é necessário para inserir caracteres que não estão no teclado (2 = Linux, 3 = Windows (embora não haja drivers para este sistema operacional)).

Drive

Isso é mais difícil de fazer. Você pode usar apenas um arquivo de imagem de disco. O exemplo cria um arquivo de imagem de disco muito pequeno para salvar a configuração do host Ethernet.
Primeiro, vamos fazer um disco. Este é um processo bastante demorado, o tutorial está aqui .
Então, novamente, vamos à configuração:

sudo nano / usr / bin / isticktoit_usb
/ usr / bin / isticktoit_usb # Adicione funções aqui
FILE = / home / pi / usbdisk.img
mkdir -p $ {FILE / img / d}
loop mount -o, ro, offset = 1048576 -t ext4 $ FILE $ {FILE / img / d}
mkdir -p funções / mass_storage.usb0
eco 1> funções / mass_storage.usb0 / stall
echo 0> functions / mass_storage.usb0 / lun.0 / cdrom
eco 0> funções / mass_storage.usb0 / lun.0 / ro
echo 0> funções / mass_storage.usb0 / lun.0 / nofua
echo $ FILE> funções / mass_storage.usb0 / lun.0 / arquivo
ln -s funções / mass_storage.usb0 configs / c.1 /
# Funções finais

Depois disso, deve haver está disponível um disco removível no formato FAT32, que será mostrado após a próxima conexão Pi ao PC principal. Para acessar os arquivos armazenados no Pi, você pode executar desmontar e reconectá-lo em outro lugar.

O que mais?



No total, existem cerca de 20 dispositivos USB que podem ser emulados pelo kernel do Linux. Aqui está mais informações sobre isso !

Links úteis:
Tutorial de gbaman
libcomposite na documentação do Kernel
-> hardpass - projeto PiZero (emulação de carregamento de chaves) <- Página da USBArmory Wiki

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


All Articles