Difference between revisions of "Proxmark"
m |
m |
||
Line 1: | Line 1: | ||
==Upgrading ELECHOUSE Proxmark3 Easy V3 to 512k== |
==Upgrading ELECHOUSE Proxmark3 Easy V3 to 512k== |
||
+ | ===(de)soldering=== |
||
− | |||
The popular [https://www.aliexpress.com/popular/proxmark3-kit.html Proxmark3 Easy] has an at91sam7s256 with only 256k and e.g. it's already about 83% full with the current iceman firmware. |
The popular [https://www.aliexpress.com/popular/proxmark3-kit.html Proxmark3 Easy] has an at91sam7s256 with only 256k and e.g. it's already about 83% full with the current iceman firmware. |
||
<br>So I decided to attempt an upgrade. |
<br>So I decided to attempt an upgrade. |
||
Line 21: | Line 21: | ||
Note that it's maybe easier to solder the new chip not by using flux+solder+iron but [https://www.aliexpress.com/wholesale?SearchText=mechanic+solder+flux solder flux paste] and heating with air gun, as shown [https://www.youtube.com/watch?v=2Z7nCAxS2Rg&t=9m30s in this video]... |
Note that it's maybe easier to solder the new chip not by using flux+solder+iron but [https://www.aliexpress.com/wholesale?SearchText=mechanic+solder+flux solder flux paste] and heating with air gun, as shown [https://www.youtube.com/watch?v=2Z7nCAxS2Rg&t=9m30s in this video]... |
||
+ | ===JTAG programming=== |
||
− | |||
Then wire your JTAG programmer to the board. Mine is a Segger J-Link. |
Then wire your JTAG programmer to the board. Mine is a Segger J-Link. |
||
<br>To make it easier, solder a [https://www.aliexpress.com/wholesale?SearchText=breakable+single+row+male+curved+header+2.54 breakable single-row male curved header]. |
<br>To make it easier, solder a [https://www.aliexpress.com/wholesale?SearchText=breakable+single+row+male+curved+header+2.54 breakable single-row male curved header]. |
||
Line 48: | Line 48: | ||
$ apt-get install openocd |
$ apt-get install openocd |
||
+ | There is some doc installed locally: file:///usr/share/doc/openocd/openocd.html/index.html |
||
Create /etc/udev/rules.d/60-jlink.rules with |
Create /etc/udev/rules.d/60-jlink.rules with |
||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="664", GROUP="plugdev" |
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="664", GROUP="plugdev" |
||
+ | |||
+ | I created a config file by reusing most of [https://github.com/Proxmark/proxmark3/blob/master/tools/at91sam7s512-buspirate.cfg tools/at91sam7s512-buspirate.cfg], but specific to J-Link instead of buspirate: |
||
+ | <pre> |
||
+ | telnet_port 4444 |
||
+ | gdb_port 3333 |
||
+ | interface jlink |
||
+ | transport select jtag |
||
+ | adapter_khz 1000 |
||
+ | reset_config srst_only srst_pulls_trst |
||
+ | jtag newtap sam7x cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x3f0f0f0f |
||
+ | target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu |
||
+ | sam7x.cpu configure -event reset-init { |
||
+ | soft_reset_halt |
||
+ | mww 0xfffffd00 0xa5000004 # RSTC_CR: Reset peripherals |
||
+ | mww 0xfffffd44 0x00008000 # WDT_MR: disable watchdog |
||
+ | mww 0xfffffd08 0xa5000001 # RSTC_MR enable user reset |
||
+ | mww 0xfffffc20 0x00005001 # CKGR_MOR : enable the main oscillator |
||
+ | sleep 10 |
||
+ | mww 0xfffffc2c 0x000b1c02 # CKGR_PLLR: 16MHz * 12/2 = 96MHz |
||
+ | sleep 10 |
||
+ | mww 0xfffffc30 0x00000007 # PMC_MCKR : MCK = PLL / 2 = 48 MHz |
||
+ | sleep 10 |
||
+ | mww 0xffffff60 0x00480100 # MC_FMR: flash mode (FWS=1,FMCN=72) |
||
+ | sleep 100 |
||
+ | } |
||
+ | gdb_memory_map enable |
||
+ | sam7x.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0 |
||
+ | flash bank sam7x.flash.0 at91sam7 0 0 0 0 sam7x.cpu 0 0 0 0 0 0 0 18432 |
||
+ | flash bank sam7x.flash.1 at91sam7 0 0 0 0 sam7x.cpu 1 0 0 0 0 0 0 18432 |
||
+ | </pre> |
||
+ | |||
+ | Launching OpenOCD: |
||
+ | |||
+ | <pre> |
||
+ | $ openocd -f at91sam7s512-jlink.cfg |
||
+ | Open On-Chip Debugger 0.9.0 (2017-03-07-13:28) |
||
+ | Licensed under GNU GPL v2 |
||
+ | For bug reports, read |
||
+ | http://openocd.org/doc/doxygen/bugs.html |
||
+ | adapter speed: 1000 kHz |
||
+ | srst_only srst_pulls_trst srst_gates_jtag srst_open_drain connect_deassert_srst |
||
+ | Info : J-Link ARM V8 compiled Dec 1 2009 11:42:48 |
||
+ | Info : J-Link caps 0xb9ff7bbf |
||
+ | Info : J-Link hw version 80000 |
||
+ | Info : J-Link hw type J-Link |
||
+ | Info : J-Link max mem block 9576 |
||
+ | Info : J-Link configuration |
||
+ | Info : USB-Address: 0x0 |
||
+ | Info : Kickstart power on JTAG-pin 19: 0xffffffff |
||
+ | Info : Vref = 3.332 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 1 TRST = 1 |
||
+ | Info : J-Link JTAG Interface ready |
||
+ | Info : clock speed 1000 kHz |
||
+ | Info : JTAG tap: sam7x.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) |
||
+ | Info : Embedded ICE version 1 |
||
+ | Info : sam7x.cpu: hardware has 2 breakpoint/watchpoint units |
||
+ | </pre> |
||
+ | |||
+ | Launching a telnet: |
||
+ | <pre> |
||
+ | telnet localhost 4444 |
||
+ | Connected to localhost. |
||
+ | Escape character is '^]'. |
||
+ | Open On-Chip Debugger |
||
+ | > halt |
||
+ | target state: halted |
||
+ | target halted in ARM state due to debug-request, current mode: Supervisor |
||
+ | cpsr: 0xf00000d3 pc: 0x001c9c60 |
||
+ | > flash erase_sector 0 0 15 |
||
+ | erased sectors 0 through 15 on flash bank 0 in 0.033260s |
||
+ | > flash write_image /tmp/bootrom.s19 0x100000 |
||
+ | wrote 3624 bytes from file /tmp/bootrom.s19 in 0.392169s (9.024 KiB/s) |
||
+ | </pre> |
||
+ | The chip was new but in case you need to backup the chip content first, this should be possible with sth like "dump_image original.bin 0x100000 0x80000" |
||
+ | ===Flashing full image=== |
||
+ | I also tried to flash the fullimage via JTAG but it failed working afterwards, so once the bootloader is installed, I used the usual recovery procedure: |
||
+ | * Press button and keep it pressed during the whole procedure |
||
+ | * Plug PM3 to USB |
||
+ | * ./flasher /dev/ttyACM0 fullimage.elf |
||
+ | * Release button and re-plug the PM3 |
||
+ | <pre> |
||
+ | ===Done=== |
||
+ | $ ./proxmark3 /dev/ttyACM0 |
||
+ | Proxmark3 RFID instrument |
||
+ | bootrom: iceman/iceman/v2.1.0-1547-gb0df293d 2017-05-03 20:44:34 |
||
+ | os: iceman/iceman/v2.1.0-1547-gb0df293d 2017-05-03 20:44:39 |
||
+ | LF FPGA image built for 2s30vq100 on 2015/03/06 at 07:38:04 |
||
+ | HF FPGA image built for 2s30vq100 on 2015/11/ 2 at 9: 8: 8 |
||
+ | |||
+ | uC: AT91SAM7S512 Rev B |
||
+ | Embedded Processor: ARM7TDMI |
||
+ | Nonvolatile Program Memory Size: 512K bytes. Used: 217204 bytes (41%). |
||
+ | Free: 307084 bytes (59%). |
||
+ | Second Nonvolatile Program Memory Size: None |
||
+ | Internal SRAM Size: 64K bytes |
||
+ | Architecture Identifier: AT91SAM7Sxx Series |
||
+ | Nonvolatile Program Memory Type: Embedded Flash Memory |
||
+ | </pre> |
Revision as of 09:35, 4 May 2017
Upgrading ELECHOUSE Proxmark3 Easy V3 to 512k
(de)soldering
The popular Proxmark3 Easy has an at91sam7s256 with only 256k and e.g. it's already about 83% full with the current iceman firmware.
So I decided to attempt an upgrade.
at91sam7s512 is about [15€ on http://fr.farnell.com/atmel/at91sam7s512b-au/micro-32-bits-arm7-512k-flash/dp/1972051 Farnell].
The steps I followed to desolder and solder the new chip are basically the same as seen on this youtube video:
- heating the chip with my desoldering station
- removing the chip with a small suction pen
- putting flux on the pads
- cleaning the pads with desoldering wire
- putting the new chip and soldering some pins to lock it in place (look for aligning the small dot on the correct corner)
- putting flux on the pins
- putting solder on the pins, don't be afraid of bridges...
- removing extra solder with desoldering wire
- checking carefully for residual solder bridges
And voila.
Note that it's maybe easier to solder the new chip not by using flux+solder+iron but solder flux paste and heating with air gun, as shown in this video...
JTAG programming
Then wire your JTAG programmer to the board. Mine is a Segger J-Link.
To make it easier, solder a breakable single-row male curved header.
Choose a curved one so you can leave it in place later and still stack the PM3 daughterboard.
Then using Dupont wires male-female, wire it to the JTAG programmer.
For the J-Link, the pinout is:
--------- --------- |1917151311 9 7 5 3 1| |201816141210 8 6 4 2| -------------------- PM3 JLink --- ----- TMS 7 TDI 5 TDO 13 TCK 9 GND 6 3.3 not connected
I didn't connect the 3v3 because J-Link Vref is 5v so I prefered to power the PM3 over USB while reprogramming it.
To use the J-Link on Debian:
$ apt-get install openocd
There is some doc installed locally: file:///usr/share/doc/openocd/openocd.html/index.html
Create /etc/udev/rules.d/60-jlink.rules with
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="664", GROUP="plugdev"
I created a config file by reusing most of tools/at91sam7s512-buspirate.cfg, but specific to J-Link instead of buspirate:
telnet_port 4444 gdb_port 3333 interface jlink transport select jtag adapter_khz 1000 reset_config srst_only srst_pulls_trst jtag newtap sam7x cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x3f0f0f0f target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu sam7x.cpu configure -event reset-init { soft_reset_halt mww 0xfffffd00 0xa5000004 # RSTC_CR: Reset peripherals mww 0xfffffd44 0x00008000 # WDT_MR: disable watchdog mww 0xfffffd08 0xa5000001 # RSTC_MR enable user reset mww 0xfffffc20 0x00005001 # CKGR_MOR : enable the main oscillator sleep 10 mww 0xfffffc2c 0x000b1c02 # CKGR_PLLR: 16MHz * 12/2 = 96MHz sleep 10 mww 0xfffffc30 0x00000007 # PMC_MCKR : MCK = PLL / 2 = 48 MHz sleep 10 mww 0xffffff60 0x00480100 # MC_FMR: flash mode (FWS=1,FMCN=72) sleep 100 } gdb_memory_map enable sam7x.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0 flash bank sam7x.flash.0 at91sam7 0 0 0 0 sam7x.cpu 0 0 0 0 0 0 0 18432 flash bank sam7x.flash.1 at91sam7 0 0 0 0 sam7x.cpu 1 0 0 0 0 0 0 18432
Launching OpenOCD:
$ openocd -f at91sam7s512-jlink.cfg Open On-Chip Debugger 0.9.0 (2017-03-07-13:28) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html adapter speed: 1000 kHz srst_only srst_pulls_trst srst_gates_jtag srst_open_drain connect_deassert_srst Info : J-Link ARM V8 compiled Dec 1 2009 11:42:48 Info : J-Link caps 0xb9ff7bbf Info : J-Link hw version 80000 Info : J-Link hw type J-Link Info : J-Link max mem block 9576 Info : J-Link configuration Info : USB-Address: 0x0 Info : Kickstart power on JTAG-pin 19: 0xffffffff Info : Vref = 3.332 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 1 TRST = 1 Info : J-Link JTAG Interface ready Info : clock speed 1000 kHz Info : JTAG tap: sam7x.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787, part: 0xf0f0, ver: 0x3) Info : Embedded ICE version 1 Info : sam7x.cpu: hardware has 2 breakpoint/watchpoint units
Launching a telnet:
telnet localhost 4444 Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > halt target state: halted target halted in ARM state due to debug-request, current mode: Supervisor cpsr: 0xf00000d3 pc: 0x001c9c60 > flash erase_sector 0 0 15 erased sectors 0 through 15 on flash bank 0 in 0.033260s > flash write_image /tmp/bootrom.s19 0x100000 wrote 3624 bytes from file /tmp/bootrom.s19 in 0.392169s (9.024 KiB/s)
The chip was new but in case you need to backup the chip content first, this should be possible with sth like "dump_image original.bin 0x100000 0x80000"
Flashing full image
I also tried to flash the fullimage via JTAG but it failed working afterwards, so once the bootloader is installed, I used the usual recovery procedure:
- Press button and keep it pressed during the whole procedure
- Plug PM3 to USB
- ./flasher /dev/ttyACM0 fullimage.elf
- Release button and re-plug the PM3
===Done=== $ ./proxmark3 /dev/ttyACM0 Proxmark3 RFID instrument bootrom: iceman/iceman/v2.1.0-1547-gb0df293d 2017-05-03 20:44:34 os: iceman/iceman/v2.1.0-1547-gb0df293d 2017-05-03 20:44:39 LF FPGA image built for 2s30vq100 on 2015/03/06 at 07:38:04 HF FPGA image built for 2s30vq100 on 2015/11/ 2 at 9: 8: 8 uC: AT91SAM7S512 Rev B Embedded Processor: ARM7TDMI Nonvolatile Program Memory Size: 512K bytes. Used: 217204 bytes (41%). Free: 307084 bytes (59%). Second Nonvolatile Program Memory Size: None Internal SRAM Size: 64K bytes Architecture Identifier: AT91SAM7Sxx Series Nonvolatile Program Memory Type: Embedded Flash Memory