Skyduino:~#
Articles
Autre, programmation, projet, tutoriel

[Tuto/Hack] La rétro-ingénierie c’est la vie

Bonjour tout le monde !

Aujourd’hui je vous propose un gros article, un très gros article !
Dans cet article je vais vous parler de rétro ingénierie ! (et ouai :))

Avant propos
La rétro ingénierie ("reverse engineering" en anglais) est encadrée en France par des règles relativement strictes sur ce qui peut être et ce qui ne peut être fait.
Tout se joue à la frontière entre le principe d’interopérabilité, de recherche, de sécurité informatique et de droit à la propriété intellectuelle.
Ça sonne chiant et bordélique pour savoir si on est ou non dans la légalité et … ça l’est.

Soyez bien conscient que faire du reverse engineering n’est pas anodin et que cela peut vous causer de sérieux probléme si vous ne faite pas les choses dans les règles de l’art.
N’hésitez donc pas à vous renseigner avant de faire une bêtise, un tour sur wikipedia peut déjà vous donner les grandes lignes :
http://fr.wikipedia.org/wiki/Rétroingénierie#France

Dans cet article je vais vous présenter une technique de rétro ingénierie matérielle (et dans une moindre mesure logicielle) simple mais efficace. Cependant certain détails ou documents ne seront pas rendu public pour diverses raisons légales.

PS: Pour être très franc je ne sait pas si cet article est 100% légal ou non, normalement oui … normalement.

La rétro ingénierie c’est quoi ?

La rétro ingénierie c’est l’art de faire un schéma (ou un code, ou plus généralement de documenter quelque chose) à partir de quelque chose qui existe et dont on dispose physiquement.
Imaginez que vous ayez une machine à laver, vous voudriez bien pouvoir la contrôler avec votre carte Arduino, mais vous ne pouvez pas car vous n’avez pas le schéma de la dite machine.
Ô tristesse …

Abandonner l’idée de recevoir un mail quand votre linge est propre serait pour autant idiot !
Si le schéma n’est pas disponible publiquement pourquoi ne pas … le fabriquer, par rétro ingénierie.

Avec cet exemple simple vous devriez avoir saisi le concept normalement : en gros on a quelque chose (qui marche, c’est mieux) et on fait l’inverse du processus de création originel (qui a abouti au quelque chose en question).
Au début on a une boite noir dont on ne peut rien faire d’autre que ce pourquoi elle a été conçu. Et à la fin on a une boite blanche dont on connait le fonctionnement interne et dont on peut faire ce que l’on veut.

Personnellement je voit trois grands buts à la rétro ingénierie :
– documenter quelque chose pour permettre son utilisation plus tard de manière dérivée (ou non) SANS MODIFIER L’OBJET,
– documenter quelque chose pour permettre une communication avec un système autre que celui de base (c’est le principe d’interopérabilité, toujours sans modifier l’objet en question),
– documenter quelque chose pour permettre une refonte totale de son fonctionnement en utilisant un logiciel/matériel fait maison (principe des "homebrew" par exemple).

Attention : avec ce dernier but il y a modification de l’objet, matériellement et/ou logiciellement, il faut donc prendre en compte le droit à la propriété intellectuelle du concepteur d’origine et tout ce qui va avec.

Règle de base : quoi qu’il arrive ne diffusez JAMAIS un dump (= copie de la mémoire d’un système) de code, c’est le procès assuré si vous le faite.
Si vous analysez le dump pour ensuite faire votre propre code source (sans reprendre le moindre morceau du dump d’origine tel quel) pas de soucis.
Faite quand même attention aux produits dont vous n’êtes pas réellement le propriétaire même âpres les avoir achetés (typiquement les consoles de jeu par exemple), c’est de plus en plus courant.

Le contexte autour de cet article

Depuis quelques temps je fait des recherches sur la sécurité des cartes sans contacts MiFARE, mon but étant d’écrire un article sur le sujet.
Seulement pour pouvoir prouver qu’il est très simple de lire de telle cartes d’une certain distance sans attirer l’attention j’avais besoin d’un lecteur compact et puissant.
J’ai donc naturellement fini sur ebay pour trouver mon bonheur ;)

DSCF2057

Mon choix s’est porté sur ce module chinois.
Ce type de lecteur est très utilisé pour les systèmes de transport utilisant des cartes sans contact (ici compatible MiFARE).
Pas cher (18€ frais de port inclut), d’une porté très correcte (~5cm) et facilement intégrable à un système existant au travers d’un simple port série.

