Buvo nupirktas naudotas Opel Astra automobilis su standartiniu grotuvu. Šis buvo užrakintas kelis kartus suvedus netinkamą, pardavėjo duotą kodą. Panagrinėjęs su automobilinių grotuvų atkodavimu susijusius internetinius forumus radau informaciją, kaip galima atrakinti šio tipo grotuvus. Pasirodo visa su iškodavimu susijusi informacija saugoma EEPROM mikroschemoje. Specialaus EEPROM programatoriaus aš neturiu, bet jo funkcijas pilnai gali atlikti Arduino plokštė su atitinkama programa. Prilitavus laidus nuo Arduino išvadų iki atitinkamų EEPROM kontaktų galima nuskaityti ir keisti EEPROM turinį. Prie straipsnio pridėta programa gali išvesti EEPROM dump`ą (jį galima panaudoti PIN kodo suradimui), koreguoti nesėkmingų bandymų skaitliuko reikšmę, bei visai išjungti grotuvo reikalavimą įvedinėti saugos kodą po maitinimo dingimo. Naudota Arduino NANO plokštė, bet turi veikti ir su bet kokia kita. EEPROM jungiama kaip pateikta programos pavyzdyje pridėtame prie EEPROM bibliotekos http://www.idreammicro.com/svn/idreammicro-arduino/trunk/libraries/Eeprom24C04_16/
Programos kodas
#include #include <Eeprom24C04_16.h> #define EEPROM_ADDRESS 0x50 static Eeprom24C04_16 eeprom(EEPROM_ADDRESS); int talpa = 2048; void trinam() { byte r; Serial.println("Uzpildom"); for (int i = 0; i < talpa; i++) { //eeprom.writeByte( i, i & 0xFF ); //delay( 20 ); if ( ( i & 63 ) == 0 ) { Serial.println(i); } } Serial.println("Uzpildyta"); Serial.println("-----------------------------"); } void rasom() { digitalWrite(13, HIGH); Serial.println("Skaitom EEPROM..."); Serial.println(""); if ( eeprom.readByte(0x88) == 0 ) { Serial.println("Kodo reikalavimas buvo isjungtas"); Serial.println(""); Serial.println("Rasom EEPROM"); Serial.println(""); delay(50); eeprom.writeByte(0x87, 0x02); delay(50); eeprom.writeByte(0x88, 0x01); Serial.println("Kodo reikalavimas dabar ijungtas"); } else { Serial.println("Kodo reikalavimas buvo ijungtas"); Serial.println(""); Serial.println("Rasom EEPROM"); Serial.println(""); delay(50); eeprom.writeByte(0x87, 0x00); delay(50); eeprom.writeByte(0x88, 0x00); Serial.println("Kodo reikalavimas dabar isjungtas"); } Serial.println(""); Serial.println("-----------------------------"); Serial.println(""); digitalWrite(13, LOW); } void rasom2() { digitalWrite(13, HIGH); Serial.println("Skaitom EEPROM..."); byte data = eeprom.readByte(0x89); Serial.println(""); Serial.print("Likusiu bandymu skaicius: "); Serial.println(data); Serial.println(""); Serial.println("Rasom EEPROM"); delay(50); eeprom.writeByte(0x89, 0x0A); delay(50); Serial.println("Skaitom EEPROM..."); data = eeprom.readByte(0x89); Serial.println(""); Serial.println("Atkurtos pradines skaitliuko vertes."); Serial.println("-----------------------------"); Serial.println(""); Serial.println(""); digitalWrite(13, LOW); } void skaitom() { byte data; Serial.println("----------pradzia------------"); for ( int i = 0; i < talpa; i++) { if ( ( i & 0xF) == 0) { Serial.println(""); if ( i < 0xF ) { Serial.print("0"); } if ( i < 0xFF ) { Serial.print("0"); } if ( i < 0xFFF ) { Serial.print("0"); } Serial.print( i, HEX); Serial.print(" "); } data = eeprom.readByte( i ); if ( data < 0x10 ) { Serial.print("0"); } Serial.print(data, HEX); if ( ( i & 3 ) == 3) { Serial.print(" "); } } Serial.println(""); Serial.println("-----------pabaiga-----------"); Serial.println(""); Serial.println(""); } void pagalba() { Serial.println("24c16 dekoderis VDO CDR500"); Serial.println("Skaityti EEPROM turini - s"); Serial.println("Isjungti kodo reikalavima - r"); Serial.println("Atstatyti skaitliuka - a"); Serial.println("Pagalba - p"); Serial.println("-----------------------------"); Serial.println(""); Serial.println(""); } void setup() { Serial.begin(57600); eeprom.initialize(); pinMode(13, OUTPUT); pagalba(); } void loop() { byte r; while (Serial.available() > 0) { r = Serial.read(); if (r == 'p') { pagalba(); } if (r == 'u') { trinam(); } if (r == 'r') { rasom(); } if (r == 'a') { rasom2(); } if (r == 's') { skaitom(); } } }