Garmin PIN kodo nulaužimas 2025.01.29 at 13:44

Kažkada labai seniai, realiai seniai, prieš kokia 10 metų, nusipirkau eBay Garmin navigaciją Nuvi 660 Euro. Net ir tuo metu Garmin, Mio ir kiti navigacijos prietaisai jau buvo išstumti navigacijų, esančių protinguose telefonuose, todėl pirkau pigiai. Pats prietaisas lyg ir veikiantis, bet pilnai įjungti nepavyko – uždėtas PIN kodas, be kurio prietaisas nieko nerodo, tik PIN kodo įvedimo meniu. O turėtų būti va toks vaizdelis:

Jau neprisimenu, ar kreipiausi į pardavėją, kad grąžintų pinigus, bet PINo tikrai negavau. Gal dėl to, kad navigaciją įsijungiau gerokai po visų eBay terminų (nes ir pats jau naudojau telefoninę navigaciją). Tuo metu buvau pradėjęs žaisti su Arduino, todėl sugalvojau pasidaryti hardware’inį bruteforcer’į. Kaip čia tas daiktas vadintųsi lietuviškai..? Mechaninis kodo spėliotojas arba parinkiklis, arba rinkiklis ? Turbūt. Su tuo PIN kodu viskas veikia taip – surenki 4 (gal) skaičiukus, Garmin’as pyptelna garsiuką ir parašo, kad kodas blogas. Alternatyvūs variantai, kuriuos pamenu iš anų laikų:

  • Laikyti Reset mygtuką 2 valandas 30 minučių, tas lyg ir pilnai perkrauna prietaisą į gamyklinius nustatymus. Gal, nebandžiau – lengvi keliai ne mums.
  • Susisiekti su gamintoju, pateikti pirkimo dokumentus ir gauti kažkokį atrakinimo būdą, PIN kodą ar kažką. Irgi ne variantas, nes pirkimo dokumentų neturiu.

Pats PINas gyvena iš išorės neprieinamoje atmintyje (per USB jungtį), ta atmintis nepriklausoma nuo maitinimo, todėl atjungus akumuliatorių neišsitrina. Greičiausiai galima būtų pasijungti atminties mikroschemą prie programatoriaus ir, nuskaičius duomenis, rasti/pakeisti PINą. Bet irgi, lengvi keliai ne mums 😋. Ir todėl pradėjau tokio mechaninio PIN rinkiklio projektą. Anuomet Internete mačiau tokį prietaisą, gal gremėzdišką, kuris mechaniškai rinko PIN kodą, spaudė OK ir su kažkokiu šviesos davikliu tikrino, ar ekrano šviesumas pasikeitė iš PIN kodo meniu aplinkos (tamsi) į žemėlapį, kuris yra šviesesnis. Toks būdas kaip ir tinkamas, kai žinai tą tašką, kuriame ekranas pasikeičia iš tamsaus į šviesų ir tik tuo atveju, jei PIN teisingas. Dar buvo kažkoks pusiau CNC aparatas, kuris mygtuko „spaudiklį” judindavo link reikiamo mygtuko, dar mačiau ir tokį, kur buvo prisijungia prie touchpad’o, ekrano prilietimus apdorojančios mikroschemos, ir paspaudimus šėrė kaip jau gatavus duomenis į procesorių.

Aš sugalvojau kitą būdą – spaudinėti ekraną mechaniškai, o PIN kodo teisingumą detektuoti pagal garsą. Reikalas tame, kad surinkus PIN kodą, prietaisas sugroja tam tikrą toną ar tonus. Tuo metu tikėjausi, kad blogo PIN kodo garsas skiriasi nuo gero PIN kodo garso. Kol kas dar nežinau kaip iš tikrųjų, bet su laiku paaiškės. Bet blogo PIN kodo garsą girdėjau ne vieną kartą, bandydamas rankutėmis surinkti populiariausius PIN (0000, 1234 ir t. t.). Taigi, pradėjau kurti schemą ir gavosi va tokia vat:

Kaip visada, paanalizuokime, kaip čia kas su ta schema. Blemba, dabar kai žiūriu į schemą – kiek visko daryčiau kitaip, geriau, patogiau, paprasčiau 🙂, taip, kaip sakoma, „gyveni ir mokaisi”. Paveiksliukas didinasi į naują kortelę (į naują tab’ą, jeigu lietuviškai).

