Dieser Artikel ist kein Leitfaden für Hacker, sondern ein Hinweis darauf, wie die von MICROCHIP bereitgestellten Tools zum Schutz der Firmware im Chip ordnungsgemäß verwendet werden.
Ich erinnere mich nicht, wie viele Jahre es her ist, als ich auf einen Artikel stieß: "Herz der Dunkelheit - Erkundung der unbekannten Backwaters der versteckten Klassensicherheit von Milosch Meriac". Der Kern des Artikels liegt in Fragen der Sicherheit von iCLASS-Karten. Im Allgemeinen ging ich den Artikel schnell durch, bis ich auf Folgendes stieß: "Kopierschutz? Du machst Witze!" Und ich war "vor Freude knorrig" ... aber warum war es möglich !!!?
Entschuldigung, nichts ist klar, ich werde es jetzt erklären.
Ich erinnere mich nicht, welcher PIC damals zur Hand war, jetzt gibt es einen PIC18F26K20.
Das Wesen der Verwundbarkeit.
Starten Sie PICKIT und öffnen Sie unterwegs das Programmierdatenblatt PIC18F * K *.
Wir sehen, grüne Bits des EEPROM-Schutzes, rote Schutzbits des BOOT-Blocks, blaue Code-Schutzbits, Blöcke 0-3.
CPB / WRTB, CP [3: 0] / WRT [3: 0] - Schutz vor Lesen / Schreiben von Code, zuerst BOOT, dann Blockieren mit 0-3.
CPD/WRTD - / EEP .
: EBTRB/EBTR[3:0] - .
"" ( ):
, - !
:
! !
.
, :
, - " 1 0, , 1 . . 1". , !
BOOT , , EUSART.
, BOOT , " ", 0, , NOP', " ". :
HEX , ! .
, EEP. :
. .
, . :
: 0x3F8F, BOOT: 0x0084, Block0: 0x0180.
?
PICKIT3 ( " " , ):
. Microchip (PICkit3 Programmer Application v3.10).
... , , , PIC KIT Programmer...
( )... !!! !!! ?
PK2DeviceFile.dat
, , PK2DeviceFile.dat (pickit2-editor, "" ).
PicKit2 Editor :
, , (0x3F8F -> 0x0084).
0x3F 0x00, 0x8F 0x84. ERASE, PicKit Programmer , BOOT .
, .
, EUSART , EUASRT, RS232->USB ( . ). :
, 18- ( , ):
. :
data_reader.c
#include "pic18fregs.h"
/* CONFIG1L */
#pragma config FOSC = INTIO67
#pragma config FCMEN = OFF
#pragma config IESO = OFF
/* CONFIG2L */
#pragma config PWRT = OFF
#pragma config BOREN = NOSLP
#pragma config BORV = 18
/* CONFIG2H */
#pragma config WDTEN = ON
#pragma config WDTPS = 128
/* CONFIG3H */
#pragma config CCP2MX = PORTC
#pragma config PBADEN = OFF
#pragma config LPT1OSC = OFF
#pragma config HFOFST = OFF
#pragma config MCLRE = OFF
/* CONFIG4L */
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
/* CONFIG5L */
#pragma config CP0 = ON
#pragma config CP1 = ON
#pragma config CP2 = ON
#pragma config CP3 = ON
/* CONFIG5H */
#pragma config CPB = ON
#pragma config CPD = OFF
/* CONFIG6L */
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
/* CONFIG6H */
#pragma config WRTD = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
/* CONFIG7L */
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
/* CONFIG7H */
#pragma config EBTRB = OFF
typedef __code unsigned char *CODEPTR;
void main()
{
unsigned int uaddr = 0;
CODEPTR c;
TRISA = 0;
TRISB = 0;
TRISC = 0;
/* Set Default State of OSC */
OSCCON = 0b00110000;
PIR2 = PIE2 = OSCTUNE = 0;
IPR2 = 0xFF;
/* Disable IRQs */
INTCONbits.GIE = 0;
/* enable EUSART */
RCSTAbits.SPEN = 1;
/* baud rate to 2400 Baud */
SPBRG = 25;
/* enable TX + only HI byte divisor */
TXSTA = 0b00100100;
c = 0x0;
do
{
TXREG = *c++;
while (!TXSTAbits.TRMT);
ClrWdt();
} while (c != (CODEPTR)0x10000);
while (1)
{
/* Recharge WDT */
ClrWdt();
}
}
:
data_reader.hex
:020000040000FA :10000000926A936A946A300ED36E9B6AA06AA16A60 :10001000FF0EA26EF29EAB8E190EAF6E240EAC6E6A :10002000006A016A026A00C0F6FF01C0F7FF02C061 :10003000F8FF0900F5CFADFF002A02E3014A022ACA :10004000ACA2FED70400005005E1015003E10250CC :0C005000010A01E0E8D70400FED712000E :020000040030CA :03000100081D0FC8 :02000500018177 :0600080000C00FE00F40F4 :00000001FF
:
.
. .
:
EBTRB/EBTR[3:0] - .
PIC18 .
:
EBTRB/EBTR[3:0] - , " " .
, - , ! .
.
.