Hacking the $49 Wifi Finder

                             ==Phrack Inc.==

               Volume 0x0c, Issue 0x41, Phile #0x0b of 0x0f

|=-------------------=[ Hacking the $49 Wifi Finder ]=-------------------=|
|=-----------------------------------------------------------------------=|
|=-------------------------=[ by openschemes ]=--------------------------=|
|=-----------------------------------------------------------------------=|
|=--------------=[ traduit par TboWan pour arsouyes.org ]=---------------=|

--[ Contents

1.0 - Introduction
2.0 - Survol du périphérique
3.0 - Ouverture du périphérique
4.0 - L'intérieur et les recherches
5.0 - Accéder au chargeur d'ISP
6.0 - Possibilités du chargeur d'ISP
7.0 - Possibilités du booloader logiciel
8.0 - Insérer votre propre code
9.0 - Conclusion
A.0 - Références
B.0 - Note du traducteur

--[ 1.0 - Introduction

  Noël est passé, et pendant ces semaines de froid, nous nous sommes déjà
  lassé des jouets que le Père Noël nous a laissé sous le sapin. Nous n'avons
  plus qu'une solution, les hacker ! Ce papier décrit notre attaque réussie
  sur un wifi finder [NDT : matériel pour trouver des réseaux wifi], et vous
  fournira la capacité d'utiliser ce périphérique d'une nouvelle manière
  intéressante. Vous n'êtes limités que par votre créativité !

  Toute attaque réussie doit commencé par la mise à plat d'un but clair. En
  pensant de manière déterminée et créative, vous verrez les étapes nécessaire
  pour atteindre le but. Juste dire "j'aimerais hacker ce périphérique" est
  sans intérêt sans contexte, et vous donner un but inateignable ne fera
  que vous enliser dans une étape intermédiaire et vous fera probablement
  abandonner le projet. Nous vous recommandons donc de commencer chaque hack en
  vous donnant de petites étapes, et à chaque étape terminée, vous ouvrirez de
  nouvelles portes et de nouveaux chemins d'investigation et de développement.

  Dans le cas du wifi finder, notre pénultième [NDT : avant-dernier] but
  était d'exécuter notre propre code dans son micro-contrôleur interne. Nous
  avons atteint ce but et nous allons vous décrire les étapes que nous avons
  effectuées pour l'atteindre. Il est facile de voir qu'en atteignant ce but,
  nous avons ouvert plein de nouveaux chemin pour étendre les possibilités de
  ce périphérique. Certaines sont faciles, comme permettre au périphérique
  de chercher des SSID cachés et de parcourir les canaux wifi non autorisés
  aux USA. D'autres sont imposantes, comme le développement d'un périphérique
  d'"aircracking" portable. Certains de ces sujets seront couverts dans le
  futur, mais nous vous encourageons à vous poser avec le périphérique et
  les connaissances que vous en avez, et de planifier votre propre chemin.

  Nous nous excusons si vous trouvez ce texte long, comme une description
  qui divague de noter attaque, mais nous pensons que c'est la MÉTHODE,
  et non le résultat qui est le vrai hack. Donnez un hack à un homme,
  et il pourra programmer son wifi-finder. Apprenez à un homme à hacker,
  et il pourra programmer n'importe quoi ...

  Les outils utilisés dans cette attaque sont les suivants :
- De côté matériel, nous avons utilisé un convertisseur USB vers RS232 modifié
pour communiquer avec le port série sur le wifi-finder. Un alternative à
cette solution serait de construire notre propre convertisseur RS232 3.3V en
utilisant le MAX3232 IC. Des schémas pour tout ceci sont disponibles plus loin.

- Du côté des logiciels, nous avons utilisé une combinaison de désassembleur
IDA [1] et d'assembleur A51 de Keil [2]. Cet assembleur peut être utilisé
en ligne de commande ou dans l'IDE µVision de Keil.

  Les étapes principales du projets sont les suivantes :

A) Ouvrir et identifier le périphérique et ses possibilités
B) Chercher après une backdoor dans le périphérique
C) Construire une interface pour communiquer avec le périphérique
D) Faire des recherches sur les opérations internes du périphérique
E) Étendre et modifier les opérations du périphérique

  c'est juste un bref survol du schéma de haut niveau, et comme vous allez
  vite vous en rendre compte, ça demande un peu de hacking bas niveau pour
  effectuer les étapes les unes après les autres. Nous espérons que vous
  trouverez ce texte instructif pendant que nous raconterons l'attaque de
  ce petit périphérique intéressant.