Kairėje pusėje DC/DC konverteris, kurio pagrindas LMZ23605TZ/NOPB mikroschema, konverteris. Efektyvumas, prie man reikiamų srovių apie 90 % arba daugiau, išėjimo srovė gerokai per didelį, net 5A, bet pamenu, pasirinkau būtent tokį konverteriuką, nes norėjau išbandyti tą mikroschemą, kaip ji veikia, konfigūruojasi, valdoma ir t. t., tai, kad nešvaistyti papildomai resursų, parinkau ją kuriamam prietaisiukui. Visas maitinimo šaltinis surinktas su keliomis išorinėmis detalėmis – įėjimo kondensatorius C1, išėjimo kondensatorius C2, R1-R2 daliklis, išėjimo įtampai nustatyti. Papildomų mikroschemos funkcijų, pavyzdžiui, minkšto paleidimo, nenaudojau, tai nėra ir papildomų detalių. Visų komponentų skaičiavimas ar parinkimas gerai aprašytas mikroschemos aprašyme, tai labai nepasakosiu, tik išėjimo daliklio skaičiavimas 5V išėjimo įtampai (VO):

\[ V_O = 0,796\,\text{V} \times \left( 1 + \frac{R_{FBT}}{R_{FBB}} \right)\]
\[ 5V = 0,796\,\text{V} \times \left( 1 + \frac{R_{FBT}}{R_{FBB}} \right)\]
\[ \frac{5V}{0,796V} = 1 + \frac{R_{FBT}}{R_{FBB}} \]

Ir dar supaprastinam:

\[ \frac{R_{FBT}}{R_{FBB}} = \frac{5V}{0,796V} – 1 \]
\[ \frac{R_{FBT}}{R_{FBB}} = 6,2814 – 1 = 5,2814 \]

Taigi, rezistorių varžos santykis yra:

\[ \frac{R_{FBT}}{R_{FBB}} =5,2814 \]

Pasirenkam bet kurią varžą savo nuožiūra ir pagal gamintojo nustatytas varžos ribas, ir randame antrą varžą pagal formules:

\[ R_{FBT} = R_{FBB} \times 5,2814 \]
\[ R_{FBB} = \frac{R_{FBT}}{5,2814} \]

Jau nepamenu, kurį pasirinkau savo nuožiūra, bet tarkim RFBT paėmiau 5K62, tuomet:

\[ R_{FBB} = \frac{5620Ω}{5,2814} = 1 064,1117Ω \]

Artimiausias varžos nominalas – 1070 Ω. Dabar galima sudėlioti varžas į pirmąją formulę ir patikrinti kokią bus įtampa:

\[ V_O = 0,796\,\text{V} \times \left( 1 + \frac{5620Ω}{1070Ω} \right) = 4,9769 V\]

Beveik tiksliai 5V. Primenu, kad čia reikia naudoti precizinius rezistorius. Realiai mano Mastech MS8265 rodo 4,971V prie 8,4V ir 0,3A maitinimo. Tiek apie maitinimo dalį.

Šalia yra USB jungtis J2 Garmin’o krovimui, šeriam tiesiai tuos 5V ir tiek.

IC2 ir IC4 padeda mygtukams S1, S2, S3. Padeda tuo, kad atlieka debounce funkciją, taip sakant padaro mygtukų signalą gražų, su vienu įjungimu/išjungimu, antraip būtų matomas kontaktų „drebėjimas”, kai sujungimo metu kontaktas atsiranda ne iš karto, pradžioje mygtukas junginėjasi ir tik po keliu ar keliolikos mikrosekundžių stabilizuojasi.

Be debounce funkcijos procesoriukas fiksuotų kelis paspaudimus vietoje vieno, bet visą darbą padaro tam, skirta MAX6817 mikroschema.

Šalia matosi aktyvus pjezo-pypsiukas. Aktyvus – todėl jam užtenka paduoti maitinimą iš valdiklio, o ne kažkokį dažnį, kad išgirsti garsą. Jeigu nebūtų aktyvus – reiktų su valdikliu norimu dažniu junginėti išėjimą.

