Você está na página 1de 5

Bus Pirate – O pirata dos barramentos

09/08/2012 - por Sergio Prado

Categorias: Hacking, Hardware Tags: bus pirate, i2c, protocolos, uart

Foi lendo um artigo no Hack a Day uns tempos atrás que descobri a ferramenta Bus Pirate da Dangerous
Prototypes.

Não hesitei em comprar. A ferramenta é simplesmente fantástica!

Durante os meus anos (e anos) de carreira


rreira na área de embarcados, sempre estive envolvido com desenvolvimento
de drivers e protocolos de comunicação. E quem trabalha com isso sabe como é difícil debugar drivers e protocolos
de comunicação, principalmente quando nada funciona. Sim, existem osciloscópios
osciloscópios e analisadores lógicos. Mas os
bons são caros. E eu só quero saber o que esta trafegando no barramento de comunicação. É ai que entra o Bus
Pirate!

O Bus Pirate é uma espécie de interface universal à barramentos de comunicação, com suporte à 1-Wire,
1 I2C, SPI,
JTAG, UART, MIDI, PC keyboard, HD44780 LCDs e barramentos genéricos de 2 ou 3 fios para protocolos
customizados.

De um lado temos um cabo USB que alimenta a placa e cria uma porta serial virtual quando você a conecta no seu
PC. Do outro lado temos um barramento de 10 pinos que você irá conectar ao barramento que pretende
manipular.

E o que ele consegue fazer com o barramento? Ele pode apenas monitorar o barramento de forma não-intrusiva,
não
que chamamos de sniffing.. Neste modo, você verá tudo o que esta trafegando naquele barramento.

Mas não responda ainda! Ele pode também manipular o barramento, enviar dados, configurar dispositivos
dispositiv
conectados, etc. Ele mede frequências na faixa de 1MHz a 40MHz, gera pulsos PWM de 1KHz a 4MHz, serve de
analisador lógico para baixas frequências na ordem de 10Hz a 1MHz.
Ele é suportado pelo AVRDUDE e pode ser usado como gravador de microcontroladores AVR. E também é
suportado pelo OpenOCD e pode ser usado para debugar o kernel do pinguim mais famoso do mundo (o que
espero em breve fazer por aqui!).

E o melhor de tudo, o Bus Pirate é 100% open source, tanto o hardware quanto o software! :)

A documentação completa do projeto esta disponível aqui.

USANDO O BUS PIRATE

Ao conectar o Bus Pirate na sua máquina de desenvolvimento, será criada uma porta serial virtual, que você
poderá acessar com sua aplicação de terminal de preferência, como o minicom, picocom, putty ou hyperterminal
(argh!).

Abra sua aplicação de console, configure como 115200,8N1 e se conecte ao Bus Pirate.

Todo o acesso ao Bus Pirate é via linha de comando no terminal. A primeira vez que você liga, ele começa num
modo de alta impedência, um modo seguro onde todas as saídas ficam desabilitadas, e você terá acesso à linha de
comandos da ferramenta:

HiZ>

Se você digitar ‘?’ ele irá exibir todos os comandos suportados:

HiZ>?
General Protocol interaction
---------------------------------------------------------------------------
? This help (0) List current macros
=X/|X Converts X/reverse X (x) Macro x
~ Selftest [ Start
# Reset ] Stop
$ Jump to bootloader { Start with read
&/% Delay 1 us/ms } Stop
a/A/@ AUXPIN (low/HI/READ) "abc" Send string
b Set baudrate 123
c/C AUX assignment (aux/CS) 0x123
d/D Measure ADC (once/CONT.) 0b110 Send value
f Measure frequency r Read
g/S Generate PWM/Servo / CLK hi
h Commandhistory \ CLK lo
i Versioninfo/statusinfo ^ CLK tick
l/L Bitorder (msb/LSB) - DAT hi
m Change mode _ DAT lo
o Set output type . DAT read
p/P Pullup resistors (off/ON) ! Bit read
s Script engine : Repeat e.g. r:10
v Show volts/states . Bits to read/write e.g. 0x55.2
w/W PSU (off/ON) // Usermacro x/assign x/list all

Um documento sobre como usar esta interface pode ser acessado aqui, e um guia completo de todos os comandos
pode ser acessado aqui.

Muito bem! Que tal agora usá-lo para acessar o bootloader e a console de um roteador Wi-Fi e sniffar um
barramento I2C?

BUS PIRATE E A PORTA SERIAL

Boa parte dos roteadores Wi-Fi disponíveis no mercado são baseados em Linux. Você pode inclusive substituir o
firmware de fábrica destes roteadores por distribuições Linux conhecidas como o OpenWRT e o DD-WRT.

Normalmente estes roteadores possuem uma saída de console, possibilitando acessar o bootloader do
equipamento. Se você não encontrar nenhuma informação na Internet sobre o roteador, é só abri-lo. É
normalmente fácil identificar os pinos de conexão da console (o mais comum são 4 pontos de conexão, veja o
exemplo abaixo). Identifique-o e solde uma barra de pinos para facilitar o acesso.
O problema é que esta saída de console é TTL, e trabalha com níveis lógicos de 0 a 5V. Então não conseguimos
ligar direto à uma porta RS232, que trabalha com níveis lógicos de -12 a +12. Por outro lado, é um prato cheio
para nosso Bus Pirate, que fala TTL!

Como eu já tinha aqui em casa um roteador da D-Link com a barra de pinos já soldada, decidi usá-lo. Liguei o Bus
Pirate no roteador baseado na pinagem abaixo:

Como não tinha nenhuma documentação, precisei “adivinhar” a pinagem do roteador. Descobri qual era o terra
com um multímetro, e os pinos RX e TX eu conectei baseado na tentativa e erro. No final, ficou assim:

Acessei o terminal e configurei o modo UART no Bus Pirate:

HiZ>m 3 9 1 1 1 1
UART (spd brg dbp sb rxp hiz)=( 8 34 0 0 0 1 )
Ready

Depois habilitei o modo bridge:


UART>(1)
UART bridge
Reset to exit
Are you sure? y

Neste modo, o Bus Pirate serve apenas como ponte entre o hardware que estamos monitorando e o PC. Na
prática, ele se transforma em um conversor USB/serial para acessarmos diretamente a console do roteador.

Reiniciei o roteador e voilà! Acesso total à console do bichinho:

CFE version 1.0.37-106.5 for BCM96328 (32bit,SP,BE)

Build Date: Fri Sep 10 21:14:22 CST 2010 (xueyinfeng@localhost.localdomain)


Copyright (C) 2000-2009 Broadcom Corporation.

HS Serial flash device: name ID_W25X64, id 0xef16 size 8192KB


Total Flash size: 8192K with 128 sectors
Chip ID: BCM6328B0, MIPS: 320MHz, DDR: 320MHz, Bus: 160MHz
Main Thread: TP0
Memory Test Passed
Total Memory: 33554432 bytes (32MB)
Boot Address: 0xb8000000

Board IP address : 192.168.1.1:ffffff00


Host IP address : 192.168.1.100
Gateway IP address :
Run from flash/host (f/h) : f
Default host run file name : ?|?~}}u_|~?>OWw<!--?6~O|
Default host flash file name : w7w~-->~9n|xm|_|k?~>O>^{~~_><~~>n=0|z:>X^~~~^^w|Oz
Boot delay (0-9 seconds) : 1
Board Id (0-6) : 96328AVNG
Number of MAC Addresses (1-32) : 11
Base MAC Address : 1c:bd:b9:7c:20:d1
PSI Size (1-64) KBytes : 24
Enable Backup PSI [0|1] : 0
System Log Size (0-256) KBytes : 0
Main Thread Number [0|1] : 0

*** Press any key to stop auto run (1 seconds) ***


Auto run second count down: 0
Booting from only image (0xb8010000) ...
Code Address: 0x80010000, Entry Address: 0x80014230
Decompression OK!
Entry at 0x80014230
Closing network.
Disabling Switch ports.
Flushing Receive Buffers...
0 buffers found.
Closing DMA Channels.
Starting program at 0x80014230
Linux version 2.6.30 (xueyinfeng@localhost.localdomain) (gcc version 4.4.2 (Buildroot
2010.02-git) ) #8 Fri Jul 27 23:07:33 BRT 2011
HS Serial flash device: name ID_W25X64, id 0xef16 size 8192KB
96328AVNG prom init
CPU revision is: 0002a075 (Broadcom4350)
Determined physical RAM map:
memory: 01f00000 @ 00000000 (usable)
Zone PFN ranges:
DMA 0x00000000 -> 0x00001000
Normal 0x00001000 -> 0x00001f00
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
...

Para mais informações sobre os comandos de acesso à UART, clique aqui.


SNIFFANDO O BARRAMENTO I2C

Vou fazer aqui alguns testes com o barramento I2C usando o kit de desenvolvimento LPC3250 da Embedded
Artists. Olhei o esquemático da placa, e identifiquei os pinos SDA e SCL do barramento I2C0 no conector de
expansão 3. Como não tinha nenhuma barra de pinos sobrando por aqui (preciso visitar a Santa Efigênia em
breve!) soldei uns fios e conectei no Bus Pirate:

Iniciei o terminal e configurei o modo I2C no Bus Pirate:

HiZ>m 4 2
I2C (mod spd)=( 0 1 )
Ready

Que tal escanear o barramento e identificar os endereços de todos os dispositivos conectados nele?

I2C>(1)
Searching I2C address space. Found devices at:
0xA0(0x50 W) 0xA1(0x50 R) 0xAE(0x57 W) 0xAF(0x57 R) 0xC0(0x60 W) 0xC1(0x60 R) 0xCC(0x66
W)

Encontrei 4 dispositivos no barramento I2C0, com os endereços (de 7 bits) 0x50, 0x57, 0x60 e 0x66. Legal, né? :)

E que tal monitorar a comunicação no barramento? Como eu estava com o Linux rodando na placa, forcei o acesso
à um expansor de I/O conectado ao barramento I2C, e monitorei o barramento:

I2C>(2)
Sniffer
Any key to exit
[0xC0+0x06+][0xC0+0x04+][0xC0+0x10-0xC1+0x01+][0xC0+0x10+][0xC0+0x10-
0xC1+0x05+][0xC0+0x10+]

Para mais informações sobre os comandos de acesso ao barramento I2C, clique aqui.

ONDE COMPRAR?

O projeto é da Dangerous Prototypes. O objetivo destes caras é desenvolver e liberar um projeto de hardware
aberto todo mês. Os projetos são baratos, com preços variando de $10 a $50.

Você pode comprar qualquer produto deles, incluindo o Bus Pirate, na Seeed Studio ou em outros distribuidores.

Eu comprei na Seeed Studio neste link aqui.

Custou 27,15 doletas e chegou em duas semanas. Nada mal para um produto que serve de conversor USB/Serial,
programa microcontroladores e memórias flash, debuga chips ARM, é um analisador lógico, medidor e gerador de
frequências, e que por acaso nos ajuda a hackear barramentos de comunicação… :)

Happy Hacking!

Sergio Prado.

Você também pode gostar