--[ 2.0 - Survol du périphérique

  Actuellement, il y a peu de gammes de wifi-finder sur le marché. Certains
  périphériques peu coûteux ne font que détecter les variations des
  micro-ondes. Ils détecterons le 802.11 mais aussi certains téléphones sans
  fils, les bébéphones, ou l'inclassable maman qui réchauffe sa soupe au four
  à micro-ondes dans la rue. Ce ne sont que du n'importe quoi, ça consiste
  simplement en un amplificateur et un filtre de bande. La gamme suivante peut
  détecter les accès points, mais ne donne aucune information que les quelques
  led qui vous disent si c'est loin ou proche. C'est aussi n'importe quoi.

  La plus haute gamme actuelle de wifi-finder coûte entre 25 et 65 euros
  [NDT-1] et consiste en une carte wifi usb autonome connectée à un
  microcontrôleur et un écran LCD pour afficher les SSID, les canaux et
  la force du signal. Ils contiennent une petite pile lithium-ion pour une
  utilisation portable, et se recharge lui-même dès qu'il est connecté en
  au port USB. Vous pouvez facilement identifier ce périphérique car c'est
  le seul avec écran LCD ! Ce marché a été piégé par un développeur qui
  a vendu sa conception à plein de compagnies, il y a donc pour l'instant
  qu'un seul vrai produit qui a été refait en différents modèles. Après nos
  recherches, nous pensons que tous ces périphériques sont identiques du
  point de vue de leur potentiel en hacking, et ils sont tous vulnérables à
  notre attaque. Voici une liste de ce que nous avons trouvé jusqu'à présent
  dans les magasins ou sur internet (i.e. Amazon.com) :

  Constructeur    Modèle        Référence
  ------------    ---------     ---------
  Allnet          ALL-0298         [3]
  ZyXel           AG-225H          [4]
  ConnecTec       AG-225H          None
  TrendNet        TEW-429UB        [5]
  Linksys         WUSBF54G         [6]

  Tous ce périphériques partagent un facteur commun : une clef USB avec un
  bouton on-off et deux boutons pour l'utiliser seul : "Seek" et "Next".


                Seek   Next
   ______________==_____==______
  |             ___________     |___
  |            |           |      _ |
  | HackMe     |    LCD    |      _ | USB
  |            |___________|     ___|
  |_____________________________|
                     \_/
                Bouton On-Off

  Allumer le périphérique quand ilest déconnecté d'un ordinateur lui fera
  démarrer les procédures de recherche. En plus, appuyer sur "Seek" fera
  redémarrer les procédures de recherche la plupart du temps. Un fois qu'un
  hotspot a été trouvé, appuyer sur Next les lui fera parcours, nous montrant
  le SSID, le canal, le type de chiffrement et la force du signal.

  En laissant appuyé seek pendant l'allumage, le périphérique lance des
  procédures de tests de l'écran et de l'horloge interne. En appuyant
  sur next pendant l'allumage, le périphérique entre en mode de mise à
  jours du firmware pour télécharger le firmware via USB. C'est vraiment
  une fonctionnalité merveilleuse ! Mais ne pensez par que nous patchons
  simplement le code ennuyeux du vendeurs et qu'on appelle ça un hack :
  Pour la plupart des périphériques que nous avons trouvé, le mode de mise
  à jours du firmware a été rendu obsolète et n'est plus capable d'uploader
  vers le microcontrôleur. Nous devons trouver un autre chemin dans le micro,
  et ils n'ont pas rendu le chemin facile.

--[ 3.0 - Ouverture du périphérique

  Le périphérique le plus facile à ouvrir est le Zyxel/Allnet, suivi du
  Linksys et ensuite du TrendNet. À force de "dégrader" la fabrication,
  ces vendeurs l'ont rendu, sans le faire exprès, difficile à ouvrir sans
  l'endommager. Mais on ne s'en fait pas pour si peux, et même un TrendNet
  avec son petit onglet endommagé peut être fermé et rendu au magasin sans
  problème. Ce n'est pas que vous le feriez bien spur.. c'est juste un exemple.

  Pour ouvrir le périphérique, vous devrez retirer le panneau DU BAS (pas
  celui qui contient le LCD). Commencez à appuyer très fort sur l'arrière du
  périphérique, l'arrière étant la partie SANS la connexion USB. En appuyant
  près des coins arrières, le Zyxel s'ouvre facilement. Un petit levier
  avec le verrou peut faire des merveilles et ne laisser aucunes traces. Le
  TrendNet est verrouillé avec 6 petits onglets en plastic pas cher qui se
  casseront facilement quand vous tenterez de l'ouvrir. Mais le Trend est le
  moins cher sur le marché, c'est donc celui-là que vous tenterez d'attaquer
  le plus probablement.

  Bien sûr, vous pourriez toujours essayer de l'ouvrir en faisant levier
  avec un tournevis si vous ne vous inquiétez pas de le retourner ensuite.

  Une fois que le périphérique est ouvert, vous allez voir qu'il consiste
  en deux cartes intégrées connectées par un connecteur à 10-pin. La
  première carte est attachée avec une petite visse près de l'arrière du
  périphérique. N'ayez pas peur de la retirer, ou la manger, ou autre. Elle
  n'est pas nécessaire. La carte wifi/USB contient une puce ZD1211 802.11
  et le sous-système RF. En gros, c'est la même chose qu'un adaptateur USB
  802.11 générique qu'on peut acheter chez le même fabricant. Une fois que
  la visse est enlevée, vous pouvez prendre le connecteur USB et tortiller
  cette carte, la libérant du connecteur 10-pin qui la connecte à la carte
  du bas. La carte du bas contiens la cible de notre attaque, le mystérieux
  micro-contrôleur WHFX30 qui semble être le "cerveau" de l'opération.

  Voici une vue de côté de la manière dont les cartes sont ensemble. Quand
  vous regarderez du dessus pendant le désassemblage, vous noterez que la
  carte wifi a ses composant sur le bas, et la carte du microcontrôleur a
  ses composant vers le haut. Déconnecter les cartes est nécessaire pour
  voir les composants intéressants.


                  Vue de côté des cartes du wifi-finder


                 RF (shielded)          ZD1211              USB
Carte du haut _____________________________________ _ __________
                |______________|      \________/   |_|    |_____|
                 ____________        _____         | |
carte du bas    |____________|--____/     \________|_|_
                  Pile              WHFX30      connecteur 10-pin


--[ 4.0 - L'intérieur et les recherches

  Comme on l'a déjà mentionné, la carte du haut complète peut être utilisée
  comme carte wifi USB autonome pour votre PC. Cette architecture utilisant le
  chipset ZD1211 est très largement rependue, et pour nous : ennuyeuse. Pour
  des informations sur la carte et le périphérique ZD1211, je vous renvoie à
  l'excellent travail de la communauté Linux dont le driver et le code source
  sont disponibles librement en [7]. Vous pouvez y parcourir le code source
  pour découvrir les parties USB, la configuration des registres du ZD1211,
  le promiscuous mode, les canaux et d'autres chouettes informations.

  Mais il n'y a nulle part des informations sur le périphérique
  "WHFX30"... c'est un fantôme, une IC [NDT : Circuit Intégré]
  semi-personnalité qui se trouve dans l'esprit du finder. Puisque l'outil
  de mise à jours du vendeur du firware est trop limitée, nous devons trouver
  une manière de pénétrer les mystère de cette puce et y insérer notre code.

  En faisant des recherches en ligne sur le périphérique, nous avons vu
  d'excellent poins d'entrée pour notre attaque dans les investigations de
  J. Maushammer du périphérique [8]. M. Maushammer a été le premier à tenter
  d'hacker le périphérique et détient une belle masse d'informations. Il
  a émis l'hypothèse que le WHFX30 contienne un microcontrôleur 805x, et en
  désassemblant l'une des mises à jours du firmware, ça y ressemblait bien. Il
  a aussi souligné quelques blocs de données dans le firware du WHFX30, nous
  montrant la table des caractères et les graphiques de démarrage mais il
  n'a pas été plus loin. Peut-être avait-il un but plus noble, ou s'est-il
  lassé dans une étape intermédiaire. Nous sommes résolus de garder notre
  but clair : pénétrer le WHFX30.

  En fouillant les fichiers de mise à jours du firware, on peut voir que
  seul 15k block de mémoire à partir de 0x4000 est du code 8051. Cependant,
  il ne contient aucun vecteur de jmp (qui se trouverait en 0x0000) ou de
  procédures de gestions d'interruptions, ce n'est donc pas entièrement un
  programme 8051. en plus, les chaines de textes pour l'auto-test et l'outil
  de mise à jour automatique n'est pas autorisé à toucher une petite portion
  du code du périphérique : Spécifiquement les procédures du finder. Il nous
  montre aussi que le périphérique WHFX30 contient probablement plus que 16K
  de code en mémoire, ce qui est une bonne chose pour étendre ses possibilités.

  Nous allons prendre l'opportunité d'emprunter le brochage du connecteur
  10-pin de Maushammer. Nous pourrions utiliser nos propres mots, mais il
  serait mieux de commencer directement à faire un standart sur ce qu'on
  défini dans le périphérique. Notez que la vue du connecteur est fait par
  le bas de la carte (WHFX30).

 On-Off Switch
-----/ \----------------
             -----     |
          1 | o o | 2  |
          3 | o o | 4  |
          5 | o o | 6  |
          7 | o o | 8  |
          9 | o o | 10 |
             -----     |
---\_/-----------------
 "Next"

 Pinout
------
J1) Inconnu (pour l'instant)
J2) Scan
J3) Début du scan
J4) GND
J5) GND
J6) Données USB (obsolète ?)
J7) données série (ZD1211 TxD, WHFX30 RxD)
J8) données USB (obsolète ?)
J9) données série (ZD1211 RxD, WHFX30 TxD)
J10) Prise électrique USB pour se charger (une fois connecté au PC)

  Quand on se retrouve face à une puce avec laquelle on n'est pas familier,
  le mieux est de commencer par collecter le maximum d'informations et de
  classer jusqu'à avoir une identification positive. Je pense qu'en gros,
  tous les périphériques tomberont dans une des trois catégories suivantes :

  A) Puce de production
    - les informations sur ces puces seront libres ou facilement disponibles.

  B) Puce semi-personnalisée passée sur une puce de production.
    - Les informations PEUVENT être disponibles, en fonction du secret de
    l'application de la puce. Par exemple, les machines ATM utilisent des
    CPU génériques et sûr 8051 mais aucun ne va jamais l'admettre devant vous.

  C) Puce complètement personnalisée
    - Uniquement faisable pour des gros volumes d'exécution, comme des puces
    graphiques spéciales pour la nouvelle playstation. À moins de travailler
    chez Sony ou Nvidia, la probabilité de trouver une information tend vers 0.

  Notre périphérique n'est pas dans A, et ce petit jouet USB ne doit pas
  être dans les C, nous sommes donc bloqués dans B : Probablement un puce
  "prêt à porter" (mais remaniée) ou au moins basée dessus.

  Voici un exemple de puce du type B, un CPU tout propre que j'ai vu dans un
  distributeur japonnais. Il y avait beaucoup trop de broches pour être un CPU
  normal, mais les circuits autour étaient trop grossier pour pouvoir être
  autre chose. Qu'était-ce finalement ? Et bien, c'était un microcontrôleur
  8032 générique avec une puce EEPROM dans le même paquet. C'était construit
  uniquement pour ce constructeur de machines Pchislo, mais à l'intérieur,
  ce n'était que du prêt à l'emploi. Je pense que la raison est que sans
  savoir ce que c'est, les utilisateurs et les concurrents ne sont pas
  capables d'y accéder ? FAUX ! L'obscurité ne fait pas la sécurité. Ce
  périphérique pouvait être lu et écrit avec un graveur d'EEPROM standard
  une fois le brochage connu.

  Mais revenons à notre wifi-finder. Nous pouvons tracer la localisation
  de la broche VDD (la source d'énergie) et GND, et nous savons qu'il y a
  un port RS232 sur le peu de broches qu'il reste. Avoir peu de broches est
  souvent suffisant pour découvrir un "B facile" - un périphérique standard
  qui est simplement marqué comme quelque chose d'autre. Mais dans notre cas,
  les gars, c'est pas bon. Il y a trop de dérivés 805x et trop de broches
  pour qu'on puisse faire une identification positive.

  Nous avons besoin d'informations supplémentaires. Nous pourrions tenter le
  Social Engineering, mais il semble que les vendeurs ne soient pas non plus
  au fait des détails internes du WHFX30 et la boite de conception originale
  est gardée confidentielle par le vendeur, on manque de chance sur cette voie.

  C'est à ce moment qu'un de nos membres a eu recours à une cochonnerie dans
  l'enquête du WHFX30. On appelle ça "Decap", et, en gros, quand un trou est
  fait sur le haut d'une puce avec un fort acide, vous pouvez voir l'intérieur
  de la puce. Nous ne vous recommandons pas de le tenter vous-même car c'est
  évidement dangereux et ça risque bien d'endommager la carte si vous ne
  faites pas attention ! Mais pour une petite somme de 20 à 65 euros [NDT-1],
  il y a des compagnies qui peuvent vous décaper vos puces, même si elles sont
  attachées à un circuit imprimé. Vous pouvez trouver ces compagnies faisant
  une recherche de termes comme "SEM" (scanning electron microscope),"FIB"
  (focused ion beam), "Decap", "IC Failure Analysis". Ils seront content de
  décaper vos puces pour un prix nominal, et rieront et blagueront avec vous si
  vous leur apportez un ipod ou d'autres trucs de grande valeur. J'ai trouvé
  qu'il ne riaient pas parce que vous leur apportez une puce propriétaire
  d'Apple, mais parce qu'ils l'ont déjà fait tellement de fois qu'ils vous
  dirons simplement ce qu'il y a à l'intérieur. Bande de malades !

  Une fois le WHFX30 décapé, nous l'avons examiné au microscope pour trouver le
  logo du constructeur : Macronix. Les constructeurs mettent toujours un logo
  et une marque sur les puces, à moins qu'elle n'implique un énorme sécurité
  ou qu'elle soit vraiment pas chères (comme un de ces jouets clignotants). Une
  fois avec le nom du fabricant, ça a été facile de chercher dans les produits
  de Macronix jusqu'à trouver quelque chose correspondant au brochage et aux
  possibilités du WHFX30 : le MX10E8050A. Vous pouvez télécharger la fiche
  technique pour ce périphérique chez Keil, qui a fait une chouette suite de
  compilateur/débogueur  appelée microvision (µVision) que vous utiliserez
  probablement plus tard. La fiche technique du MX108050A est disponible en
  [9].

  Le MX10E8050A est un clone bas niveau du 8051 qui offre peu de ports GPIO,
  une UART, 2K de RAM internet, et une énorme EEPROM de 64K (divisée en 4
  blocs de  16K) pour stocker le code. Rien que cette information nous a aidé
  à déchiffrer à quoi l'offset amusant 0x4000 des mises à jours du firmware
  pouvait bien servir : Vous ne pouvez écraser l'EEPROM que par blocs de 16K,
  et ne pouvez (devez ?) pas écraser un blog dans lequel vous êtes en train
  d'exécuter du code. Donc, pour avoir une "Mode de Mise à jour du Firmware",
  les concepteurs ont du mettre ces procédures avec le vecteur de jmp et les
  procédures de gestion des interruptions dans le premier bloc de l'EEPROM,
  entre 0x0000 et 0x3FFF. Ensuite viennent les procédures de recherches
  des hotspot entre 0x4000 et 0x7FFF, et les deux blocs suivants sont
  inutilisés. NOTE : en fait, il y a une mémoire bloc-note pour écrire le
  nouveau firmware avant de le flasher en 0x4000, mais ne nous en occupons pas.


--[ 5.0 - Accéder au chargeur d'ISP

  À ce stade, les choses se dénouent rapidement. Nous avons atteint nos buts
  intermédiaires de recherche et d'identification de notre cible, et un
  petit parcours de la fiche technique du MX10 nous a montré qu'il y a un
  bootloader plus profond câblé dans la ROM de chaque périphérique. C'est
  souvent le cas dans les clones du 8051, et de grands sourires se sont
  formés sur nos visages quand nous avons appris à lui donner vie.

  Maintenant, nous sommes proches de notre but principal, et devrions
  avoir bientôt la possibilité de copier et écraser les 64K d'EEPROM avec
  une petite aide du chargeur d'ISP. Mais nous avons besoin d'une manière
  de communiquer avec le périphérique, ainsi qu'une manière d'exécuter une
  séquence particulière de démarrage, nécessaire pour activer ce chargeur de
  ROM du fabricant. Commençons par la séquence d'allumage. La fiche technique
  nous dit que si nous avons la broche !PSEN basse, les broches ALE et !EN
  hautes pendant qu'on relâche reset, nous entrerons dans le chargeur d'ISP.

  EA est tenu haut par la carte et ALE sera par défaut haut quand !PSEN
  sera forcé à être en bas, nous n'avons donc qu'à mettre !PSEN bas. Nous
  avons commencé par l'agresser avec une aiguille connectée à la terre,
  ce qui marche mais risque d'endommager les circuits d'E/S de la broche
  en question. En traçant un peu le PCB, nous avons vu que la broche J1 du
  connecteur 10-pin est utilisée pour mettre en bas !PSEN pendant un bref
  délai pendant l'allumage. C'est donc simple ! Nous avons juste mis J1 à la
  terre en le connectant à J4 et avons allumé le périphérique. Boom ! Nous
  avons touché le chargeur !

  Quand le chargeur est actif, le port RS232 su WHFX30 est utilisé pour
  transmettre des commandes et les données de l'EEPROM. Cependant, c'est un
  signal logique 3.0v, 0v au lieu des signaux -12v, 12v utilisé par le port
  RS232 de vos PC. NE LE CONNECTEZ PAS à votre PC sans une interface adaptée
  ou vous allez souffler le WHFX30. Puisque le WHFX30 nécessite un niveau
  logique à 3v, vous pouvez utiliser la version 3v de la puce populaire
  MAX232, la MAX3232. Allez voir la fiche technique chez Maxim [A].

  Vous allez avoir besoin d'un circuit 3232, 5 condensateurs 1uf et soit un
  câble RS232 coupé ou un connecteur RS232. Je vais décrire le circuit ici,
  avec un schéma ASCII, mais ça laisse toujours à désirer. Dans la description
  du circuit, quelques noms communs sont utilisés et sont expliqués ici. VCC et
  VDD, c'est pour la source d'énergie du périphérique, ici 3.0v ou 3.3v. GND,
  c'est pour la terre. RxD est l'entrée et TxD est la sortie. Le PC et
  le wifi finder ont chacun des lignes RxD et TxD, ce circuit imprimé est
  donc une interface pour connecter le TxD du finder au Rxd du PC et vice
  versa. Ça devrait vous aider à ne pas vous perdre en câblant la puce.

  Étapes de câblage :

A) Connectez votre source 3v sur la broche 16.
NOTE : Connectez un condensateur (C5) de VCC vers GND
       pour filtrer le bruit.
B) Connectez le GND de la source d'énergie à la broche 15
NOTE : Connectez ce GND vers le GND du WHFX30 sur J4 du
       connecteur 10-pin.