D1, R3 ir C3 skirti Reset grandinei ir programavimui. Kai viskas gerai, R3 laiko Reset kontaktą aukštame lygyje (pull-up), o įrašius naują programą į valdiklį jis, per C3 iš atitinkamo programavimo jungties kontakto, automatiškai perkraunamas. JP2 – trumpiklis, kad perjungti valdiklio kontaktus programavimui arba solenoidų valdymui.

Visko centre – AtMega328P valdiklis, šalia 16 Mhz kvarciukas.

Dešiniau nuo valdiklio visas būrys BSP76 smartFETų, tranzistoriukų ir jungtelės solenoidams.

Viršuje LCD displėjaus blokas, valdomas dviem laidais per 74LS164D registrą ir loginio IR mikroschemos NC7S08M5X. Apie tai rašiau seniai, 2015 metais, kai šios schemos dalies pagrindu pasidariau LCD skydą Arduinui – Arduino 2 laidų LCD skydas. Veikimas paprastas, šeriam reikiamus duomenis nuosekliai į 74LS164D, pasirenkam reikiamą bitą (1 arba 0) QC išėjime, pagal tai, ar siunčiama komanda ar duomenys, paskutinį bitą QH padarom loginiu 1, tuo pačiu duomenų kontaktą irgi padarom loginiu 1, tada IR elemento išėjimas irgi tampa loginiu 1, tuo pačiu loginis 1 atsiranda LCD displėjaus E kontakte, tuo sukomanduoja LCD displėjui nuskaityti duomenis iš duomenų šynos DB4-DB7 (naudojamas 4 bitų duomenų perdavimas).

Ir beliko schemos apačioje esantis garso apdorojimo blokas. Jo pagrindas – labai populiarus audio stiprintuvėlis LM386M ir 74LVC1G17DCK buferio. Audio signalas iš jungties, per DC blokuojantį kondensatorių C4 patenka į stiprintuvą. Jo paskirtis yra sustiprinti signalą, jeigu kartais Garmino signalas būtų per silpnas arba nebūtų galimybės pasigarsinti Garmino garsą. Būtent toks stiprintuvas pasirinktas nes atitinka jo maitinimo įtampa, 5V ir vienpolis, plius beveik nereikia išorinių elementų, nes vidinis stiprinimas jau sureguliuotas ties 20, bet prireikus, papildomo potenciometro pagalba galima reguliuoti nuo tų 20 iki 200. Principe panaudota schema iš aprašymo:

Tik truputį patobulinta, kad būtų galimybė keisti stiprinimą. Toliau seka dar vienas filtruojantis kondensatorius C6. Tuomet testavimo taškas TP1, skirtas prijungti oscilografą, pažiūrėti, koks signalas yra tarp stiprintuvo ir buferio. Tuomet buferis, dirbantis kaip Šmito trigeris. Šiek tiek iš Wikipedios:

Šmito trigeris – vieną analoginį įėjimą, vieną loginį (1/0) išėjimą ir dvi būsenas turinti schema, pasižyminti histereze. Šmito trigeris turi du įėjimo slenksčius. Esant įėjimo signalui žemiau pirmojo slenksčio, schema pereina į loginio nulio būsena ir lieka joje tol, kol signalas neviršija antrojo (aukštesnio) perjungimo į loginio vieneto būseną slenksčio. Loginio vieneto būsenoje schema lieka tol, kol įėjimo įtampa nenukrinta žemiau pirmojo (į nulinę būseną perjungiančio) slenksčio.

Jeigu paprastai, kai įtampa įėjime viršija, tarkim 1V trigerio išėjime yra loginis 1, kai įtampa žemiau 1V, išėjime loginis 0. Taip labai paprastai iš sinusoidės padarome meadnro formos signalą, plius dar su histereze. O meandro formos signalas visada bus arba 0V arba 5V, todėl jį labai lengva detektuoti ir apskaičiuoti dažnį su valdikliu – nebus jokių sinuso formos signalų, kur dar trukdžiai ir visi kiti blogi dalykai, galintys iškreipti dažnio matavimą. Mūsų atveju viskas atrodo va taip:

Panašiai 1 kHz sinusoidė įėjime (geltona linija) po stiprintuvo ir buferio tampa stabiliu meandru (mėlyna linija). Nebelieka ir neigiamo poliarumo įtampų, kas valdikliui būtų ankstyva mirtis dar nepradėjus kaip reikiant dirbti. Tačiau matosi kažkokie šuoliai persijungimų metu, juos būtų gerai irgi panaikinti, gal užtektų kokio nedidelio keraminio kondensatoriuko išėjime.