Ce module a un autre gros avantage : de l’autre coté de la carte se trouve l’antenne et le cœur du lecteur : un microcontrôleur ATmega8A, facilement reprogrammable !
Cependant bien que la partie "utilisation grand public" soit très bien documentée (protocole, drivers série pour linux, …), la partie hardware elle est un mystère total.
Impossible donc en l’état de faire quoi que se soit avec ce module, du moins pour mon utilisation.

C’est là qu’intervient la rétro ingénierie.

Étape 1 : documentation

Avant de faire quoi que ce soit il faut faire des recherches, beaucoup de recherches.
Le but est d’avoir un maximum d’informations sur le système que l’on souhaite documenter.
Parfois vous trouverez des documents quasi complet, parfois juste des datasheets et parfois rien du tout, mais ça fait parti du jeu !

DSCF2036DSCF2037

Bien commençons par inspecter visuellement la carte.
On remarque de suite deux références intéressantes : "EHUOYAN" et "YHY502".
Demandons donc son avis à l’ami Google.

Le mot clef "EHUOYAN" nous fait arriver sur le site du fabricant portant le même nom :
http://www.ehuoyan.com/english/default.asp

Le site d’un fabricant est toujours une bonne source d’informations. Il faut cependant faire attention au bullshit commercial qui s’y trouve.

Le mot clef "YHY502" nous amène sur deux liens :
http://code.google.com/p/yhy632/source/browse/trunk/yhy502.c
et
http://www.webtronico.com/documentos/DS_YHY502CTG.pdf

Le premier lien pointe vers un morceau de code source pour un driver Linux, dans notre cas cela n’apporte pas beaucoup d’informations.
Le second lien lui nous informe de la présence d’un datasheet pour ce module ! Bingo !
Grâce à ce lien on peut d’or et déjà comprendre une partie du fonctionnement du module, mais pas tout.

Recherchons ensuite des informations sur les composants utilisés : "FM1702SL" et "ATmega8A".

Le mot clef "FM1702SL" nous donne sans attendre le datasheet du module radio utilisé :
http://www.fmsh.com/english/products/FM17XX%20readerICs_ds_eng.pdf

Que nous apporte ce datasheet ? Plein de chose !

reverse_mifare-5-datasheet_fm1702

reverse_mifare-5-datasheet_fm1702-bis

1) Un brochage complet !

reverse_mifare-5-datasheet_fm1702-app

2) Une note d’application très intéressante !

reverse_mifare-5-datasheet_fm1702-code

3) Une information essentielle : le module en version "SL" ne travaille qu’en SPI.

Et pour "ATMEGA8A" ?

Là rien de bien spécial, les datasheets des microcontrôleurs AVR sont disponibles sur le site d’ATMEL :
http://www.atmel.com/devices/ATMEGA8A.aspx
http://www.atmel.com/images/atmel-8159-8-bit-avr-microcontroller-atmega8a_datasheet.pdf

En tant qu’utilisateur récurrent d’AVR j’avais d’or et déjà le datasheet de l’ATmega8A dans mon dossier de datasheet. :)

Une chose reste cependant étonnante, on trouve plein d’informations sur google mais rien sur le site du fabricant !
En réalité en cherchant un peu on trouve tout ce que l’on souhaite, l’ami Google n’avait manifestement pas tout indexé ;)

On découvre par exemple qu’il existe deux versions du même module : une version avec antenne externe et une version avec antenne intégré :
http://www.ehuoyan.com/english/products.asp?pid=28&id=164
http://www.ehuoyan.com/english/products.asp?pid=28&id=165

On remarque alors que le même brochage est utilisé pour les deux versions, en réalité il s’agit du même circuit de base au centre !
Les 6 condensateurs sur le côté de la seconde version font donc parti de l’antenne. Ce qui n’est pas sans rappeler le schéma de la note d’application du FM1702.

Au passage on retrouve les datasheets détaillés découvert plus tôt :
http://www.ehuoyan.com/download/module//DS_YHY502CG_en.pdf
http://www.ehuoyan.com/download/module//DS_YHY502CTGV33.pdf

Ceux ci apportent quelques informations mais rien de bien intéressant concernant la partie matérielle.
On gardera juste de côté le brochage des deux connecteurs J1 et J2 pour plus tard.
Le reste des informations d’utilisation "standard" nous ne intéresse pas (à quoi bon connaitre le protocole utilisé puisse que l’on veut faire tourner un code maison ?).

YHY502C2PCPORT