C) Connectez un "Pump Capacitor" C1 de la broche 1 vers la 3
D) Connectez un "Pump Capacitor" C2 de la broche 4 vers la 5
E) Connectez un "Reservoir Capacitor" C3 de la broche 2 vers GND
F) connectez un "Reservoir Capacitor" C4 de la broche 6 vers GND
NOTE : Le condensateur C4 a une polarité négative,
       la partie + est donc connectée à GND
G) le RxD RS232 (broche 2 sur un RS232 9 broches) sur la broche 14
H) le TxD RS232 (broche 3 sur un RS232 9 broches) sur la broche 13
I) le RxD WHFXS30 (broche J7 du connecteur 10-pin) sur la broche 12
J) le TxD WHFXS30 (broche J9 du connecteur 10-pin) sur la broche 11

NDT : Pump Capacitor est un condensateur utilisé pour monter la tension,
      Reservoir capacitor est un condensateur utilisé pour baisser
      la tension...
      Il s'agit dans les deux cas du même composant (un condensateur),
      mais utilisé à des fins différentes.
      * http://en.wikipedia.org/wiki/Capacitor
      * http://en.wikipedia.org/wiki/Reservoir_capacitor


              MAX3232 Interface
                   ___ ___
+-----)|--- C1+  -|1  U 16|-  Vcc ---|(---GND
|  GND--)|-- V+  -|2    15|-  GND --------GND
+---------- C1-  -|3    14|-  T1out ---> RS232 RxD (RS232 p2)
 +---)|---- C2+  -|4    13|-  R1in  <--- RS232 TxD (RS232 p3)
 +--------- C2-  -|5    12|-  R1out ---> WHFX30 RxD (Header J7)
   GND--|(-- V-  -|6    11|-  T1in  <--- WHFX30 TxD (Header J9)
          T2out  -|7    10|-  T2in
           R2in  -|8     9|-  R2out
                  |_______|

  Comme alternative, vous pouvez aussi acheter un connecteur USB-RS232
  pas cher et le mettre entre les broches 3v Txd et Rxd, vous évitant des
  problèmes en construisant le circuit MAX3232.

--[ 6.0 - Possibilités du chargeur d'ISP

  Ok, vous avez construit et testé votre carte d'interface, et l'avez connecté
  au wifi finder. Vous avez fait un pont entre J1 et J4 pour activer le
  bootloader, et vous avez allumé le wifi finder, en ayant un hyperterminal
  qui tourne sur votre PC. Et maintenant ?

  Tout d'abord, le périphérique ne va rien vous envoyer, ou alors des
  caractères qui servent à rien. Il attend un "U" majuscule pour détecter
  et configurer le débit. Après avoir envoyé quelques "U" au périphérique,
  il va commencer à nous retourner des caractères. Vous pouvez alors parler
  au chargeur d'ISP.

  C'est à ce moment qu'on a noté une divergence avec la fiche
  technique. Peut-être que notre périphérique n'est pas exactement un
  MX10E8050A, ou peut-être qu'ils se sont merdés. La fiche technique dit qu'on
  peut envoyer soit du ASCII, soit du binaire. Nous avons trouvé qu'il ne
  répondait qu'au binaire (et donc, un hyperterminal est assez limité). Mais
  les commandes listées dans la fiche techniques sont les bonnes, vous n'avez
  qu'à les envoyer en format binaire, et pas en ASCII. Allez chercher un
  programme de communication sur le site openschemes donné à la fin de
  l'article.

  Les lignes que vous enverrez sont basées sur le format Intel Hex Record
  que vous avez du voir dans ces fichiers .HEX de votre compilateur. Mais
  ce périphérique utilise un ensemble étendu pour inclure des commandes. Le
  format est par contre le même. Les détails sur le format HEX sont disponibles
  dans les références [B] plus loin.

Format générique d'une ligne hex :
: nn aa aa rr dd ... dd cc <crlf>

Nombre  Donnée      Description
------  ------      ------------
1)      0x3A        (caractère ":") Début de la ligne
2)      0xnn        Le nombres d'octets de données de la commande
3-4)    0xaa, 0xaa  Adresse de l'endroit à accéder, ou sinon 00,00
5)      0xrr        Type de ligne (ou type de commande)
6-n)    0xdd.....   Paquet de données, de longueur donnée en #2
n+1)    0xcc        complément du checksum en base 2.  Somme (sauf les :),
                    modulo FF, invert-1

  Donc, à la réception d'une commande complète, le périphérique va commencer
  par répondre "." pour indiquer que le checksum est bon, ou un "X" sinon. La
  seule autre réponse serait un "R" si vous tentez d'écrire des données mais
  que ça n'a pas marché. Nous n'en avons jamais reçu à part quand nous avons
  tenté d'écrire avant que l'EEPROM soit effacée.

  Quelques chouettes commandes sont offertes dans la fiche technique, et
  nous nous en sommes sortis avec quelques autres. Nous allons les montrer
  comme des chaines hex, parce que la version ASCII ne ressemble à rien ! La
  séquence suivante pourrait être un ensemble typique de commande.

