12 de abril de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Laboratório maker 02: Sniffer de barramentos Bus Pirate

Sniffer de barramentos | open drain | sniffing I2C com Bus Pirate

Nesse segundo artigo da série veremos uma ferramenta incrível para análise de protocolos, teste de comunicação, interceptação e muito mais, que é o  sniffer de barramentos Bus Pirate, da Dangerous Prototypes.

Sobre o sniffer de barramentos

Primeiro, o conceito: “Sniffer” ou “farejador” é um dispositivo de interação ou interceptação de dados. O Bus Pirate pode ser utilizado para análise, espionagem, engenharia reversa ou perícia forense digital. Vamos tratar desses assuntos no decorrer do artigo.

Em nossas MCUs temos diversos barramentos seriais, como a UART, I2C, SPI. Cada barramento serial tem seu protocolo, comumente implementado em nossos sketches com o apoio de bibliotecas, desde as mais primitivas como a SPI.h, Wire.h e a intrínseca Serial, do Arduino.

Bem, para a maioria dos dispositivos que utilizamos temos também uma biblioteca de alto nível (de uma camada superior), por exemplo a BM180.h, utilizada com o sensor de pressão e temperatura BMP180, da Bosch.

Nem sempre teremos em mãos uma biblioteca pronta. Em 2014 (salvo erro), fiz um código para ler o BMP180 no Raspberry. Na época escrevi o código em Python, no artigo “Barômetro BMP180 com Raspberry“. Mas ainda que tenhamos uma biblioteca, eventualmente podemos ter percalços em sua implementação, e esse tipo de evento desencadeia perguntas em grupos e fóruns, do tipo: “Como posso saber se meu dispositivo X está funcionando?”. Oras, que tal eliminarmos esse tipo de dúvidas por nós mesmos – e o melhor, de forma garantida!

Caracteristicas do sniffer de barramentos Bus Pirate v3.6

A versão que tenho é a Bus Pirate v3.6, que adquiri direto da SeedStudio. Sua principal característica é a depuração em chips novos ou desconhecidos, sem a necessidade de escrever códigos, permitindo assim todas as operações em situações como as supracitadas.

Ele trabalha com protocolos em níveis de 0 a 5.5v. De um lado conectamos ao computador pessoal, seja laptop ou desktop, através da porta USB. Claro, podemos interfaceá-lo com um tablet ou smartphone. Embarcados como o Raspberry também são uma opção, abrindo portas para um produto portátil especialista de análise.

Os modos suportados são:

  • 1-Wire
  • I2C
  • SPI
  • JTAG
  • Serial assíncrona
  • MIDI
  • Teclado de PC
  • LCD HD44780
  • Bibliotecas 2-wire e 3-wire com pino de controle de bitwise

Outras características importantes são:

  • Pinos com nível lógico de 0V à 5V5.
  • Probe de medição de 0 à 6V.
  • Medição de frequência de 1Hz à 40MHz!
  • Gerador de frequência de 1kHz à 40MHz PWM!
  • Resistores de pull-up onboard.
  • Oferece alimentação onboard para 3V3 e 5V com software reset.
  • Macros para operações comuns.
  • Sniffing de barramentos.
  • Contém um bootloader que permite update de firmwares facilmente.
  • Modo bridge transparente para USB-Serial.
  • Analisador lógico de baixa velocidade de 10Hz à 1MHz.
  • Driver de servo-motor.
  • Pode programar diversos microcontroladores AVR com suporte ao AVRdude.
  • Pode emular o AVR STK500 v2 com clone alternativo do firmware ST500.
  • Programador de FPGAs e CPLDs com firmware XSVF alternativo.
  • Interativo com scripts (Python, shell, Perl etc).
  • Código de domínio público.

Aplicações com suporte do sniffer de barramentos Bus Pirate

Quem usa Linux provavelmente já conhece o AVRdude (site), que é o programa de background utilizado pela IDE do Arduino para fazer o upload do firmware que compilamos com o avr-gcc. Se não tinha essa visão do conjunto que envolve a IDE, abertas estão as cortinas agora.

