Reverse engineering and hacking external self-encrypting drives has been a long-standing hobby of mine. In the past, I experimented with models such as Zalman VE-400, Zalman ZM-SHE500, and Zalman ZM-VE500. Recently, a colleague brought me another specimen: Patriot (Aigo) SK8671, which follows a typical design – an LCD indicator and a keypad for entering the PIN code. Here's what I got from it...

1. Introducere

Carcasa

Packaging
Access to the data stored on the disk, which is supposedly encrypted, is granted after entering the PIN code. A few introductory notes on this device:
- To change the PIN code, you need to press F1 before unlocking;
- The PIN code must consist of 6 to 9 digits;
- After 15 incorrect attempts, the drive is wiped.
2. Hardware Architecture
First, we disassemble the device to understand its components. The most tedious task is opening the case: there are many microscopic screws and plastic parts. Upon opening the case, we see the following (note the five-pin connector I soldered):

2.1. Mainboard
The mainboard is quite straightforward:

The most notable parts (see from top to bottom):
- connector for the LCD indicator (CN1);
- buzzer (SP1);
- Pm25LD010 () SPI flash (U2);
- Jmicron JMS539 controller () for USB-SATA (U1);
- USB 3 connector (J1).
The SPI flash stores firmware for JMS539 and some settings.
2.2. LCD Indicator Board
There is nothing remarkable on the LCD board.


Just:
- LCD indicator of unknown origin (probably with a Chinese font set); with serial control;
- flat ribbon connector for the keypad board.
2.3. Keypad Board
Upon examining the keypad board, things take a more interesting turn.

Here, on the backside, we see a flat ribbon connector, as well as a Cypress CY8C21434 – a PSoC 1 microcontroller (hereafter, we'll refer to it simply as PSoC)

CY8C21434 uses an M8C instruction set (see. ). On [product page]( () it states that it supports the technology (a solution from Cypress for capacitive keyboards). Here, you can see the five-pin connector I soldered – this is a standard approach for connecting an external programmer via the ISSP interface.
2.4. Privind firele
Să înțelegem ce este conectat aici. Pentru aceasta, este suficient să testăm firele cu un multimeter:

Explicații pentru acest schema desenată pe genunchi:
- PSoC este descris în specificația tehnică;
- următorul conector, cel din dreapta – este interfața ISSP, care, prin voința sorții, corespunde informațiilor de pe internet;
- cel mai din dreapta conector – este terminalul pentru conectarea unui cablu cu placa tastaturii;
- dreptunghiul negru – este desenul conectorului CN1, destinat conectării plăcii principale la placa LCD. P11, P13 și P4 sunt conectate la pinii PSoC 11, 13 și 4 de pe placa LCD.
3. Sequence of Attack Steps
Acum că știm din ce componente constă acest dispozitiv, ne este necesar: 1) să ne asigurăm că funcționalitatea de bază a criptării este cu adevărat prezentă; 2) să aflăm cum sunt generate/salvate cheile de criptare; 3) să găsim unde este verificat pin codul.
Pentru aceasta, am realizat următorii pași:
- am obținut un dump de date de la flash-ul SPI;
- am încercat să obțin un dump de date de la flash-ul PSoC;
- am confirmat că transferul de date între Cypress PSoC și JMS539 conține de fapt tastele apăsate;
- m-am asigurat că atunci când se schimbă parola, nimic nu este rescris în flash-ul SPI;
- am fost prea leneș pentru a inversa firmware-ul 8051 de la JMS539.
3.1. Obținem dump de date de la flash-ul SPI
Această procedură este foarte simplă:
- conectați sondele la pini flash: CLK, MOSI, MISO și (opțional) EN;
- să "sniff-ui" comunicațiile cu un analizor logic (am folosit );
- decodificați protocolul SPI și exportați rezultatele în CSV;
- folosiți , pentru a analiza rezultatele și a obține dump-ul.
Rețineți că această abordare cu controlerul JMS539 funcționează în special bine, deoarece acest controler, în etapa de inițializare, încarcă tot firmware-ul din flash.
$ decode_spi.rb boot_spi1.csv dump
0.039776 : WRITE DISABLE
0.039777 : JEDEC READ ID
0.039784 : ID 0x7f 0x9d 0x21
---------------------
0.039788 : READ @ 0x0
0x12,0x42,0x00,0xd3,0x22,0x00,
[...]
$ ls --size --block-size=1 dump
49152 dump
$ sha1sum dump
3d9db0dde7b4aadd2b7705a46b5d04e1a1f3b125 dumpDupă ce am obținut dump-ul de la flash-ul SPI, am ajuns la concluzia că singura sa sarcină este să stocheze firmware-ul pentru dispozitivul de control JMicron, care este încorporat în microcontrolerul 8051. Din păcate, obținerea dump-ului de la flash-ul SPI s-a dovedit a fi inutilă:
- atunci când se schimbă pin-codul, dump-ul flash rămâne același;
- după etapa de inițializare, dispozitivul nu se mai referă la flash-ul SPI.
3.2. Sensing the Communications
Aceasta este una dintre metodele prin care putem determina care cip răspunde la verificarea comunicațiilor pentru intervalul de timp/conținut dorit. După cum știm, controlerul USB-SATA este conectat la Cypress PSoC LCD prin conectorul CN1 și două benzi. Deci, vom conecta sondele la cele trei pini corespunzători:
- P4, intrare/ieșire generală;
- P11, I2C SCL;
- P13, I2C SDA.