---------------------------------------------------------------------------
1) Copie de l'EEPROM.
0x3A, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xF9

Description: Lire l'EEPROM (0x04) depuis 0x0000 jusqu'en 0xFFFF, checksum
0xF9.

  Cette beauté copie le contenu complet de la mémoire du code du WHFX30 vers le
  port série. C'est la première commande que vous voudrez utiliser, pour avoir
  une copie propre des 64K d'EEPROM au cas où vous vous merdiez plus tard.

---------------------------------------------------------------------------
2) Écrasement complet de la puce
0x3A, 0x01, 0x00, 0x00, 0x03, 0x07, 0xF5

Description: supprime tous les blocks d'EEPROM (0x03) + octets de statu et
vecteur de boot, checksum : 0xF5.

  Vous pourriez aussi faire un écrasement par block, mais cette commande va
  tout supprimer dans la puce, c'est notre méthode préférée. Veuillez noter
  que vous aurez besoin de ré-écrire le vecteur de boot après la suppression,
  sinon, la puce va rester bloquée dans le chargeur d'ISP.

---------------------------------------------------------------------------
3) Autoriser l'écriture sur le périphérique
0x3A, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xF8

Description: Blank check * (0x01) du périphérique de 0x0000 à 0xFFFF

NDT : blank check, chèque blanc (chèque signé mais dont le montant est
      laissé vide pour qu'on puisse y mettre ce qu'on veut). C'est un peut
      l'idée ici, permettre l'écriture, sans savoir à l'avance ce qu'on
      veut y mettre).

  Vous pouvez réussir à programmer l'EEPROM avec des données dedans, vous
  aurez donc besoin de faire un blank check. Ça prend quelques secondes si
  ça va à son terme, mais si vous ratez, vos écritures raterons chaque fois
  que la puce trouvera des données. Cool !

