Reverse engineering AH Soundbox

De AH heeft een nieuwe set ‘spaar alle plaatjes door heel veel boodschappen te doen’ dierenplaatjes. De gimmick dit keer: op elk plaatje zit een soort barcode die je met deze soundbox kunt scannen. Je krijgt dan in de eerste modus het dierengeluid, en in de tweede modus van elke kaart 5 quizvragen. Supertof natuurlijk, dus ik heb er alvast eentje gekocht om te slopen en m’n eigen set geluiden/vragen in te bouwen.

Helaas zit het kistje goed verlijmd dus die is wel total loss. Ik zal bij een volgende hackpoging proberen of het hotglue is die met alcohol los kan weken. Links zie je meteen een ‘barcode’, de scanner en het enkelzijdig PCB. USB-C poortje netjes met de 5.1k weerstanden, helaas power-only.

De chips zijn moeilijk af te lezen zonder microscoop maar dat komt op de space wel een keertje.

De barcode is simpel. Een smalle streep is een 0, een dikke is 1. Eerst drie nulstrepen, dan het kaartnummer in 7 bits, dan twee bits die ik nog niet snap, en dan nog een 1 om het af te sluiten.

@Juerd> Het is de xor van de voorgaande 10 bits, gevolgd door de inverse daarvan

0001010100101 zoals op de foto trek je dus uit elkaar naar
000-1010100-10-1 en dat codeert naar kaartje 84, de Axolotl.

68 - 0001000100011
69 - 0001000101101
84 - 0001010100101
90 - 0001011010011
91 - 0001011011101
93 - 0001011101101

6 Likes

Zojuist ook een Soundbox gekocht en ook barbaars opengebroken zoals het exemplaar van Bas, misschien print ik er een vervangde behuizing voor met de bambu.

Zojuist de chips onder goed licht bekeken en zag het volgende staan. De chip met de SOIC-8 package betreft een T25S128. Op de andere chip lees ik het volgende: SZY55F2 met er onder JXBP24159. Jammer genoeg vind ik voor deze op google niks terug. Ik vermoed dat het een generieke microcontroller + opamp is. Ik wil nu een poging gaan wagen tot het dumpen van de flash chip, hoop dat mijn soldeerkunsten dat aankunnen :wink:

Tot zover zijn dat mijn vindingen.

3 Likes
for 68, 69, 84, 90, 91, 93, 42 { my $x = [+^] .base(2).comb; my $c = sprintf 
"000%07b%b%b1", $_, $x, !$x; put "$_ = $c"; $c ~~ s:g/0/█▔▔/; $c ~~ s:g/1/██▔/; put $c }

68 = 0001000100011
█▔▔█▔▔█▔▔██▔█▔▔█▔▔█▔▔██▔█▔▔█▔▔█▔▔██▔██▔
69 = 0001000101101
█▔▔█▔▔█▔▔██▔█▔▔█▔▔█▔▔██▔█▔▔██▔██▔█▔▔██▔
84 = 0001010100101
█▔▔█▔▔█▔▔██▔█▔▔██▔█▔▔██▔█▔▔█▔▔██▔█▔▔██▔
90 = 0001011010011
█▔▔█▔▔█▔▔██▔█▔▔██▔██▔█▔▔██▔█▔▔█▔▔██▔██▔
91 = 0001011011101
█▔▔█▔▔█▔▔██▔█▔▔██▔██▔█▔▔██▔██▔██▔█▔▔██▔
93 = 0001011101101
█▔▔█▔▔█▔▔██▔█▔▔██▔██▔██▔█▔▔██▔██▔█▔▔██▔
42 = 0000101010101
█▔▔█▔▔█▔▔█▔▔██▔█▔▔██▔█▔▔██▔█▔▔██▔█▔▔██▔
3 Likes

Ik heb ook maar een AH bezocht in hun laatste kwartier openingstijd en zo’n doosje gehaald.

De code van @Juerd een beetje herschreven en in een documentje geplakt om ze makkelijk allemaal te printen: gist

Barcodes 1 t/m 96 doen het. 0 en 97 niet. Dat aantal klopt ook met de omschrijving.

Elke barcode geeft je 1 dierengeluid, en (willekeurig) 1 van 5 quizvragen inclusief antwoorden. De dierengeluiden zijn zo’n 8 seconden per stuk. De quizvragen zijn langer. Tussen vraag en antwoord zit een geluid van een tikkende klok. Ik neem aan dat ze die slim gededupliceerd hebben dus die tel ik niet mee. Zonder dat zijn de quizvragen zo’n 14 seconden lang. Er is wat variatie maar ik denk dat dat wel ongeveer het gemiddelde kan zijn. In totaal is dat dus (96*8 + 480*14) zo’n 7400 seconden (~2 uur) aan audio.

@BlackDragon had al gevonden dan de flash chip een T25S128 is, dat is 128 Mbit aan storage. Als we die cijfers door elkaar delen, dan kom ik uit op een bitrate van zo’n 18 kbit/s. Het geluid is uiteraard mono en een lage sample rate (ik vermoed 8000 Hz) en bit depth (ik gok 8 bits per sample) maar er zal alsnog iets van lossy compressie bovenop zitten. Zou best wel MP3 kunnen zijn maar misschien ook wel AMR of Speex oid.

