Bus Pirate — O pirata dos barramentos

- por Sergio Prado

Categorias: Hacking, Hardware Tags: , , ,

Foi lendo um artigo no Hack a Day uns tem­pos atrás que desco­bri a fer­ra­menta Bus Pirate da Dan­ger­ous Pro­to­types.

Não hes­itei em com­prar. A fer­ra­menta é sim­ples­mente fantástica!

Durante os meus anos (e anos) de car­reira na área de embar­ca­dos, sem­pre estive envolvido com desen­volvi­mento de dri­vers e pro­to­co­los de comu­ni­cação. E quem tra­balha com isso sabe como é difí­cil debugar dri­vers e pro­to­co­los de comu­ni­cação, prin­ci­pal­mente quando nada fun­ciona. Sim, exis­tem osciloscó­pios e anal­isadores lógi­cos. Mas os bons são caros. E eu só quero saber o que esta trafe­gando no bar­ra­mento de comu­ni­cação. É ai que entra o Bus Pirate!

BusPirate v3.5 W490 Bus Pirate   O pirata dos barramentos

O Bus Pirate é uma espé­cie de inter­face uni­ver­sal à bar­ra­men­tos de comu­ni­cação, com suporte à 1-Wire, I2C, SPI, JTAG, UART, MIDI, PC key­board, HD44780 LCDs e bar­ra­men­tos genéri­cos de 2 ou 3 fios para pro­to­co­los customizados.

De um lado temos um cabo USB que ali­menta a placa e cria uma porta ser­ial vir­tual quando você a conecta no seu PC. Do outro lado temos um bar­ra­mento de 10 pinos que você irá conec­tar ao bar­ra­mento que pre­tende manipular.

600px Bp protocols Bus Pirate   O pirata dos barramentos

E o que ele con­segue fazer com o bar­ra­mento? Ele pode ape­nas mon­i­torar o bar­ra­mento de forma não-intrusiva, que chamamos de sniff­ing. Neste modo, você verá tudo o que esta trafe­gando naquele barramento.

Mas não responda ainda! Ele pode tam­bém manip­u­lar o bar­ra­mento, enviar dados, con­fig­u­rar dis­pos­i­tivos conec­ta­dos, etc. Ele mede fre­quên­cias na faixa de 1MHz a 40MHz, gera pul­sos PWM de 1KHz a 4MHz, serve de anal­isador lógico para baixas fre­quên­cias na ordem de 10Hz a 1MHz.

Ele é supor­tado pelo AVRDUDE e pode ser usado como gravador de micro­con­tro­ladores AVR. E tam­bém é supor­tado pelo OpenOCD e pode ser usado para debugar o ker­nel do pin­guim mais famoso do mundo (o que espero em breve fazer por aqui!).

E o mel­hor de tudo, o Bus Pirate é 100% open source, tanto o hard­ware quanto o software! :)

A doc­u­men­tação com­pleta do pro­jeto esta disponível aqui.

USANDO O BUS PIRATE

Ao conec­tar o Bus Pirate na sua máquina de desen­volvi­mento, será cri­ada uma porta ser­ial vir­tual, que você poderá aces­sar com sua apli­cação de ter­mi­nal de prefer­ên­cia, como o mini­com, pic­o­com, putty ou hyper­t­er­mi­nal (argh!).

Abra sua apli­cação de con­sole, con­fig­ure como 115200,8N1 e se conecte ao Bus Pirate.

Todo o acesso ao Bus Pirate é via linha de comando no ter­mi­nal. A primeira vez que você liga, ele começa num modo de alta impedên­cia, um modo seguro onde todas as saí­das ficam desabil­i­tadas, e você terá acesso à linha de coman­dos da ferramenta:

HiZ>

Se você dig­i­tar ‘?’ ele irá exibir todos os coman­dos 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 doc­u­mento sobre como usar esta inter­face pode ser aces­sado aqui, e um guia com­pleto de todos os coman­dos pode ser aces­sado aqui.

Muito bem! Que tal agora usá-lo para aces­sar o boot­loader e a con­sole de um roteador Wi-Fi e snif­far um bar­ra­mento I2C?

BUS PIRATE E A PORTA SERIAL

Boa parte dos roteadores Wi-Fi disponíveis no mer­cado são basea­dos em Linux. Você pode inclu­sive sub­sti­tuir o firmware de fábrica destes roteadores por dis­tribuições Linux con­heci­das como o Open­WRT e o DD-WRT.

Nor­mal­mente estes roteadores pos­suem uma saída de con­sole, pos­si­bil­i­tando aces­sar o boot­loader do equipa­mento. Se você não encon­trar nen­huma infor­mação na Inter­net sobre o roteador, é só abri-lo. É nor­mal­mente fácil iden­ti­ficar  os pinos de conexão da con­sole (o mais comum são 4 pon­tos de conexão, veja o exem­plo abaixo). Identifique-o e solde uma barra de pinos para facil­i­tar o acesso.

d link.dir 615d1 serial Bus Pirate   O pirata dos barramentos