En demandant au vendeur Ebay j’ai aussi pu avoir un schéma de câblage pour la partie série.
Celui-ci ne semble pas bien intéressant mais en réalité il est d’une importance CAPITALE !

Vous n’avez rien remarqué ?
Regardez bien, ce schéma donne le pinout réel du connecteur J1 et J2, faisant apparaitre une possibilité de communication série, I2C et SPI sur les même broches !
Plus tard vous découvrirez qu’il s’agit aussi du connecteur de programmation, pas mal pour une simple image pixelisée ?

sdk_codes

J’ai aussi pu me procurer une copie du SDK constructeur (toujours via le vendeur Ebay) mais je ne peut pas vous en donner une copie.
Ne vous inquiétez pas ce SDK ne m’est d’aucune utilité, il contient uniquement du code pour la partie série et utilise le protocole disponible dans les datasheets ci dessus.

Pffff, voila qui conclut cette première étape !

Étape 2 : pré-requis

Avant de commencer la partie marante de cet article vous aurez besoin :
– de Paint.net, un paint en bien mieux qui gère plein de truc comme les calques
– d’un appareil photo et d’éclairage (si vous voulez faire votre propre reverse engineering)
– d’un bac + 8 en dessin (non je rigole, bac + 10 minimum :))

Une fois que vous avez lancé Paint.net faite une nouvelle image et créé les calques suivant :

calques

BOT -> face du dessous
TOP -> face du dessus

*_SLK -> pour les annotations du circuit
*_TRACE -> pour les pistes du circuit
*_SYM -> pour les symboles des composants
VIA -> pour les vias

Remarque : respectez l’ordre des calques, j’ai pensé le truc pour que ce soit facile d’utilisation ;)

Étape 3 : Dites cheeeeeeese !

Avant de pouvoir faire quoi que ce soit il faut des photos "à plat" et en bonne résolution des deux côtés de la carte.
Si vous avez comme moi fabriqué votre ligthbox maison pas de probléme, sinon un scanner fait très bien l’affaire.

DSCF2047

Attention !
Pour pouvoir faire un travail correct il faut que les composants pouvant gêner à la reconstitution du tracé des pistes soit enlevés.
Fait donc chauffer la station de dessoudage à air chaud ;)

Voici le résultat :

DSCF2040

DSCF2044

Remarque : si par transparence vous voyez des pistes à l’intérieur du pcb, ou que vous avez un texte du style "1 BOTTOM" et "4 TOP" (par exemple) sur un côté c’est que le circuit en question est "multi-couche". Faire de la rétro-ingénierie sur un circuit à plus de deux couches est impossible sans un matériel adapté.

Étape 4 : Les vias

Après avoir chargé les deux images dans les calques TOP et BOT tout est prés pour pouvoir commencer !

reverse_mifare-2-via

La première étape consiste à repérer et marquer l’emplacement des via.
Cela nous permettra de connaitre les relations entre les deux couches du circuit et d’aligner les deux images de base.
Rien de bien compliqué 1 via = 1 point (à placer dans le calque VIA, on travaille proprement hein ;)).

reverse_mifare-2-via-bis

Une fois tout les via marqués on affiche l’autre côté et on ajuste l’image pour que les vias coïncides avec les marques.

Étape 5 : Les composants

reverse_mifare-3-bot_sym

Maintenant que les vias sont marqués il faut placer les composants sur les calques *_SYM !

reverse_mifare-3-top_sym

… des deux côtés bien sûr ;)

Astuce : pour avoir des symboles de composants en super bonne résolution : wikipedia !
http://fr.wikipedia.org/wiki/Symbole_électronique

Étape 6 : Les annotations

Elles ne sont pas forcément utiles mais j’aime bien les ajouter dans un calque dédié (*_SLK, "SLK" pour "Silk Screen" = sérigraphie).

reverse_mifare-3-bot_slk

reverse_mifare-3-top_slk

Étape 7 : Les pistes

C’est l’étape la plus marrante du truc :)
Prenez l’outil trait, une couleur pour chaque côté et suivez les pistes !

reverse_mifare-3-bot_traces

reverse_mifare-3-top_traces

C’est déjà la classe vous trouvez pas ?

Étape 8 : Inspection

reverse_mifare-3-top_all

reverse_mifare-3-bot_all

Jouez avec les calques, cachez certain, affichez d’autre et regardez si tout coïncide avec le circuit.
Faite bien attention aux petites pistes entre les pattes d’un CI par exemple, ce genre de chose.

reverse_mifare-4-topbot-bis

reverse_mifare-4-topbot