Apoi, pornim analizorul logic Saleae și introducem pe tastatură: "123456~". Rezultatul este următoarea diagramă.

În aceasta putem vedea trei canale de schimb de date:
- pe canalul P4 există câteva impulsuri scurte;
- pe P11 și P13 – un schimb de date aproape continuu.
Mărind primul impuls de pe canalul P4 ( dreptunghiul albastru din desenul anterior), vedem următoarele:

Aici se observă că pe P4 există aproape 70 ms de semnal uniform, care credeam la început că este un semnal de sincronizare. Totuși, după ce am petrecut ceva timp verificând ipoteza, am constatat că acesta nu este un semnal de sincronizare, ci un flux audio care este emis pe un difuzor atunci când sunt apăsate tastele. Așadar, această porțiune de semnal nu conține informații utile pentru noi. Totuși, poate fi utilizată ca un indicator – pentru a ști momentul când PSoC înregistrează apăsarea tastei.
Totuși, ultimul flux audio de pe canalul P4 este puțin diferit față de celelalte: acesta este sunetul pentru "cod PIN incorect"!
Revenind la diagramă pentru apăsarea tastelor, mărind ultima diagramă de flux audio (vezi din nou dreptunghiul albastru), obținem:

Aici vedem semnale uniforme pe P11. Aparent, acesta este semnalul de sincronizare. Iar P13 – datele. Observați cum se schimbă modelul după terminarea semnalului sonor. Ar fi interesant de văzut ce se întâmplă aici.
Protocolele care funcționează cu două fire sunt de obicei SPI sau I2C, iar în specificațiile tehnice pentru Cypress se menționează că acești pini corespund I2C, ceea ce se dovedește a fi corect și în cazul nostru:

Chipset-ul USB-SATA interoghează constant PSoC-ul pentru a citi starea butonului, care, în mod implicit, este „0”. Apoi, la apăsarea butonului „1”, acesta se schimbă în „1”. Transmiterea finală, imediat după apăsarea „~”, se deosebește dacă a fost introdus un PIN greșit. Cu toate acestea, deocamdată nu am verificat ce anume se transmite efectiv. Dar bănuiesc că nu este un cheie de criptare. Oricum, vezi secțiunea următoare pentru a înțelege cum am extras firmware-ul intern al PSoC-ului.
Sursa: habr.com