O prob­lema é que esta saída de con­sole é TTL, e tra­balha com níveis lógi­cos de 0 a 5V. Então não con­seguimos ligar direto à uma porta RS232, que tra­balha com níveis lógi­cos 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á sol­dada, decidi usá-lo. Liguei o Bus Pirate no roteador baseado na pinagem abaixo:

Bp cable color hk Bus Pirate   O pirata dos barramentos

Como não tinha nen­huma doc­u­men­tação, pre­ci­sei “adi­v­in­har” a pinagem do roteador. Desco­bri qual era o terra com um multímetro, e os pinos RX e TX eu conectei baseado na ten­ta­tiva e erro. No final, ficou assim:

bp dlink Bus Pirate   O pirata dos barramentos

Aces­sei o ter­mi­nal e con­fig­urei 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 ape­nas como ponte entre o hard­ware que esta­mos mon­i­torando e o PC. Na prática, ele se trans­forma em um con­ver­sor USB/serial para aces­sar­mos dire­ta­mente a con­sole do roteador.

Reini­ciei o roteador e voilà! Acesso total à con­sole 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 infor­mações sobre os coman­dos de acesso à UART, clique aqui.

SNIFFANDO O BARRAMENTO I2C

Vou fazer aqui alguns testes com o bar­ra­mento I2C usando o kit de desen­volvi­mento LPC3250 da Embed­ded Artists. Olhei o esquemático da placa, e iden­ti­fiquei os pinos SDA e SCL do bar­ra­mento I2C0 no conec­tor de expan­são 3. Como não tinha nen­huma barra de pinos sobrando por aqui (pre­ciso vis­i­tar a Santa Efigê­nia em breve!) sol­dei uns fios e conectei no Bus Pirate:

bp lpc3250 Bus Pirate   O pirata dos barramentos

Ini­ciei o ter­mi­nal e con­fig­urei o modo I2C no Bus Pirate:

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

Que tal escanear o bar­ra­mento e iden­ti­ficar os endereços de todos os dis­pos­i­tivos conec­ta­dos 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)

Encon­trei 4 dis­pos­i­tivos no bar­ra­mento I2C0, com os endereços (de 7 bits) 0x50, 0x57, 0x60 e 0x66. Legal, né? :)

E que tal mon­i­torar a comu­ni­cação no bar­ra­mento? Como eu estava com o Linux rodando na placa, for­cei o acesso à um expan­sor de I/O conec­tado ao bar­ra­mento I2C, e mon­i­torei 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 infor­mações sobre os coman­dos de acesso ao bar­ra­mento I2C, clique aqui.

ONDE COMPRAR?

O pro­jeto é da Dan­ger­ous Pro­to­types. O obje­tivo destes caras é desen­volver e lib­erar um pro­jeto de hard­ware aberto todo mês. Os pro­je­tos são baratos, com preços var­iando de $10 a $50.

Você pode com­prar qual­quer pro­duto deles, incluindo o Bus Pirate, na Seeed Stu­dio ou em out­ros dis­tribuidores.

Eu com­prei na Seeed Stu­dio neste link aqui.

Cus­tou 27,15 dole­tas e chegou em duas sem­anas. Nada mal para um pro­duto que serve de con­ver­sor USB/Serial, pro­grama micro­con­tro­ladores e memórias flash, debuga chips ARM, é um anal­isador lógico, medi­dor e ger­ador de fre­quên­cias, e que por acaso nos ajuda a hack­ear bar­ra­men­tos de comunicação… :)

Happy Hack­ing!

Ser­gio Prado.

  • Juliano alves

    Sen­sa­cional!!!!

    Já estou com­prando o meu… vlw Ser­gio pela dica.

  • Leonardo Pucci

    Muito bacana!
    Já comprado!

    Ser­gio, obri­gado pelo treina­mento aqui na Samsung. 

    Sem­pre tive muitas dúvi­das a respeito de desen­volti­mento linux!
    Além do curso, os seus posts são muito inter­es­santes!
    Prati­ca­mente uma con­tin­u­ação do treinamento. 

    Um abraço

    Leonardo Pucci

  • Rodrigo Pereira

    Ser­gio, gostei do pro­duto, vc pode­ria ofer­ece aqui no Brasil ou da dica para alguma loja, eu nuca fiz com­pra fora do Brasil.

  • Sander max

    amigo como foi a forma de entrega,abraços.

    • http://sergioprado.org/ Ser­gio Prado

      DHL ou Fedex, não me lembro.

  • Fran­cisco Apare­cido Pereira Du

    Olá Ser­gio. Ele retira senha de bios nas memórias eep­rom? Abraços.

    • http://sergioprado.org/ Ser­gio Prado

      Olá Fran­cisco,

      Sim, desde que a inter­face com a memória seja um bar­ra­mento supor­tado pelo Bus Pirate, como I2C ou SPI.

  • Fran­cisco Apare­cido Pereira Du

    Ok. As memórias eep­rom que digo, são de notebooks.

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.