---------------------------------------------------------------------------
4) Données du programme
0x3A, 0x10, 0x00, 0xhh, 0xll, 0x00, 16 octets de donnée, Checksum

Description : Programme l'EEPROM (0x00) à l'endroit 0xhhll avec les octets
suivants. Le premier octet est la taille de la donnée. Nous utilisons ici
0x10 pour 16 octets, mais ça peut changer. Veuillez noter que vous devrez
calculer le checksum à la volée, et que la somme du checksum n'inclus PAS
le premier octet 0x3A.

Si vous ne savez pas comment faire un checksum intel, voici comment ça marche :

a) sommez les octets modulo 256 (ou sommez dans une variable de la taille
d'un octets et vous ennuyez pas).
b) Faites en le complément à 2. Si vous ne voulez pas entrer dans les détails,
soustrayez votre somme à 256 (0x100) ou laissez 0x00 si votre somme faisait
déjà 0x00.

Pour ceux d'entre vous qui ne sont pas familier des compléments à 2, c'est le
nombre nécessaire pour, quand on l'additionne, le résultat fasse 0x100. Donc,
pour un total de 0x7E, notre checksum serait de 0x82. Puisqu'on fait des
checksum sur un octet, un total de 0x17E ou 0x217E ferait de toutes façons
0x82, puisque seuls le dernier octet compte. Si le total fait un multiple
de 0x100, alors le checksum fait 0x00.

---------------------------------------------------------------------------
5) Supprime le vecteur de boot et l'octet de statu
0x02, 0x00, 0x00, 0x03, 0x04, 0x00, 0xf7

Description: Supprime (0x03) l'octet BV/Status byte (0x04) après que la
programmation soit faite, pour se préparer à restaurer les valeurs par défaut.

  Après la programmation, le périphérique va avoir son statu et BV [Boot
  Vector] de mis pour continuer le démarrage dans le chargeur d'ISP. Pour
  remettre la puce dans un mode normal (démarrer dans l'EEPROM), nous devons
  nettoyer et réécrire le BV manuellement. Veuillez notez qu'après avoir
  nettoyé ces octets, il est très important que vous arrivez à réécrire le
  BV vers sa valeur par défaut, ou vous DÉSACTIVERIEZ vraiment le chargeur
  d'ISP et vous ne pourriez plus revenir dedans. Si vous avez des problèmes
  en le réécrivant, faites simplement une suppression complète de la puce
  pour quitter ce cas dangereux. Mais n'éteignez JAMAIS si vous êtes bloqués
  dans cette étape 5.

---------------------------------------------------------------------------
6) Écrire le vecteur de boot
0x03, 0x00, 0x00, 0x03, 0x06, 0x01, 0xFC, 0xF7

Description: écrire (0x03) le vecteur de boot (0x01) avec la valeur 0xFC
(pour 0xFC00), checksum: 0xF7.

  Ceci remet la valeur par défaut dans le vecteur de boot à 0xFC00. N'éteignez
  pas le périphérique entre les étapes 5 et 6, ou le vecteur de boot restera
  à 0x0000, démarrant toujours l'EEPROM vous empêchant à jamais d'atteindre
  le chargeur d'ISP.

---------------------------------------------------------------------------

  Nous admettrons à partir d'ici que vous avez copié entièrement les 64K
  d'EEPROM qui sont dans le périphérique. Un tout petit 16K correspond aux
  données qu'on trouve dans les fichiers de mises à jours du vendeur, ce qui
  nous laisse BEAUCOUP de données inconnues. N'ais pas peur, intrépide hacker
  - nous allons découper ces zones et fonctions de ce code d'EEPROM pour toi.

  Les 65K d'EEPROM sont divisés en quatre blocs logiques de 16K chacun. Cette
  partition est fournie par le constructeur pour permettre à la puce de
  s'écraser et reprogrammée elle-même de manière limitée. Dans tous les
  firmware fouillés, le partitionnement suit le schéma suivant :

