logo

 

Objectif
Protocole audio Pricehax
Protocole IR PP4
TODO
TODO
TODO
TODO

“There is absolutely no way the system can be hacked or suffer interference from any other wireless devices which are powerful and mobile today. It’s the same, secure technology that was developed specifically for heat-seeking missiles fired from fighter jets.”

 

Objectif de ces pages: Étudier le fonctionnement d'un systeme d'etiquettes electroniques dans le but de prouver qu'elles n'apportent pas plus de fiabilité que des etiquettes papier classiques (et aussi pour se marrer un coup, avouons-le).

Les informations données sur ses pages proviennent de mes recherches, qui se sont étalées par intermittence sur plusieurs mois.
Je tiens à remercier Aoi, Dr. Windaube, LightSnivy, Deadbird, BiduleOhm et Virtualabs pour leur soutien moral comme materiel ;-)

Si le nom de la firme n'est pas clairement donné ici, c'est bien pour une raison.

Arguments avancés par la firme (site, plaquettes comerciales...):

  • Communication IR bidirectionelle et sécurisée: Bidirectionelle il n'y a pas de doute. Sécurisée, absolument pas.
  • Solution ecologique, evite de jeter du papier: Je ne suis pas sur que des kilos de polycarbonate et de lithium (piles) soit plus ecologique que du papier.
  • Evite au personnel de passer du temps sur l'etiquetage, pour se consacrer au support client: Je suis pas contre !
  • Le prix affiché est le prix facturé: Tant mieux, mais était-ce un vrai probleme ? Ou un handicap qui empechait les changements subtils de prix pour orienter les clients ?

Comment la firme assure ses revenus sur le long terme grace a l'implantation de ses etiquettes:

Comme decrit plus loin, ces ESL sont basées sur un ASIC propriétaire. D'apres mes observations ils ne possedent que de la RAM, pas de flash, et cela pour deux raisons: La RAM est moins chere à produire que la flash, mais surtout et avant tout, la RAM est volatile.
C'est a dire que si l'ESL perd son alimentation, non seulement les donnees affichees s'envolent mais aussi le firmware.
En clair, quand les piles sont mortes, il n'y a aucun moyen de rescussiter l'ESL a part la renvoyer chez la firme pour qu'ils changent les piles (c'est prevu, elles sont dans une sorte de tirroir) et qu'ils reprogramment le firmware.

C'est clairement du recyclage controlé, payant, et restrictif.

 

Terminologie:

  • ESL: Electronic Shelf Label, ou EEG: Etiquette Electronique de Gondole.
  • UPC: Universal product code, le code barre des produits.
  • Code128: Le type de code utilisé pour identifier les ESL.
  • PL: Price Label, la meme chose
  • DM: DotMatrix, les nouvelles ESL a écrans graphiques.
  • PLID: Price Label IDentification, un code unique sur 32 bits identifiant une ESL.
  • Access key: Un code sur 16 bits permettant de restreindre l'acces a certaines ESL dans un magasin.
  • Store key: Un code sur 16 bits permettant de restreindre les ESL a un seul magasin.
  • TRX: Transceiver infrarouge
  • BS: Base Station
  • Page/Register: Zone mémoire d'une ESL
  • Frame: Trame infrarouge

 

Possibilités pour s'amuser:
-Mettre le firmware a jour avec des donnees random, briquer l'ESL.
-Changer l'access key, empecher le magasin de communiquer avec l'ESL.
-Si le store key est utilisé, "emprunter" une quelconque ESL du magasin et la brute-forcer à zero chez soi. L'operation prendrait en moyenne 8 heures. Une fois le store key connu, le magasin entier est a votre mercie.

L'ultime experience serait d'ecrire un firmware pour infecter une ESL et propager la mise a jour aux autres. Il faut cependant connaitre le type de processeur. Il est peut etre possible de dumper un firmware par IR, à voir...

 

Quelques informations glanées sur le net, malgré la discrétion remarquable de la firme:

 

Dans une video, on peut voir un employé de magasin lier des étiquettes a des produits. Ce qui permet au niveau informatique d'utiliser la base de donnees du magasin (et donc des caisses).

ESL

On peut le voir premièrement scanner l'UPC d'un produit a l'aide d'un terminal/scanner classique, puis le code128 de l'ESL. Quelques secondes apres, l'ESL se met a jour.
La deuxième association rate car le scanner n'arrive certainement pas a lire le code sur l'ESL, l'employé retourne celle-ci pour avoir son code imprimé a l'arriere (le meme).
La troisième association montre que l'étiquette répond à 0:27 (clignotement IR) alors que l'étiquette n'est plus visée. Cela prouve que la mise a jour n'est pas faite par le terminal, mais par le serveur du magasin par WiFi.

Au lieu d'avoir une simple liaison Terminal -> ESL, un grand detour est faite par l'infrastructure proprietaire et ressemble plutot a Terminal -> WiFi -> Logiciel de gestion -> Ethernet -> BS de la subcell -> TRX -> ESL.

ESL

 

Étude des étiquettes