Bon ok avec tout les calques affichés c’est du grand n’importe quoi :)

Le fichier Paint.net est disponible ici pour les curieux :
https://dl.dropboxusercontent.com/u/53604363/reverse_mifare.pdn
Attention : fichier de plus de 40Mo

Étape 9 : Le casse tête

Vous avez surement deviné ce qu’est l’étape 9 …
Et oui c’est la partie pas marrante du tout : le dessin du schéma à partir des calques ci dessus.
Une bloc de papier, un stylo et de la patience, c’est tout ce qu’il vous faut mais c’est chiant.

DSCF2063

J’ai commencé par faire une carte des broches de chaque CI, le but ici est de savoir quelles broches sont ou non utilisées.

DSCF2066

DSCF2068

DSCF2069

Ensuite c’est une histoire de patience … piste par piste, composant par composant.

DSCF2071

Et maintenant ?
Et bien maintenant on peut dire que le schéma est fini !
On sait comment est câblé la carte, il ne reste plus qu’a faire un nouveau firmware, mais ce sera pour un autre article :)

Remarque : j’ai volontairement oublié les annotations/valeurs des composants sur mes schémas pour ne pas me faire engueuler par le fabricant.
Mieux vaut être trop prudent que pas assez.

Et la rétro-ingénierie logicielle ?

Ben ouai t’avais dis qu’on ferait des knackis du software !
Oui c’est vrai, mais cet article est déjà super long donc je vais rester superficiel ;)

Comme on peut le voir sur le schéma (maintenant qu’on en a un) le connecteur J1 peut aussi servir de port de programmation ICSP pour le microcontrôleur AVR.
Branchons donc un programmateur d’AVR pour voir ce qu’il se passe ;)

DSCF2060

Déjà regardons les fusibles avec la commande :

avrdude -c usbtiny -p m8 -U lfuse:r:lfuse.txt:r -U hfuse:r:hfuse.txt:r

Résultat : lfuse = 0xaf et hfuse = 0xd9

Un petit coup de calculette en ligne : http://www.engbedded.com/fusecalc

fuses_values

-> quartz externe (normal)
-> reset en cas de chute de tension (brown-out)
-> pas de bootloader
-> programmation ISCP active (youpi !)
-> broche "reset" active (double youpi !)
-> pas de watch-dog hardware par défaut

Et le "lock" (fusible qui permet de savoir si on peut lire ou non le contenu de la mémoire) ?

avrdude -c usbtiny -p m8 -U lock:r:lock.txt:r

Résultat : 0x00

AUCUN LOCK ACTIF !
Cela signifie que l’on peut lire le programme en mémoire pour analyse !

Remarque : c’est la première fois en 3 ans que je vois un produit commercial avec une mémoire programme non verrouillée …
Dans 99.999999% des cas la mémoire est normalement verrouillée et toute tentative de lecture efface le contenu de la dite mémoire.
C’est donc une énorme surprise pour moi de voir ça !

Lisons donc le contenu de la mémoire pour voir ce qu’il y a dedans :

avrdude -c usbtiny -p m8 -U flash:r:dump.hex:i

hex_file

BINGO !

Transformons le tout en langage assembleur :

avr-objdump -j .sec1 -d -m avr5 dump.hex > dump.asm

asm_file

EPIC WIN !

J’ai rapidement regardé le code assembleur (je compte faire mon propre firmware 100% à la main, celui d’origine ne m’intéresse donc pas plus que ça).
J’ai pu voir la partie de code gérant le port SPI software sur les broches ADC0-3. De même qu’un gros switch-case surement pour la gestion du protocole série, switch-case traduit en assembleur par un tableau de jump, signe que le firmware d’origine a été (probablement) codé en C puis compilé avec AVR-GCC ou autre.

Annexe : est-ce que ça marche ?

J’ai démonté les circuits, puis remonté les circuits, fait des dizaines de tests sur les pistes, …
On est donc en droit de se demander si la carte marche toujours âpres tout ces mauvais traitement ?

setings

test_lecture

Et bien oui ne vous inquiétez pas la carte marche toujours très bien.
Comme quoi je travaille pas totalement comme un porc hein ;)

Bon WE à tous et bon bidouillage !

PS: c’est le plus long article jamais publié sur mon blog … champagne !

Discussion