Partition   Adresse logique  Fonction
---------   ---------------  --------
    1         0000h-3FFFh    Bootloader et procédures de test
    2         4000h-7FFFh    procédures de recherche d'hotspot
    3         8000h-BFFFh    Scratchpad 1 - Wifi Data??  pas encore sûr
    4         C000h-FFFFh    Scratchpad 2 - bloc note des mises à jours

  Comme c'est le cas avec la plupart des microcontroleurs 8051, l'exécution
  typique à partir du démarrage ou d'un reset commencent en 0x0000 dans la
  partition 1. Ici, le micro va d'abord vider la RAM et vérifier la mémoire
  avant de vérifier l'état des boutons. Si les boutons du mode self-test ou
  du bootloader sont abaissés, le micro va fonctionner exclusivement dans la
  partition 1. Dans le "Firmware Update Mode" qui s'y trouve, le micro peut
  supprimer et ré-écrire les autres blocs. Par exemple, quand une procédure
  du finder est mise à jours en mode de mise à jours du firmware, le micro
  commence par supprimer le bloc en C000, et y écrit les données. Si le
  checksum est bon, le bloc 4000 sera supprimé et la nouvelle procédure y
  sera écrite.

  La deuxième partition contient les procédures de recherche d'hotspot,
  c'est ce qu'on voit s'exécuter quand le périphérique est en train de
  chercher les hotspots. Si aucun bouton n'est appuyé pendant le démarrage,
  nous sauterons le bootloader et continuerons  dans les procédures de ce bloc.

  La troisième partition est utilisée comme bloque note, mais sa fonction
  n'est pas déterminée à 100%. Nous la suspectons d'être utilisée pour écrire
  les données wifi, mais nos notes sur ce sujet ne sont pas vérifiées.

  La quatrième partition est utilisée comme bloque note pendant les mises
  à jours du firmware pour y écrire le nouveau firmware temporairement. Au
  début du mode de mise à jour du firmware, le bloc C000 est effacé. Quand un
  nouveau firmware est envoyé au périphérique, il y est d'abord écrit. Une fois
  la transmission réussie, le checksum est vérifié. S'il est valide, le bloc
  4000 est alors supprimées et ces données écrites pour un usage permanent en
  tant que nouvelles procédures de recherche. Cette mise à jours simplifiée est
  un peu plus sûre car elle est téléchargée et le checksum vérifié avant que
  la mise à jour soit faite, ça sera donc le sujet de notre prochaine section.


