А и она што го спомна со тоа да нема код, да се нули или било кој друг број е интересно па може да се развие и некоја дискусија на таа тема )
Па, се разбира дека може
. Причината зошто за некои модели нема калкулатор е тоа што кодот им е „хардверски запишан“ (imprinted) во EEPROM-от или MCU-то и кога ќе се внесе кодот преку тастатурата на радиото, само се споредува внесениот код со оној кој е во меморијата и радиото одлучува дали се пушти или не
. А кодот, можно е и да е некоја секвенца на бројки кои се калкулираат со некој калкулатор, но од страна на самиот производител (на пример, се калкулираат на обичен PC, цела серија, и само се вметнуваат во EEPROM мемориите, а во исто време, производителот има база на податоци во која е запишано кој barcode на која серија и модел кој код го користи). Во вакви ситуации, не може да се напраи калкулатор за „таа и таа“ серија или модел на радио-касетофон бидејќи не ни достапен алгоритмот по кој се пресметува кодот, тој го има само производителот, а не е вметнат во самиот радио-касетофон. А инаку, има модели и кои го калкулираат својот код врз база на серијата (barcode, дел од barcode или нешто трето), па затоа може за нив да се направи калкулатор.
На пример, има модели во кои во EEPROM меморијата (или во MCU-то, ако има EEPROM меморија самото MCU) е зачуван само barcode-от или дел од barcode-от и има и алгоритам за калкулација напишано во истиот EEPROM, така да, они само проверуваат дали со внесување на кодот преку тастатурата, ќе се добие оригиналниот barcode (или, како што спомнав, дел од него) кој е веќе ставен во меморијата. Кај овие радио касетофони, генерално земено, има три пристапи на решавање на проблемот:
1) Може да го исчитате алгоритмот од EEPROM меморијата или MCU-от, заедно со уште еден куп други податоци (значи, во принцип, ќе ви треба debuger или disassembler за тој тип на MCU, за да знаете каде во кодот да го барате она што ви треба
) и ќе треба да го reverse-увате алгоритмот, односно да видите како се пресметува кодот за отклучување на радиото врз база на barcode-от
. Алгоритмите за пресметка не се прекомплицирани (помножи го barcode-от со некоја константа, потоа одземи или додади на тој број некоја константа, направи XOR на ова со некоја друга константа или некоја претходна пресметка, земи ја првата, третата, петтата и седмата цифра од тој број и го добиваш кодот за отклучување... или нешто слично на ова
), но сепак, треба да се најдат
. Во таков случај, можете да направите калкулатор за „тој и тој“ радио-касетофон
.
2) Да го „натерате“ радиото да „мисли“ дека сте му го погодиле кодот
. Не мора да му правите reversing на алгоритмот. Програмот се „симулиура“ дека работи во некој debugger, или (уште поедоставно) гледате (преку алгоритмот) што им „прави“ алгоритмот на цифрите од кодот откако ќе се внесат
. Повторно, ова бара малку reversing, но не мора да знаете како алгоритмот работи, доволно е само да видите што им се случува на цифрите
. Ако веќе го симулирате програмот, само ќе видите кој код програмот го споредува со barcode-от и ќе ги смените вредностите на barcode-от (во самиот EEPROM) да бидат токму оние кои ги искалкулирал програмот
. На пример, внесувате 1234 на дисплејот (виртуелно е се ова, најверојатно, во самиот симулатор, ќе треба да го најдете местото во кодот во кој се впишуваат овие четири цифри и да ги внесете „мануелно“, односно, да ги внесете преку некој hex едитор во EEPROM-от), да видите што ќе искалкулира пограмата со stepping низ debugger-от, и да го смените кодот кој сте го добиле со оној со кој се споредува (бидејќи во овој случај, искалкулираниот код нема да биде ист со, на пример, barcode-от со кој се споредува), односно, да испадне на крајот дека „сте го добиле правилниот код“, односно програмот да не го бара веќе кодот
.
3) Да го преправите кодот во EEPROM-от воопшто да не бара код за отклучување
. Ова се вика patching и се прави и кај обични софтвери за PC (попознато како crack
). Значи, што всушност прави кодот (програмата во EEPROM-от, бидејќи и тоа е програма, само е наменета за друг процесор/MCU, не за Intel-ов
, и е многу поедноставна од програмите наменети за PC), во некој дел од програмот, софтверот проверува некој регистер во кој е запишано дали радиото се пушта за прв пат (бидејќи, ако снема струја, односно ако го исклучите радиото од акумулатор, тоа е за него „прв пат“, целата меморија е избришана, clock, date (ако има), па треба се да се подесува од почеток), па при иницијализација на програмата (за „прв пат“) истата проверува некаде (најверојатно прво овие податоци се исчитуваат од некој дел во dump-от, па се запишуваат во некој регистер, привремено, колку за проверка, а можно е проверката да се прави и директно со некоја мемориска адреса во dump-от) дали „е прво пуштање“. Ако радиото се пушта „за прв пат“, препрати ја програмата до дел во кој треба да се внесе кодот, па повторно врати се назад кон извршување на програмата (ова е најчеста „структура“, иако и оваа „структура“ варира од модел до модел). Пред да „рпине“ програмата до некој друг дел од кодот, се врши проверката „дали се пуштам за прв пат“ (споредба, најчесто со некоја константа) и ако оваа споредба е „точна“ (некој flag од регистрите во MCU-то/процесорот ќе ја смени својата вредност), „рипни“ (ова се изведува со асемблерски команди наменети за „тоа и тоа“ MCU) до делот од кодот на програмата во кој се бара внесување на „кодот“. Ова „рипање“ (оваа команда) едноставно може да се пополни со код за „не извршувај никакви операции“ (под Intel-овите процесори, врендоста која означува No Operation, односно NOP, е 90, односно 0x90 хексадецимално, но за различни структури, различен е и кодот
), и програмата едноставно ќе си продолжи со нејзиното извршување, односно, пуштање на радиото во употреба
. Можни се и варијации на оваа структура. На пример, програмата никаде не рипа, едноставно си извршува инструкција по инструкција при првото пуштање и „нормално“ си го извршува и делот од кодот во кој се бара „внеси код“. Во тој случај, треба да го најдете делот од кодот на прграмата во кој се врши проверка на внесениот код и истиот се споредува со некој вантершно внесен, некој пресметан според некој алгоритам или нешто слично, и да ја препратите програмата да „рипне“, од местото во кое се бара внесување на кодот, до некое место (најчесто, наредната инструкција) по кое се извршува верификацијата на кодот
. На овој начин, делот од кодот во кој се врши верификација на кодот сте го рипнале и програмата си продолжува со нејзиното извршување, односно со пуштањето на радиото во употреба
.
Знам дека се ова изгледа многу чудно... „хмммм... како може се ова да се случува... мене радиото ми се пушта веднаш, не му треба ни секунда да се пушти“. Епа, во таа една секунда (или половина, колку и да е), може да се извршат милиони инструкции, а на алгоритмот за проверка на код, да не му требаат ни неколку милисекунди за да се изврши. „Темпото“ со кое работат програмите ние не можеме да го видиме
. Но, за среќа, постојат алатки со кои можеме „да го успориме темпото“ на извршување на програмата на темпо кое нас ни одговара, за да можеме полесно да видиме „што точно се случува тука“
.