8 réflexions sur “[Tuto/Hack] La rétro-ingénierie c’est la vie

  1. Excellent !!!! Comme d’habitude (250 articles ! )

    Publié par sscapa | 10 novembre 2013, 20 h 59 min
  2. Belle démo de relevé de schéma. J’ai fait pareil récemment, mais avec inkscape, et un autre soft pour redresser des images prises "de travers".

    Sinon, je vois pas trop où se situe le reverse là. Tu as trouvé le datasheet complet du chip avec son pinout, qui au passage sait faire mieux que mifare (ISO14443-A, donc plein de cartes sans contact), le cpu est un atmel dont tu peux changer la source, mais dont t’as aussi la description complète du protocole… t’as une note d’application, ‘fin bref!

    pour info tu vas être déçu, toute la crypto mifare est faite en hardware dans le module (commandes load key et authent, page 11 du datasheet).

    (après 5 min)

    Tu dois vraiment lurk moar, en cherchant 5 minutes la réf du chip je viens de remarquer que c’est un clone/repackaging du MFRC530 fabriqué par NXP, il a le même pinout en SO32, le même jeu de commandes, et NXP te file en prime le jeu de registres complet ici: http://www.nxp.com/documents/data_sheet/057432.pdf

    Comment j’ai fait? en cherchant "FM1702SL" dans google, je suis tombé sur ce truc qui semble inutile ( http://www.datasheetarchive.com/FM1702SL/Datasheets-UD7/DSARS005917.html ), j’ai bien lu le titre et j’ai lu "RC530" qui est un des chips NFC de NXP. En cherchant ensuite "RC530 command set" j’ai trouvé le datasheet avec commandes.

    Sachant que Crypto1 est déja reversé, si j’étais toi, je chercherais des trucs plus intéressants, ce qui peut se faire plus tard, le RC53x de NXP est un bon chip pour lequel tu trouveras probablement des implémentations, ce qui te permettra de te familliariser avec ce chip utile pour des recherches ultérieures. Et si libnfc ne le supporte pas (encore) je suis sûr que faire un driver de ce chip pour libnfc sera quelque chose de très bon.

    en 2 mots, une bonne trouvaille ce lecteur, et un bon tuto reverse PCB et très bien fait.

    Publié par f4grx | 10 novembre 2013, 22 h 32 min
    • >> Sinon, je vois pas trop où se situe le reverse là.

      Toute les doc sont disponibles c’est vrai, c’était un coup de chance calculé (j’ai pas choisi ce lecteur pour rien ;)).
      Même si ça en devient ultra simple c’est une bonne chose, ça permet de comprendre le principe.
      Si j’étais parti sur un truc chinois avec un cpu compatible 8051 sans marque mon article serait devenu indigeste.

      >> qui au passage sait faire mieux que mifare (ISO14443-A, donc plein de cartes sans contact)

      Pareil c’était calculé, j’ai demandé au vendeur avant d’acheter d’avoir la doc complète.
      En réalité j’ai même le code source d’une partie du firmware d’origine (en chinois), mais ça je suis pas sensé le dire :)

      >> pour info tu vas être déçu, toute la crypto mifare est faite en hardware dans le module (commandes load key et authent, page 11 du datasheet).

      Non pas vraiment, implémenter Crypto1 … non merci, c’est pas plus mal que la crypto "M1" (jolie esquive de licence !) soit hardware.

      >> je viens de remarquer que c’est un clone/repackaging du MFRC530 fabriqué par NXP

      Pas que du RC530.
      C’est un clone "compatible" des chipsets RC500, RC530, RC531 et RC632 de Philips.
      J’en parle pas parce que c’est plus du software et que je compte mettre ça dans un article dédié ;)

      Publié par skywodd | 10 novembre 2013, 22 h 46 min
  3. Si ça t’intéresse, j’ai vu il y a quelque temps une vidéo (http://www.youtube.com/watch?v=YD7UY0CBvnY) présentant (entre autres) un outil permettant d’aider au reverse de PCB : DePCB (http://events.ccc.de/congress/2010/wiki/Embedded_Analysis#DePCB_Analysis).
    Je ne sais pas ce que cela vaut par contre, je n’ai jamais testé.

    Publié par Key | 11 novembre 2013, 4 h 18 min
  4. Mais t’es un vrai hacker enfaîte :O ! Mec, chapeau !

    Publié par Kiff-python | 2 décembre 2013, 20 h 58 min
  5. Chapeau ! Super intéressant. Curieux de lire la suite

    Publié par Flo | 23 février 2014, 17 h 02 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Archives

Wow. Dogecoin. Amaze.

Laissez un tip en Dogecoin

DMMNFk6WBVTpx2Wu1Z35GL61QXSd6r6WQx

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 725 autres abonnés