Štai ir visa schema. Paprasta kaip du kart du.

Antra klausimo pusė yra programa. Per tuos 10 metų vis prišokdavau kažką parašyti, tai dabar ten toks zooparkas, kad pats jau turiu pagalvoti apie ką ten rašiau 😁. Bet prisimenu, kad buvo tikslas kažkaip pasidaryti meniu. Tam sugalvojau naudoti meniu „flag’ą”, žymę, kuri keičiasi sulig kiekvienu meniu ir pagal ją atitinkamai valdomas tekstas ekrane ir funkcijos. Meniu struktūra:

  • Pagrindinis vaizdas, tiesiog parašyta
    PIN bruteforcer
    Menu – press UP
  • Paspaudus į viršų galima mygtukais aukštyn ir žemyn valdyti meniu:
  • Start cracking
    OK to start !
  • Crack from XXXX?
    Enter start PIN
  • Solenoid test
    OK to run test
  • Check sound frequency
    PIN BAD frequ.
  • Enter desired
    sound frequency?
  • Exit

Ties šita vieta pagalvojau, o gal perrašyti viską nuo nulio, tuo pačiu pasikartoti programavimą ir gal pavyks optimizuoti kodą, plius nebus toks kratinys.

2025.01.13

Perrašiau kodą, kažkiek paotimizavau, kažką palikau kaip buvo, kad nepersikrauti smegenų 🙂. Reikia susilipdyti bandymų stendą. Tiesiogine prasme susilipdyti. Tam reikia Garmin prietaiso ir medinių pagaliukų:

Tiks tiltas laikys visą PIN rinkiklį. Pagaliukai tarpusavyje suklijuoti ciano akrilatu (aka Super Glue), tiltas priklijuotas prie Garmin’o dvipuse lipnia juostele ir išcentruotas:

Kad šoninių skaičių nesimato – nieko tokio, toje vietoje paspaudus vis dar suveikia teisingas skaičius. Dar truputis dvipusės lipnios ant PIN rinkiklio ir klijuojam visą konstrukciją į krūvą:

Užklijavus patikrinam, ar lengvai paspaudžiami visi skaičiai, niekas nekliūna. Apie teisingą paspaudimą žinome pagal garsą.

Čia dar pirmoji softo versija, turinti dažnio įsiminimo funkciją, bet po to ją išmečiau kaip nepraktišką ir sunkiai pagaunamą. Dabar tiesiog galima pamatyti koks kada dažnis groja. paprastų mygtukų paspaudimai ~630 Hz, paspaudus OK sugroja ~630 Hz ir ~1600 Hz. Taip sužinome, kokio panašiai dažnio reikia ir, pasinaudojus atitinkamu meniu punktu įvedame rankiniu būdu. Įsimenamos dažnių reikšmės ±200 Hz, tai įvedus 1600 Hz dažnio paieškai naudos nuo 1400 Hz iki 1800 Hz.

Perrašius programą truputį pasikeitė meniu struktūra, naujoji:

  • Pagrindinis ekranas – PIN Bruteforcer / Menu – UP/DOWN
  • Start Cracking / OK to start !
  • Crack from XXXX? / Enter start PIN
  • Solenoid test / OK to run test
  • Check sound / frequency
  • Enter desired / sound frequency
  • EXIT

Veikimo logika tokia. Įjungus prietaisą reikia nustatyti detektuojamą dažnį. Net jeigu iš karto eiti į Start Cracking, vis tiek bus nukreipimas dažnio įvedimui:

Įvedus dažnį parodoma informacija apie detektuojamų dažnių ribas, pasirinkus Start Cracking tos ribos dar kartelį parodomos. Jeigu nežinomas dažnis, kurio reikia, tuomet pirma pasirenkame punktą „Check sound frequency” ir pasimatuojame koks ten dažnis (video aukščiau). Dabar tik įdėsiu kaip atrodo naujas meniu matavimui ir iš dažnių generatoriaus pašeriu apie 1500 Hz, dažnis pačiam generatoriuje plaukioja, tai parodymai irgi plaukioja iš paskos. Matavimo tikslumas gal nėra didelis, bet tokiai paskirčiai tikrai pakankamas.