Un des modèles utilisés: une "E4 HCN Freezer" (version descendant a -30°C).
Gracieusement offertes par Dr. Windaube il y a tres longtemps, merci !

ESL

Sur toutes les ESL, on peut trouver a l'arrière un code barre avec son contenu alphanumerique sur un autocollant. C'est un identifiant unique de 17 caractères et un code barre en Code128 lui correspondant. Il est constitue ainsi:

ESL

Le "4" en deuxieme position est commun a toutes les ESL. La lettre indique peut etre le type de produit ?

Pour valider un code, le serveur procede aux verifications suivantes:

  • Le "4" doit etre present
  • Manufacturing unit doit etre egal ou inferieur a 64
  • Manufacturing week doit etre egal ou inferieur a 53
  • Le serial doit etre egal ou inferieur a 65535
  • Le checksum doit etre egal a la somme des 16 precedentes valeurs ASCII modulo 10.

Donc G4591371776312423: Etiquette fabriquee par l'unite 59, dans la 37eme semaine de 2001, serial = 17763, reference produit (1)1242, checksum = 3 (ok).

Le plId correspond a MMYWWSSSSS, soit le Manufacturing unit, l'annee et la semaine de fabrication, et le serial. La formule suivante est utilisee:
plId = long(MMYWW)<<16 + SSSSS = 0xE7014563 dans l'exemple.

Derrière cet autocollant on trouve deux trous dans la coque de l'ESL donnant sur des pastilles du PCB. L'une va au plan de masse, l'autre à l'ASIC. Des impacts de pointes sont visibles, indiquant que c'est probablement via cette interface que les étiquettes sont baptisées en usine.

Note: Je pensais que ca pouvait éventuellement être une PROM ou une EEPROM 1-wire, mais c'en est pas. Ni quoi que ce soit de connu en 1-wire, d'ailleurs. C'est vérifié.

ESL

Quand on veut remplacer du papier par un appareil électronique et qu'on veut réduire leur prix au minimum, on doit se contenter de pas grand chose:

ESL

"PLL band transmitter" dans la doc commerciale: Certainement quelqu'un qui ne savait pas trop ce qu'etait une PLL.
Merci pour l'information en tout cas !