Outro programa suportado é o OpenOCD – um depurador via JTAG que pode usar, por exemplo, o GDB para depurar ARM7, ARM9 e vários outros, como alguns ST. O link de uso do OpenOCD é esse.

Ele serve também para flashing de BIOS/EFI/coreboot/firmware e OptionROM em placas-mãe, rede, placas gráficas e storages, utilizando o flashrom, mas nem link vou deixar porque se der uma falha no processo e o computador for reiniciado, adeus placa-mãe.

Descrição do hardware

Essa imagem foi tirada da própria Dangerous Prototype é um overview da placa:

Sniffer de barramentos - hardware overview
Disposição da placa

Nela temos:

1- Porta mini-usb.

2- Indicador de transmissão USB, que pisca quando houver tráfego entre o dispositivo e o PC.

3- Indicador de alimentação.

4- Indicador de modo. Esse LED acende quando o Bus Pirate é configurado para um modo de protocolo a partir de seu menu, acessado pela serial. Os pinos de GPIO podem estar ativos quando o indicador de modo estiver ON. Os pinos devem estar em modo seguro, não alimentados e no estado de alta impedância quando esse LED estiver desligado.

5- Indicador do regulador de tensão. Esse LED acende quando a alimentação onboard for ativada a partir do terminal de comandos (com a flag W maiúscula).

6- Pinos de I/O. Existem dois tipos de cabos já prontos com terminadores de pinçar, com configuração de cores diferentes. Vou aproveitar e colocar outro screenshot do wiring para não perder mais a referência, porque não lembro mais onde guardei a imagem original:

Sniffer de barramentos - wiring
Os dois tipo de cabos do sniffer de barramentos Bus Pirate

Apesar de alguns I/Os serem óbvios, outros não o são. Por isso, disponho a tabela a seguir:

Nome do PinoDescrição, com Bus Pirate como Master
MOSIMaster data out, slave in (SPI, JTAG), Serial data (1-Wire, I2C, KB), TX* (UART)
CLKClock signal (I2C, SPI, JTAG, KB)
MISOMaster data in, slave out (SPI, JTAG) RX (UART)
CS*Chip select (SPI), TMS (JTAG)
AUXAuxiliary IO, frequency probe, pulse-width modulator
ADCVoltage measurement probe (max 6volts)
VpuVoltage input for on-board pull-up resistors (0-5volts).
+3.3v+3.3volt switchable power supply
+5.0v+5volt switchable power supply
GNDGround, connect to ground of test circuit

Mantive o texto original na tabela acima, pois praticamente é composto pelos termos que utilizamos ao falar do assunto. O pino TX foi movido de CS para MOSI no firmware v0g, só atente-se a isso, caso tenha instalado essa versão.

7 – ICSP. Esses pinos podem ser usados para escrever um novo firmware para a microcontroladora utilizando o PICKIT2 ou ICD2. Mas o Bus Pirate aceita update pela USB, graças a seu bootloader, por isso o ICSP é comumente utilizado para gravar a primeira vez, lá onde montam a placa antes de vender.  Coloque um jumper entre o PGC e PGD para ativar o gatilho do bootloader para atualizações de firmware. Eu nunca atualizei.

8 –  Terminal serial (ST), somente para a versão v2go.

A comunicação serial tem o padrão 115200/8/N/1 UART. Ao acessar o terminal, podemos definir e redefinir as velocidades de ambas as seriais de forma independente. Se trocar a velocidade da USB-serial, deverá obviamente reconectar-se a ela.

Tutorial Bus Pirate – 1/x

Não sei ao certo quantos tutoriais serão escritos e filmados, pois dependerá da inspiração em produzir o conteúdo, mas os conceituais são certos, por isso, sigamos agora para a segunda parte do artigo: “Como usar o Bus Pirate – Introdução”.

Se não há próximo artigo aí embaixo, significa que você deve passar por aqui amanhã novamente para ler a continuação. Estarei te esperando!

 

Revisão: Ricardo Amaral de Andrade