Po Vánocích se na jednom hardwarovém fóru objevil dotaz, jak vlastně Albi tužka funguje. Jeden z prvních odkazů vedl sem, na článek Táty Geeka „Jak funguje Albi tužka“. Text rozebírá, co tužka obsahuje uvnitř, jakým způsobem jsou konstruované kódy a odkaz na německý projekt TipToiReveng, který rozebírá podobný, ale dostatečně jiný systém pera a knih. V české kotlině se nic nevyskytovalo, a nebylo zřejmé, jak hluboké úpravy německého projektu by byly potřeba, kdyby člověk chtěl vyrobit vlastní BNL soubor nebo úplně celou knihu.
Proč?
Přece proto! Jak je u šťourů obvyklé, tohle je dostatečný důvod k vrtání se v něčem zajímavém. Ačkoli v navazujících debatách bylo zřejmé, že německá a česká tužka používá jiné soubory, a tudíž nelze jejich nástroje přímo využít, naivně jsem usoudil, že bude třeba pár drobných úprav a bude to. Stephen King by teď napsal něco takového jako „a to bylo naposledy, kdy ho někdo spatřil živého“. Naštěstí, i když to nešlo zcela hladce, až tak daleko to nezašlo.
Hacking a cracking
Rozbít cizí formát, bývá různě složité a někdy prakticky nemožné. Stačí, aby někde byla použita asymetrická šifra a už se bez crackování vlastního firmware tužky nelze dostat dále. Proto před tím, než jsem se do něčeho pustil, jsem provedl důkladný průzkum terénu.
Existují ještě jiné BNL soubory?
Stáhl jsem si několik souborů BNL od Albi, ze kterých bylo na první pohled zřejmé, že neodpovídají německému TipToi. Proto jsem použil silné google-fu, abych pohledal jiné BNL soubory v cizině. A už tady jsem narazil. Systémů pro tyto pera je vícero, prakticky všechny jsou vyrobeny v Číně a Albi u nás dává dohromady český obsah – není to původní výrobek. V cizině je souborových formátů pro tato pera více. Například zmiňovaný německý GME, nalezl jsem AOG, pro německé pero Ting je ještě jiný formát apod.
Existuje nějaká jiná verze formátu BNL, například zde, zde, zde nebo zde. Ta se nám ale nehodí.
Albi vydává knihy na 7 trzích: CZ, SK, PL, RO, HU, SI a HR. Co se týče kompatibilních ne-Albi BNL souborů, našel jsem soubory ke stažení jen tady.
Firmware Albi tužky
Dál jsem si řekl, že se podívám na firmware. Z českých stránek zmizelo, na slovenských je, ale temné a špinavé hlubiny uloz.to vydaly dvě různé verze pro obě verze hardware, jak pro čipy Sonix SNP70032, tak pro SN95300FG. Další pak vytáhl Táta Geek z Archive.org.
Z popisu čipů plyne, že používají nějaké vlastní 16bitové DSP jádro zvané S9KE, pro které jsem nenalezl žádné nástroje – kromě tohoto experimentálního. Bohužel, zatím jsem nebyl úspěšný ve zjištění, co přesně firmware dělá – ačkoli je zřejmé, jak se natahuje do paměti a odkud startuje, vlastní chip obsahuje i 64KW ROM s kódem na obsluhu periferií. Sice existuje dokumentace, které funkce ROM obsahuje, i jaké jsou parametry, nejsou k dispozici hlavičkové soubory, které by dokázaly „spojit“ jednotlivé adresy ROM se jmény těch funkcí. Z analýzy je zřejmé, že jsou i mnohé nedokumentované runtime funkce pro vlastní běh programu. Takže jsem sice byl schopen rozluštit nějaké názvy uložených písní, rozřezat většinu firmware na mp3 soubory, ale nikam dál jsem nepokročil. Další podrobnosti jsou v dokumentaci firmware. Tento popis přikládám jako samostatný dokument pro zvídavé.
Když to nešlo přes firmware v tužce, pustil jsem se do analýzy samotných souborů. Ze začátku jsem zkoumal jen stažené soubory, později jsem přidal i zkoušení upravených BNL souborů ve vypůjčené tužce.
Zjištění z analýzy BNL souborů
Tato zjištění zde budu publikovat postupně. Na základě analýzy jsem vytvořil popis formátu a napsal jednoduchý skript, který umí rozkrájet BNL soubor na prvočinitele. Ten jsem potřeboval vyzkoušet. Stáhl jsem tedy všechny BNL soubory a prohnal je tímto skriptem. V současné době se už mému popisu nevzpírají žádné soubory BNL, i když řada hodnot má neznámý význam a nedá se vyloučit, že systém toho zvládá více, než Albi používá.
Generátor BNL souborů
Na základě výstupu „disassembleru“ jsem napsal jednoduchý generátor. Ten ze vstupních souborů seskládá zpět BNL soubor, který lze nahrát do tužky.
Generátor OID kódů a jejich tisk
Při pokusu o tisk OID kódů pomocí nástrojů od TipToiReveng jsem zjistil dvě mrzutosti. Kontrolní součet v deváté tečce neodpovídá německému systému TipToi, ale systému Ting (horní bit je invertovaný). A pak jsem při „měření“ výtisků a scanů zjistil, že Albi kódy jsou větší. Německý kód má 1 mm včetně mezer, český 1,35 mm.
Generátor jsem upravil, ale s tiskem jsou potíže. Rozhodně to moje inkoustovka nedává vůbec, i když papírově má rozlišení podstatně vyšší, než požadovaných 1200dpi. Body jsou chlupaté a každý jinak velký.
Ani laserovka v místním copycentru ty tečky nevytiskla vůbec. Obsluha bohužel neovládala pokročilá nastavení, takže ani více pokusů nedokázalo body vytisknout. Tím myslím, že se jednalo o zásah ovladače, který úplně tečky vypustil z tisku. Nevylučuji tím možnost, že je někde v ovladači nastavení, přes které by tisk prošel. Bylo ale ověřeno na černobílé laserovce Samsung M2070, že generátor kódů funguje a tužka výtisky přečte.
Závěr a nedořešené otázky
Závěr je tedy mírně optimistický. Soubory lze rozkrájet, lze je zpátky složit, zvukové soubory jde nahradit a měla by jít tisknout vlastní kniha.
Nějaké nedořešené body ještě zbývají:
- Německý systém, ač starší, vypadá, že obsahuje nějakou inteligenci. Je systém použitý v české tužce hloupý nebo Albi jen nevyužívá všechny jeho schopnosti, z důvodů obchodních či licenčních? Nebo mají firmware, který nic chytřejšího neumí (ale mohl by)?
- Soubory s firmware mám k dispozici – obsahují stejné copyrighty firmy Chomptech, jako německé tužky. Většina firmware jsou jen MP3 soubory, většina z nich jsou neznámé čínské zvuky (neznámé pro mě, ale kdybyste měli čínské kamarády…), zbytek české systémové zvuky. Jak jsem psal výše, analýza kódu selhává na nedostupnosti informací o kódu v ROM – ten potřebuji, abych ověřil, že funkčnost, kterou používá Albi ve svých knihách, je jediná možná.
- Ve firmware jsou české zvuky pro kalkulačku – jak se tato funkčnost z pera vyloudí?
- Také jsou tam odkazy na souborové přípony TN2 a BMD. Ví někdo, co to je?
- MP3 soubory jsou zašifrované, sice jsem to obešel, ale opravdu by mě zajímalo, jak je konstruován dekodér těch MP3 souborů, který jsem nahradil 512 bajtovou dešifrovací tabulkou. Když jsem se pokusil zaměnit šifrovací klíče při generování souborů, zjistil jsem, že to nelze. Po sérií pokusů bylo zjištěno, že musí platit jediná podmínka – bajt ze 4. bajtu hlavičky a bajt ze 0x140. bajtu hlavičky musí dát součet 0xF5. Nemám nejmenší ponětí proč. Tím pádem lze vygenerovat zcela nezašifrovaný soubor. Při dalších pokusech se ukázalo, že to není úplně pravda – v nezašifrovaném souboru funguje vše, kromě kvízů – na jejich rozpohybování je třeba aspoň jeden bit zašifrovat.
Související články
- Jak funguje Albi tužka
- Jak fungují BNL soubory pro Albi tužku (právě čtete)
- Základy zpětného inženýrství
- Hacking a cracking BNL souborů pro Albi tužku – 1. část
- Hacking a cracking BNL souborů pro Albi tužku – 2. část
- Jak vytvořit vlastní knížku pro Albi tužku
Strojový a lehce upravený překlad tabulky textu v první části firmware (v souboru „albituzka_firmware.pdf“):
0 Tanec č. 11 – Chopin
1 Píseň jara
2 Šepoty podzimu
3 Sněhová vločka Drift
4 Klavírní sonáta (Passion)
5 Klavírní sonáta č. 4
6 Lisztova serenáda
7 Lodní píseň – Čajkovskij
8 Kus na rozloučenou
9 Variace na malou hvězdu
10 Maďarský tanec č. 5
11 Sonáta měsíčního svitu
12 Dítě jde spát
13 Dream of Love (klavírní verze)
14 Balada pro štěňata – Chopin
15 Pochod G dur – Schubert
16 Preludium Dešťová kapka dur D
17 Klavírní sonáta č. 15
18 Klavírní koncert č. 1
19 Improvizační fantazie
20 Kánon D dur
21 Na památku lásky – Richard Clayderman
22 Impromptu
23 Toccata – Bach
24 Symfonie zděšení
25 Šavlový tanec
26 Dívčí modlitba
27 Rondo pro housle dur
28 Suita F dur pro vodní hudbu
29 Klavírní koncert č. 1
30 Předehra Carmen – Bizet
31 Meditace
32 Květinová balada
33 Hudební večerní tanec
34 Bell Tune
35 Klavírní sonáta č. 4
36 Koncert pro mandolínu
37 Symfonie č. 40, kapitola 1
38 Recitál pro dívku z Aletownu
39 Variace na pstruha
40 Zpěvný pochod
41 Usměvavá polka
42 Valčík č. 2
43 Koncert č. 2 pro příčnou flétnu
44 Kozácký lidový tanec
45 Mozartova serenáda
46 Adagio E dur pro housle
47 Symfonie č. 9 e moll
48 Serenáda D dur
49 Love Song
50 Aleluja
51 Koncert A dur pro jeden jazýček
52 Suita č. 2
53 Symfonie č. 1 – Čakovskij
54 Gavotta
55 Předehra
56 Klarinetový koncert
57 Tanec kuřat
58 Balada pro štěňata – Chopin
59 Symfonie č. 101
60 Symfonie v polích
61 Čínský tanec
62 Pochod Ges dur – Schubert
63 Destiny
64 Preludium dešťových kapek ve velkém D
65 Maďarský tanec z Labutího baletu
66 Klavírní koncert č. 20
67 Klavírní sonáta č. 15
68 Braniborský koncert G dur
69 Houslový koncert č. 5 – Mozart
70 Adriana u vody
71 Tanec malé labutě – Čajkovskij
72 Vzpomínky na dětství
73 Turecký pochod
74 Óda na Pannu Marii
75 Chopinova serenáda
76 Romantika 6
77 Sen o lásce
78 Dudilova serenáda
79 Eine Kleine Nachtmusik – Haydn
80 Impromptu Fantasia
81 Andělská serenáda
82 Humor
83 Moonlight (remixovaná verze)
84 Pièce de résistance – Pièce de résistance
85 Serenáda pro smyčce Kapitola 1
86 Toselliho serenáda
87 Serenáda pro smyčce G dur
88 Serenáda pro smyčce Kapitola 4 5
89 Memorial
90 Sonáta měsíčního svitu
91 Chvála Boha přírody
92 Ukolébavka – Mozart
93 Koncert lásky
94 Jaro
95 Fantasia
96 Když mne stará matka zpívat učívala
97 Menuet G dur
98 Jaro čtvrté třídy 1. část
99 Španělská serenáda – Bizet
100 Serenáda pro smyčce ve druhé větě
101 Brahmsova serenáda
102 Scény z dětství
103 Dítě usíná
104 Menuet
105 Měsíční svit – Debussy
106 Pro Alici
107 Radost z lásky
108 Krásná flétna
109 Šepoty podzimu
110 Dérigueurova serenáda
111 Óda na radost
112 Labutí jezero
113 Modrá láska
114 Modrý Dunaj
115 Šípková Růženka
Dík, dokument jsem zaktualizoval – těch názvů je tam okolo 3500, ale jsem si téměř jist, že firmware ony skladby neobsahuje. Podle krátké analýzy to vypadá, že OIDy 54001-57674 by mohly ty písně nějak vyvolávat, ale pravděpodobně si pro ně pero sáhne na nějaký soubor s pětimístným číslem a příponou .tn2. Nic jsem k tomu nikde nenašel, ani ty soubory.
Pár detailů k OID kódům:
– nejstarší varianta OID_Code_V1.0 se už pravděpodobně nikde v nových zařízeních nepoužívá (rozteč ~0,5 mm x ~0.42 mm, maximální rozsah kódů 0 – 4096). Dekodér SN9P700.
– zmiňovaný „německý“ je nejspíš varianta OID_Code_V1.5 (rozteč 1 mm, maximální rozsah kódů 0 – 15000). Datové soubory jsou většinou s příponou GME. Paradoxně to není upgrade, ale jde o downgrade typu V2.0, low-cost dekodér SN9P601xx uveden někdy kolem roku 2008.
– Albi používá verzi OID_Code_V2.0 (rozteč dle datasheetu 1.3 mm, maximální rozsah kódů 0 – 65535, lze rozšířit až na 262144). Datové soubory jsou s příponou BNL. Dekodér SN9P701x uveden kolem roku 2006, novější (low-cost) typ SN9P620xx pak kolem 2010 (náhrada bez potřeby změny zapojení plošného spoje).
– existuje i verze OID_Code_V3.0, přesnější detaily neznám, ale datové soubory s příponou AOG by měly být k nim.
Jelikož je u starší verze Albi tužky použit dekodér SN9P700, tak předpokládám, že do ní nejdou nahrát novější knížky používající OID_V2.0. Pokud ano, tak je pravděpodobně dekódovací program v té již „neveřejné“ aktualizaci firmware.
Albi používá jistě konzistentně OID 2.0. Použité čipy jsou SNP70032 a SN95302, tj. nejsou to samostatné dekodéry, ale SoC. Ve firmware není nikde žádná konverzní tabulka OID kódů, ty získává SoC už přímo z dekodéru.
Upozornění: Zde je pojem firmware zamlžen – firmware je to, co dodává Albi jako vlastní „program pro tužku“. V čipech samotných je zabudováno 64KB ROM s kódem, tento není veřejně dokumentovaný, ani nikde přístupný (dle mojich zjištění)