2 Likes

wat leuk dit!

misschien morgen ook maar eentje halen…

2 Likes

ik denk dat die tikkende klok helemaal niet zo slim is hoor, dat impliceert best wat programmeerwerk, terwijl de opslag gratis is. Maar we merken het wel als we de dump hebben.

Ik denk dat die tikkende klok wel een hergebruikte sample moet zijn om dit in die flash te kunnen proppen.

Het getik is zo’n 7 seconden lang per vraag. Er zijn 480 vragen. Dat is ruim 3000 seconden (bijna een uur) aan extra audio. De vereiste bitrate zou dan van 18 naar 12 kbit/s moeten zakken. Opzich kan dat met Speex of AMR-NB, maar het is echt veel eenvoudiger om drie losse audiofragmentjes achter elkaar af te spelen.

hier wat high-level pseudocode

while wait_for_barcode();
  n = read_barcode();
  if (mode is freek)
    r = choose(1,5);
    play('quiz-$n-$r-vraag');
    play('getik.wav');
    play('quiz-$n-$r-antwoord');
  else if (mode is diergeluid)
    play('diergeluid-$n');

Je zou het zelfs korter kunnen maken. TomTom knipt de volledige lijst aan berichten op. Bijvoorbeeld “Na” “100 meter” “sla linksaf”.

Ik weet niet wat de vragen en antwoorden zijn, maar als ze een patroon volgen (“Wat eet een …”) dan kun je daar goed mee knippen of antwoorden herhalen. Ik weet ook niet of de klok zo’n riedeltje is of een tik/tak geval, want in het laatste geval zou je een timer kunnen gebruiken om de “stille” momenten niet op te hoeven slaan.

De klok is idd een eenvoudig tik/tak geval. Dus dat zou ook nog wel eens realtime gegenereerd kunnen zijn. De vragen zijn denk ik wel gevarieerd genoeg dat dat geen losse segmentjes zijn, maar dat weten we nog niet zeker.

Ik heb gisteravond een opname gemaakt om me te helpen met de eerdere analyse. Laat ik die gewoon eens delen zodat de rest kan meeluisteren :slight_smile:

File:AH-dierengeluiden-testrecording.ogg - RevSpace (het forum slikt geen audio maar de wiki wel)

De volgende stap is uiteraard een romdump.

1 Like

image

3 Likes

yoda_patience

1 Like

Dump van de 128 Mbit SOIC8, gemaakt met een Glasgow: https://up.shiz.me/f/Q867EL44/ah.bin

Bevat een simpel filesysteem zo te zien, hier is een simpele parser en extractor: #NTM5NDZkZm [python3] - mlg elite paste (heeft sx nodig, pip install --user git+https://weeaboo.software/shiz/sx#egg=sx), en de resulterende files: https://up.shiz.me/f/Lj6fLUhg/ah.tar.gz

5 Likes

Juerd’s Kagi’en naar f1a/f1c leverde dit op: Reddit - Dive into anything, wat ons naar een SDK bracht die wellicht een decoder heeft: GitHub - Jieli-Tech/fw-AD15N: About Firmware for Generic MCU SDK(AD15N series), Support AD15N

Edit: et voilá: fw-AD15N/sdk/app/bsp/common/decoder/decoder_api.c at main · Jieli-Tech/fw-AD15N · GitHub

Edit 2: decoder-implementatie voor het target, LLVM bitcode: https://github.com/Jieli-Tech/fw-AD15N/raw/main/sdk/include_lib/liba/ARCH/pi32_lto/lib_f1a_decode.a

1 Like

7 Likes

You kids and your tick-tock tick-tock tick-tock memes.

Heeft iemand de skills om de hele set geluidjes te converteren naar iets wat ik gewoon af kan spelen?

Daarnaast: Hoe moeilijk is het om nu zelf geluidjes hier in te knikkeren?

Use them for good, not for evil: https://up.shiz.me/f/ah-dierkaartjes.tar.gz

Als de encoder die ik heb gevonden werkt, is het vermoedelijk ongeveer een uurtje werk om er zelf stuff in terug te splicen.

6 Likes


Ik heb geprobeerd zelf een kaartje dat ik nog niet heb (nr. 18) na te maken. Was zo gebeurd in Inkscape.
De brede strepen zijn 3 mm, de smalle 1,5 mm breed. In totaal neemt elke bit 3x1,5=4 mm in beslag.
Maar op de een of andere manier wordt mijn kaartje niet gedetecteerd.
Ik dacht eerst dat het er aan lag dat de toner van mijn printer bijna op was en dat de strepen niet zwart genoeg waren, dus heb ik ze met een potlood donkerder gemaakt. Werkte ook niet.
Het is toch gewoon een lichtsensor wat er in zit, of niet?

1 Like

Het werkt met een reflectiesensor, dus wellicht dat het grafiet van het potlood nog te veel reflecteert.

Je strepen lijken wel te kloppen, incl. xor.