Le quartz est taillé a 32768Hz, et sert dès la mise sous tension de l'étiquette (environ >2.2V).
A droite on trouve la photodiode wire-bondée directement sur la carte (D1) et la LED infrarouge de réponse D2, ainsi que son condensateur tantale C4.
Un élévateur de tension génère du 6V sur TP9. Un procédé nomme "precharge" géré par l'infrastructure permet a l'étiquette de recharger ce condensateur entre plusieurs réponses (allant jusqu'a 2 secondes).
TP13: Tension piles (3V).
TP18: Masse.
A noter: 4 fins de pistes sans vernis sont visibles à gauche de R2, possiblement du JTAG ou une interface de programmation ou de debug propriétaire.

Le protocole de communication le plus répendu chez la firme est nomme "PP4C" et correspond a une modulation par position d'impulsion a 4 symboles (4PPM), pouvant ainsi coder 2 bits par symbole.

Les bursts a 20/16 = 1.25MHz, durent 24 periodes soit 19.2µs.

Durées des symboles:
00 (0) = 62 periodes = 49.6µs
01 (1) = 177 periodes = 141.6µs
10 (2) = 100 periodes = 80µs
11 (3) = 138 periodes = 110.4µs

A noter que comparé a l'IRDA, non seulement la frequence porteuse et les durees des symboles ne sont pas les memes, mais ils ont en plus complique les choses en inversant le 1 et le 2.

Les bitrates seraient de 10kbps pour le protocole PP4C et 38kbps pour PP16C. Mes étiquettes utilisent PP4C car peu de données sont affichables.

Transmission TRX > Label: IR 880nm

ESL
(La taille des bursts n'est pas a l'échelle)

PLAdvancedConfig.prop dit que la longueur par défaut d'un message PP4C est de 20 bytes.

 

Étude du firmware du TRX, avant de recevoir le TRX:

J'avais a disposition une mise a jour au format Intel hex, convertie de suite en .bin.

Une première analyse visuelle montre que les opcodes sont sur 16 bits, et que celles-ci ne correspondent pas a des instructions Microchip (MSB parfois supérieur a 0x20), ni Atmel.

Une analyse statistique révèle qu'un des mots les plus récurrents est 0x5470 qui, après une rapide recherche Google, s'avère être l'opcode RTS des processeurs H8 (Hitachi, maintenant Renesas).

Une tentative de désassemblage dans IDA génère en effet du code sensé:

ESL

 

Notes:

The authorization code in this embodiment is a 16-bit word.
Brevet EP2309378

The protocol field 41 therefore primarily serves as a "wake-up" field for each label.

 

Etude du logiciel serveur:

Le "arrayOfInt" contient des valeurs ressemblant a celles des durees pour les symboles PP4C.
De plus, les lignes suivantes decomposent "paramByte" en 4 groupes de 2 bits, MSB en premier (i,j,k,m) et ajoute les durees pour chaque.
Note: si on divise les valeurs par 30.5, on obtient: 3.3, 9.3, 5.3 et 7.3. Pas de valeurs entieres, et surtout pas le nombre de cycles trouves plus haut. Il semblerait donc que la duree des bursts n'est pas comprise dans la duree specifiee dans le profil de la basestation !

Si par exemple on veut tomber a 3 au lieu de 3.3 pour la valeur 101, on tombe sur 101/3 = 33.67µs. Ce qui voudrait dire que les bursts durent 33.67-30.5 = 3.15µs. Avec 24 cycles on arrive a une porteuse de 7.62 MHz, ce qui parait un peu trop eleve.
Si plutot on veut tomber a 2 au lieu de 3.3, comme le nombre de cycles trouve pour le symbole PP4C "00" dans l'analyse ci-dessus, on tombe sur 101/2 = 50.5µs. Ce qui voudrait dire que les bursts durent 50.5-30.5 = 20µs. Avec 24 cycles on arrive a une porteuse de... 1.25MHz, pas loin du tout des 1.245MHz vaguement specifies dans la doc !

On sait donc que les cycles correspondants ne sont pas 3,9,5,7 mais 2,5,3,4

60=0x3C soit la commande utilisee dans WakeUpFrames.xml pour reveiller les E4 HCN Freezer (selon WakeUpSchemes).
La frame serait donc constituee de 60,boolean1=128/0=0,paramByte,1=128/0=0,longtoaob(paramlong),aob de 2 bytes a 0 ?,null

longtoaob(long paramLong) retourne un arrayOfByte de 4 bytes, avec paramLong dedans 0=LSB 3=MSB

Longueur wakeup frame: 1,1,1,1,4,2,0 = 10 (byte,byte,byte,byte,aob,aob,null)

Checksum function (CRC16 avec une valeur de depart a 33800):

crc = 33800
Pour chaque byte de aob: crc = table[(crc ^ aob[i]) & 0xFF] ^ (crc >> 8);

On peut mettre a jour le firmware des etiquettes via IR (verifier sa version, et -peut etre- le lire ?)

 

 

Etude du TRX:

WO0209322

RS485 et 48V en entree. Oscillateur 20MHz.

H8/3687 et CPLD Lattice 4064V

Reception IR par SA636, generation d'IF 10.7MHz par AD9833 sinus filtré LC. Discrimination a 455MHz (10.7-0.455 = 1.245MHz !).
La porteuse de reponse est a 1.245MHz. Peut etre d'emission aussi ?

Filtre ceramique, logo Murata marquage XH:

ESL

CPLD clock a 20MHz, aussi une entree a 10MHz. Porteuses d'emission possibles:

20 (1), 10 (2), 6.66 (3), 5 (4), 4 (5, la plus probable), 3.33 (6), 2.86 (7), 2.5 (8), 2.22 (9), 1.81 (10), 1.66 (11), 1.53 (12), 1.43, 1.33, 1.25, 1.17

On trouve une connexion UART 38400bps sur le µC, qui semble etre unidirectionelle:

***** TRX INIT *****
Firmware:
Compile date: Feb  4 2007
Compile time: 20:39:15
PON Counter:0001
TCSRWD:AA
WOKE UP FROM POWER ON
WATCHDOG INITIATION STARTED!
WATCHDOG INITIATION COMPLETED!
irrxSetup:
 Intg. Time:02E1
 Noise Time:02C2
 PreFB Time:0DD8
 RIM Time  :1F95
CABLE: TxError
CABLE: RxError
CABLE: 48V Error
FELIF: Closed (HW error)
Hello: 0000632F
Hello: 0000C651
Hello: 00012BCD

L'µC detecte la presence du 48V avec un pont diviseur directement sur l'alimentation (avant la diode): 100k et 4.7k, donnant 2.15V sur une broche ADC. En ajoutant 100k en parallele sur la resistance 100k deja presente (=50k), et en alimentant en 30V seulement, l'erreur disparait.

TxError et RxError semblent etre liees a une mesure electrique, et pas un echange de donnees (rien sur la liaison RS485 au demarrage).
FELIF closed ? J'espere que c'est lie a l'absence de 48V...

ESL

Corrections aux suppositions sur le PP4C grace a la doc trouvée par Biduleohm:

Les bursts ne font pas 30.5 µs mais 41µs.

ESL

TODO:

Github
EN/FR

 

FARSight - Furrtek AntiRetro System
Balises KVB
Bourricot
Etiquettes electroniques de gondole
EPAR/ECPR
Sortie télévision pour VirtualBoy
Tickets de métro RATP
Super NeoGeo Pocket
Super DevBoy
Dictée Magique
Firmware alternatif pour emetteur radio FM
GameBoy Printer
Datel Smartcom
µTVBG
Metarikku
Monnaie iButton
Patator
Pièges Megazone
Lunettes 3D XPanD
Projecteur IR
Dolly Lego

footer
symbol symbol symbol symbol symbol