--[ 7.0 - Possibilités du bootloader logiciel

  Pour ceux qui se défient d'écraser et de chambouler l'EEPROM à bas niveau,
  on peut aussi communiquer avec le bootloader logiciel, aussi connu comme
  "Firmware Upgrade Mode". Il ne fonctionne que pour le bloc de 16K à partir
  de 0x4000 (les procédures de recherche), mais c'est quand même utile dans
  certains cas. C'est une bonne alternative pour ceux qui ne veulent pas
  risquer de corrompre la mémoire du périphérique ou le vecteur de boot. Je
  le considère très sûr, parce que le bootloader lui-même se trouve dans le
  bloc à 0x0000, séparé des suppressions et écritures qui ont lieu en 0x4000
  et au dessus. Donc, vous ne perdrez en aucun cas la possibilité de revenir
  à l'EEPROM originale.

  Quand nous allumons le périphérique (sans sauter entre J1 et J4), et en
  appuyant sur le bouton "Next", le bootloader logiciel démarre comme on en
  a déjà parlé. Le port série est automatiquement configuré sur 115.2k, 8n1
  et le périphérique commente à écrire des caractères. Il tente de parler
  avec le ZD1211, mais nous pouvons simplement y attacher notre interface
  RS232 et communiquer avec lui directement.

  Je n'entrerez pas dans les détails ici, mais nous avons du désassembler
  le bootloader lui-même pour trouver les commandes et la séquence de
  communication. Vous pouvez le faire aussi, si vous voulez. Ou, un petit
  programme est disponible en ligne pour lire et écrire le périphérique en
  utilisant le firmware upgrade mode. Un petit survol d'une partie désassemblée
  montre quelques détails que nous avons utilisé dans le développement de
  notre programme.

  À l'entrée du firmware upgrade mode, le périphérique envoie 8 octets 0x00
  au port série pour montré qu'il est en vie, et ensuite, il envoie 8 octets
  0xA6 pour prévenir qu'il va supprimer le bloc 0xC000. Après avoir vidé
  le bloc note, le périphérique envoie 8 octets 0xA7. Enfin, il envoie 8
  octets 0x11, qui sont l'équivalent d'un "prompte de commande". Une bonne
  commande sera exécutée, et une mauvaise sera ignorée, et nous rendra une
  autre huitaine de 0x11.

  Bien que toutes les instructions ne soit pas montrées, vous pouvez voir
  les opérations de ces sections grâce à nos commentaires.

  Extrait 1 : Envoie les 0xA6, écrase le bloc 0xC000 et envoie les 0xA7.

  Note : les 8 transmissions des 0xA6 et 0xA7 ne sont pas montrées, mais
  vous pouvez vous faire une idée.

053A 7F A6      mov     R7, #0xA6  ; Charge 0xA6
053C 12 28 A0   lcall   SerialOut0 ; L'envoie au port série
053F 7F A6      mov     R7, #0xA6  ; Charge 0xA6
0541 12 28 A0   lcall   SerialOut0 ; L'envoie au port série
0544 7F C0      mov     R7, #0xC0  ; Charge 0xC0 pour la suppression
0546 12 29 3C   lcall   Do_IAP_ERASE ; Fait un appel pour supprimer 0xC000
0549 7F A7      mov     R7, #0xA7  ; Envoie 8x 0xA7 pour signifier
                                   ; la suppression du bloc
054B 12 28 A0   lcall   SerialOut0
054E 7F A7      mov     R7, #0xA7
0550 12 28 A0   lcall   SerialOut0
0553 7F A7      mov     R7, #0xA7
0555 12 28 A0   lcall   SerialOut0
... et ainsi de suite ...

  Extrait 2 : Envoi des derniers octets 0x11 du prompt, et inspection du
  "password" et des commande.

058F 7F 11      mov     R7, #0x11  ; Charge 0x11
0591 12 28 A0   lcall   SerialOut0 ; L'envoie sur le port série
0594 7F 11      mov     R7, #0x11  ; Charge 0x11
0596 12 28 A0   lcall   SerialOut0 ; L'envoie au port série
0599 12 29 A2   lcall   SerIn_OneByte     ; Récup. un octet
059C BF AA D2   cjne    R7, #0xAA, L_571  ; Si != 0xAA, quitte
059F 12 29 A2   lcall   SerIn_OneByte     ; Récup. un autre octet
05A2 BF 77 CC   cjne    R7, #0x77, L_571  ; Si != 0x77, quitte
05A5 12 29 A2   lcall   SerIn_OneByte     ; Récup. un autre octet
05A8 8F 28      mov     RAM_28, R7   ; Stocke à l'adresse 28
05AA E5 28      mov     A, RAM_28    ; Stocke dans A aussi
05AC 64 A5      xrl     A, #0xA5     ; XOR avec 0xA5
05AE 70 2B      jnz     L_5DB        ; Si != 0xA5, continue de "supprimer"
05B0 7F A5      mov     R7, #0xA5    ; Sinon, écrit un ack de 0xA5
05B2 12 28 A0   lcall   SerialOut0
05B5 7F A5      mov     R7, #0xA5
05B7 12 28 A0   lcall   SerialOut0

  On peut voir que le bootloader attend un "password" de 0xAA, 0x77 pour
  commencer l'interpréteur de commandes. Ensuite, il attend l'octet 0x45
  pour commencer le téléchargement. Une fois qu'il a reçu un 0xA5, il va
  écrire 8 0xA5 et continuer sa procédure de "réception".

  Vous noterez que ces noms de fonctions sont les nôtres, et sont bien
  évidement pas incluses dans le firmware. N'ayez pas peur de mettre vos
  propres noms et commentaires dans le code si vous décidez de le désassembler
  vous-même. En plus, vous noterez que pour supprimer le bloc 0xC000,
  nous devons utiliser les appels ROM internes du périphérique. C'est une
  caractéristique intéressante fournie par le constructeur pour faciliter
  la programmation de l'EEPROM. Les détails des appels IAP rom sont listés
  dans la fiche technique et nous ne vous montrons ici qu'un petit extrait
  de l'appel Do_IAP_ERASE, juste par souci de clarté.

293C Do_IAP_ERASE:
293C 8F 2F        mov     RAM_2F, R7      ; Récup. l'adresse où supprimer
293E 75 F8 5A     mov     SFR_F8, #0x5A   ; Écrit le ROM Security code
2941 43 A2 20     orl     FIE, #0x20      ; Met ENBOOT pour autoriser IAP ROM
2944 79 01        mov     R1, #1          ; Fonction 0x01 (ERASE EEPROM)
2946 8F 83        mov     DPH, R7         ; Octet de poids fort dans DPH
2948 75 82 00     mov     DPL, #0         ; Octet de poids faible dans DPL
294B 12 FF F0     lcall   L_FFF0          ; Exécute l'appel
294E FF           mov     R7, A           ; Stocke le résultat dans R7
294F 53 A2 DF     anl     FIE, #0xDF      ; Libère  le flag ENBOOT
2952 53 F8 00     anl     SFR_F8, #0      ; Libère le ROM security code
2955 22           ret
2955 ; Fin de la fonction Do_IAP_ERASE

  C'est intéressant parce qu'il n'y a aucun code en FFF0, mais cette adresse
  a été remappée vers une fonction internet fournie par le constructeur de
  la carte. Nous activons ce remappage en écrivant le password et en mettant
  le bit ENBOOT. Comme il a été mentionné, les détails sont dans la fiche
  technique, mais c'est la procédure générale pour appeler les fonctions
  IAP avec la commande désirée dans le registre R1.

Vous avez eu assez d'assembleur ? Continuons donc notre description !

  Quand on utilise le firmware upgrade mode, les fichiers de 16k doivent passer
  un checksum interne où la valeur des octets en 0x0E et 0x0F (0x400E, 0x400F)
  est là pour que la somme 16bits du bloc entier fasse 0x000. C'est un calcul
  facile et notre programme pour communiquer avec le mode de mise à jour le
  calculera et le corrigera à la volée s'il y a besoin. Si vous codez le vôtre,
  gardez ceci à l'esprit : si le fichier entier est téléchargé mais que le
  checksum ne marche pas, le périphérique affichera BED CS: ???? sur le LCD,
  où les ?? seront remplacés par le checksum. L'EEPROM ne sera pas mise à jours
  en cas de checksum raté. Si le checksum est bon, le périphérique affiche
  "Erasing", "Upgrading" pendant un tout petit moment et vous affiche alors
  la nouvelle version du firmware avant d'attendre que vous le redémarriez.

  Veuillez noter que le bloc 0xC000 et peut-être le bloc 0x8000 sont utilisé
  comme bloc note quand un nouveau fichier BIN de 16K est téléchargé. Donc,
  si vous avez mis du code à ces endroit quand vous entrez en firmware
  upgrade mde, sachez que ces blocs seront automatiquement supprimés lors
  de l'entrée en mode de mise à jours.


--[ 8.0 - Insérer votre propre code

  Nous admettrons que vous avez un compilateur, et la connaissance nécessaire
  pour écrire du code 8051. La prochaine étape est d'insérer des bouts
  de codes pour être exécutés. Il y a essentiellement deux manières de le
  faire : en patchant les procédures de recherche quand on utilise le mode
  de mise à jour du firmware; ou en patchant le bootloader quand on est en
  train d'écraser toute la mémoire via le chargeur d'ISP.

  La première est chouette, mais l'espace est limité aux procédures de
  recherche, ce qui fait en gros 1400 octets en 0x7A80. Néanmoins, nous
  allons la montrer ici.

  Le point d'entrée des procédures de recherches est en 0x4020, on y saute
  après que les vérifications du bootloader. Ici, nous libérons un peu de
  mémoire et sautons à la procédure principale en 0x71FE. En y insérant un
  saut ou un call juste après avoir libéré la RAM interne, on peut détourner
  l'exécution vers notre code, que nous admettrons se trouver en 0x7A80. Après
  que notre code se soit exécuté, nous pouvons continuer avec les procédures
  normales de recherche en sautant en 0x71FE. Ou vous pouvez insérez un
  appel juste après la libération de la RAM, et faire simplement un ret.

Code original du point d'entrée

org 0x4020
;-------------------------------------------
Finder_Entry:

  mov     R0, #0x7F         ; Charge l'adresse du haut de la RAM
  clr     A                 ; Libère l'ACC

Memclear_Loop:              ; seg000_4023
  mov     @R0, A            ; Met un 0 à l'adresse de R0
  djnz    R0, Memclear_Loop ; Décrémente R0, boucle si on a pas fini
  mov     SP, #0xA1         ; Met le pointeur de pile à 0x41
  ljmp    Finder_Start      ; Continue en 0x71FE


Nous insérerions notre saut ou notre appel juste avant le ljmp. Après le
ljmp, il y a une zone blanche jusqu'en 0x4070, c'est donc pas un problème
d'y insérer quelques instructions. Par exemple :

Code modifié du point d'entrée

org 0x4020
;-------------------------------------------
Finder_Entry:

  mov     R0, #0x7F         ; Charge l'adresse du haut de la RAM
  clr     A                 ; Libère l'ACC

Memclear_Loop:              ; seg000_4023
  mov     @R0, A            ; Met un 0 à l'adresse de R0
  djnz    R0, Memclear_Loop ; Décrémente R0, boucle si on a pas fini
  mov     SP, #0xA1         ; Met le pointeur de pile à 0x41
  ljmp    MyRoutine         ; jump vers notre code


org 0x7A80
;-------------------------------------------
MyRoutine:
  Instruction à compléter ;)
  ...
  ...
  ljmp    Finder_Start      ; Continue en 0x71FE

  À ce stade, nous n'avons pas montré qu'il y a beaucoup de données entre
  ces deux points. C'est mieux de compiler de votre programme, et ensuite le
  convertir de fichier .hex vers un fichier .bin (en utilisant HEX2BIN.exe -
  cherchez-le ou téléchargez-le à partir des références [C]). Finalement,
  insérez votre nouveau code en copiant/collant via un éditeur hexadécimal
  au bon endroit du fichier .bin original avant de l'uploader vers le
  périphérique.

  Pour les plus aventureux, c'est mieux de mettre à jour l'EEPROM entièrement
  en utilisant le chargeur d'ISP. Ensuite, on peut en gros s'emparer du bloc
  de 16K complet en 0x8000. Celui--ci n'est pas supprimé par des commandes
  quand on est en mode de mise à jours du firmware et est donc relativement
  sûr. Si vous utilisez le bloc d'EEPROM en 0xC000, vous ne pourrez plus
  entrer en mode de mise à jours du firmware sous peine qu'il l'efface
  immédiatement et que vous ayez à le reprogrammer pour que votre code
  retourne dans le périphérique.

  Au démarrage, le périphérique commence l'exécution en 0xC000; où nous ne
  pouvons mettre qu'une instruction, le reset jump vector. Vous pouvez toujours
  patcher cette instruction pour sauter vers votre code, et ensuite continuer
  avec sa valeur originale en sautant en 0x0100. Il est plus souhaitable de
  patcher en 0x109, après que le périphérique ait libéré la RAM internet et
  ait placé le pointeur de pile.

  Ce code en 0x0100 est presque identique au début des procédures de recherche
  que nous venons de regarder. Notre stratégie est identique et dans cet
  exemple, nous allons prendre le contrôle en 0x0109 et sauter vers notre
  code en 0x8000. Une fois que notre code a terminé, on peut poursuivre en
  sautant à l'étape suivante de la procédure originale (vérifier les boutons
  Next/Seek) avec un saut vers 0x26D2.

  Code original de démarrage. Atteint après un saut du vecteur en 0x0000.