Ir tuomet, kai jau turime suvestą dažnį, galima pradėti parinkinėti PIN kodą. Iš niuansų – dažnio matavimui galima pareguliuoti jo stiprumą daugiasūkiu paderinimo potenciometriuku, idealiausia matuoti signalą oscilografu TP1 ir TP2 taškuose, bet nebūtina.

Ar teisingai pataikyta į Garmino mygtukus patikrai ir tuo pačiu ar visi solenoidai veikia/nestringa/pasiekia ekraną galima įjungti solenoidų testavimo programėlę:

Bemaigydamas mygtukus pagalvojau, kad visai gal norėčiau turėti galimybę užtildyti pypsiką, nes labai daug pypsi, tai meniu papildytas „MUTE” funkcija. Tuo pačiu kaip ir pabaigiau PIN rinkimo procedūrą, nieko ten labai mandro – surenka PINą, 3 sekundes detektuoja dažnius, jeigu per tą laiką užfiksuoja nustatytą dažnį, kuris reiškia „PIN neteisingas” – palaukia šiek tiek, kol Garminas persijungs iš „PIN neteisingas” lango į PIN įvedimo langą ir renka sekantį kodą. Jeigu nustatyto dažnio neaptinka – parašo, kad PINas yra toks koks buvo suvestas.

Paskubėjau kuo greičiau sužinoti koks gi tas PIN kodas, todėl be didelių kodo optimizavimų ir papildomo funkcionalumo palikau atkodatorių/bruteforcerį maigyti Garminą, o Garminą pypsėti. Atėjau po kiek laiko ir matau, kad PIN kodas surastas – 0324. O bet tačiau – jis neteisingas. Nors mano prietaisas nesuklydo – garso, reiškiančio, kad PIN blogas iš tiesų nebuvo, nes, pasirodo, Garminas pakibo. Taip taip, ateinu, o jis ore kaba 😆. O jei rimtai, pakibo ties ekranu, kur rodoma informacija ką daryti, jeigu PIN blogas. Perkrovus vėl viskas įsijungė į PIN įvedimo ekraną. Bet tai blyyyyn, negi dabar vėl nuo 0000 reiks koduoti 😅? Nesąmonė, paėmiau ir parašiau trūkstamą programos dalį, kur galima įvesti nuo kurio PIN pradėti. Ties ta vieta irgi dar pasvarsčiau ar neperrašius man visko dar kartelį iš naujo, apsisprendžiant kaip geriau saugoti piną, masyve ar kaip paprastą skaičių. Bet kūrybinė krizė buvo praėjus, tai tik parašiau PIN įvedimo dalį, prakonvertuojant PIN kintamąjį, kad tiktų likusiai programai ir sušėriau Atmegai. Procesas užsisuko, nors protarpiais Garminas vis dar pakibdavo, bet po perkrovimo tereikėjo įvesti detektuojamą dažnį ir nuo kurio PIN važiuojam toliau, nesudėtinga. Ir po kiek laiko, jeigu kas patikės, kad sėkmingai pataikiau nufilmuoti būtent tada, kai tikrasis PINas atrastas:

Ir bandymas rankiniu būdu įvesti PINą 1948:

Gaunamas startinis konfigūravimo ekranas, kadangi buvo spaustas Reset mygtukas. Šiaip būtų įsijungęs neresetuotas Garminas, su buvusio vartotojo nustatymais, istorija ir t.t.

Štai ir viskas, baigėsi šita epopėja, užtrukusi 10 metų 😂. Dar iš įdomesnių niuansų – jeigu Garminą prijungti prie maitinimo šaltinio naudojant standartinį mini USB kabeliuką – jis persijungia į PC režimą ir rodo tik kompiuteriuką ekrane. Norint, kad taip nebūtų, reikia arba specialaus kabeliuko, arba standartiniam kabeliukui sujungti kartu 4 (ID) ir 5 (GND) kontaktus, paveiksliukas iš Interneto:

Programa neoptimizuota, kažkiek vis dar padrika, Eagle schema ir PCB berods teisingos, viskas yra čia.

Leave a Reply

The maximum upload file size: 3 MB. You can upload: image. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop files here


*