org 0x0100
;-------------------------------------------
Power-ON:

  mov     R0, #0x7F           ; Charge l'adresse du haut de la RAM
  clr     A                   ; Libère l'ACC

Memclear_Loop0:               ; seg000_0103
  mov     @R0, A              ; Met 0 à l'adresse pointée par R0
  djnz    R0, Memclear_Loop0  ; Décrémente R0, boucle si pas fini
  mov     SP, #0xA1           ; Met le pointeur de pile à 0xA1
  ljmp    Boot_Check          ; Continue en 0x26D2

Code modifié pour le démarrage

org 0x0100
;-------------------------------------------
Power-ON:

  mov     R0, #0x7F           ; Charge l'adresse du haut de la RAM
  clr     A                   ; Libère l'ACC

Memclear_Loop0:               ; seg000_0103
  mov     @R0, A              ; Met 0 à l'adresse pointée par R0
  djnz    R0, Memclear_Loop0  ; Décrémente R0, boucle si pas fini
  mov     SP, #0xA1           ; Met le pointeur de pile à 0xA1
  ljmp    MyRoutine           ; Continue en 0x8000 (notre code)


org 0x8000
;--------------------------------------------
MyRoutine:
  Complétez avec vos instructions
  ...
  ...
  ljmp    Boot_Check          ; Continue en 0x26D2

  Cette approche est un peut plus facile à éditer en hexa parce qu'il
  n'y a que quelques octets à modifier en 0x0109. Ensuite, on peut coller
  allègrement les 16K de code en 0x8000.

  Évidement, le meilleur hack n'utilise pas d'édition en hexa, mais re-créera
  le .ASM complet pour le reste de l'EEPROM. Soit nous, ou un autre groupe
  publiera ce .ASM - on est encore en pour parler - mais ça prendra du temps
  car on en est encore à l'étude du désassemblage.


--[ 9.0 - Conclusion

  Nous n'avons fait qu'effleurer la surface dans cet article, pour vous donner
  les outils et les points d'entrée pour vos propres développements. Des
  techniques plus avancées, comme insérer deux interfaces RS232 entre les deux
  cartes, peuvent nous permettre de surveiller toutes les communications
  pendant les procédures de recherches ou le mode de mise à jours du
  firmware. Avec cette méthode, on peut facilement voir la séquence de
  commandes qui passe entre les deux puces. De plus, l'USB snooping est un
  super outil pour écouter les communications haut-niveau entre le PC et
  le finder n'importe quand. Ces commendant peuvent aussi être vue dans un
  désassemblage et une analyse du firmware complet, qui n'ont pas été inclus
  ici. Utiliser votre imagination et votre créativité, vous mènera à plein
  d'autres avancées auxquelles nous n'avons même pas pensé !

  En conclusion, cet article s'est centré sur le hack matériel, nos idées sur
  le logiciel et les discussions sur notre outil logiciel personnalisé ont
  donc été omises. Pour une analyse plus profonde et en détail, ainsi qu'un
  accès aux outils logiciels décrit dans l'article, allez voir notre page,
  généreusement hébergée par le projet Openscheme en [D].

  Bonne chance, et joyeux hack !

--[ A.0 - Références

[1] - IDA Disassembler by DataRescue Corporation
      http://www.datarescue.com/

[2] - Keil uVision IDE
      http://www.keil.com/uvision/

[3] - Allnet Allspot ALL0298
      http://www.allnet-usa.com/html/shop.php?kat=WiFi+54Mbit

[4] - ZyXel AG-225H
      http://www.zyxel.com  (Direct link too long to include)

[5] - TrendNet TEW-429UB
      http://trendnet.com/products/proddetail.asp?prod=155_TEW-429UB

[6] - Linksys WUSBF54G
      http://www.linksys.com  (Direct link too long to include)

[7] - ZD1211 Linux Driver Development
      http://zd1211.wiki.sourceforge.net

[8] - ZyXEL AG-225H WiFi Finder Reverse Engineering
      http://www.maushammer.com/systems/wififinder/index.html

[9] - Macronix MX108050A Datasheet
      http://www.keil.com/dd/docs/datashts/mxic/mx10e8050i.pdf

[A] - Maxim MAX3232 Datasheet
      http://datasheets.maxim-ic.com/en/ds/MAX3222-MAX3241.pdf

[B] - Intel Hex Record Format at Keil
      http://keil.com/support/docs/1584.htm

[C] - HEX2BIN Download
      http://www.tech-tools.com/d_hx2bin.htm

[D] - Wifi Finder Reverse Engineering at Openschemes
      http://wifi.openschemes.com.

--[ B.0 - Note du traducteur

NDT-1 : entre 40 et 100 dollars, au taux de change du 22 Mai,
        ça fait entre 25 et 65 euros.