Skyduino:~#
Articles
arduino, pic ccs, programmation, projet

Spoofer RFID

Voila encore un projet qui touche à ça fin !
Cette fois j’ai le plaisir de vous montrez mon spoofer rfid !

Un quoi ?!
Un spoofer rfid !
Le but d’un tel circuit est simple, grâce à un quelque composants rudimentaire et le programme qui va bien mon système va être en mesure de faire croire à un lecteur rfid que la carte qu’il lit est valide.
Dis d’une autre manière cela revient (en gros) à faire un émulateur de carte RFID.

Le but:
On rentre le code souhaité  et hop par magie il s’agit bien de la bonne carte !
Je n’émule pas n’importe qu’elle type de carte mais uniquement un type bien précis: les tag rfid 125KHz (à base EM4100).

Video de démonstration :

Site avec plein d’info sur le RFID (et plus particulièrement sur les spoofer/cloner rfid) :
http://proxclone.com

Le protocol de la puce EM4100 :
http://www.priority1design.com.au/em4100_protocol.html

La base de ce projet :
http://hackaday.com/2010/11/28/rfid-spoofer-with-code-and-instructions/

Le Sketch arduino :

#define coil_pin 12

char data[10];
int data_count =0;

/* 9bit HEADER *//* ID *//* ID *//*                      DATA 32bits + 8 bits parity                                 *//* CRC */
int spoofed_card[64] = {
  1,1,1,1,1,1,1,1,1, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 0,0,0,0,0};
/*                   D0              D8 D9    D13 D14    D18  D19   D23 D24    D28  D29   D33 D34     D38 D39   D43 D44    D48  D49   D53 D54    D58  D59   D63*/

void setup()
{
  pinMode(coil_pin, OUTPUT);
  digitalWrite(coil_pin, LOW);

  Serial.begin(9600);
}

void loop()
{
  if(Serial.available()){
    char key = Serial.read();
    if(key != '\0') {
      data[data_count] = key;
      if(data_count == 9){
        spoofcard();
        data_count = 0;
      }  
      else{
        data_count ++;
      }
    }
  }
}

void compute_data(){

  // Compute raw data
  int data_iterator = 0;
  for(int a =0;a<59;a+=5){
    int raw_data = HexToDec(data[data_iterator]);
    spoofed_card[a+9] = bitRead(raw_data,3);
    spoofed_card[a+10] = bitRead(raw_data,2);
    spoofed_card[a+11] = bitRead(raw_data,1);
    spoofed_card[a+12] = bitRead(raw_data,0);
    data_iterator++;
  }

  int bit_set = 0;
  int i = 8;

  // CRC ROW
  for(int c=3;c<13;c++){
    for(i++;i<((c*5)-2);i++)
      if(spoofed_card[i] == 1) bit_set++;
    if((bit_set % 2) != 0) spoofed_card[(c*5)-2] = 1; 
    else spoofed_card[(c*5)-2] = 0;
    bit_set = 0;
  }

  // CRC COL
  bit_set = 0;
  for(int c = 0;c<4;c++){
    for(int a = 9;a<55;a+=5){
      if(spoofed_card[a+c] == 1) bit_set++;
    }
    if((bit_set % 2) != 0) spoofed_card[c + 59] = 1; 
    else spoofed_card[c + 59] = 0;
    bit_set = 0;
  }
}

void spoofcard(){

  compute_data();

  for(int h = 0;h<50;h++)
    spoofnow();
}

void send_manchester(int clock_half, int signal)
{
  int man_encoded = clock_half ^ signal;

  if(man_encoded == 1)
  {
    digitalWrite(coil_pin, LOW);
  }
  else
  {
    digitalWrite(coil_pin, HIGH);
  }
}

void spoofnow(){
  for(int i = 0; i < 64; i++)
  {
    send_manchester(0, spoofed_card[i]);
    delayMicroseconds(256);

    send_manchester(1, spoofed_card[i]);
    delayMicroseconds(256); 
  }

}

int HexToDec(char hexa)
{
  switch(hexa){
  case '0':
    return 0;
    break;
  case '1':
    return 1;
    break;
  case '2':
    return 2;
    break;
  case '3':
    return 3;
    break;
  case '4':
    return 4;
    break;
  case '5':
    return 5;
    break;
  case '6':
    return 6;
    break;
  case '7':
    return 7;
    break;
  case '8':
    return 8;
    break;
  case '9':
    return 9;
    break;
  case 'A':
    return 10;
    break;
  case 'B':
    return 11;
    break;
  case 'C':
    return 12;
    break;
  case 'D':
    return 13;
    break;
  case 'E':
    return 14;
    break;
  case 'F':
    return 15;
    break;
  }
}

ZIP Contenant toute les versions possible du projet, utilisez dans la vidéo ci dessous :
Lien google document

Ce même projet réalisé par chemiselastic23

Photo :

Version pour Pic 16F877A (compilateur CCS) :

#include "C:\PICC\Devices\16F877A.h"

#fuses NOWDT,XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

#define coil_pin PIN_B5

//#define bitRead(value, bit) (((value) >> (bit)) & 0x01)

int8 data[10] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 }; // spoofed hexa tag here

/* 9bit HEADER *//* ID *//* ID *//*                      DATA 32bits + 8 bits parity                                 *//* CRC */
int1 spoofed_card[64] = {
  1,1,1,1,1,1,1,1,1, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 1,1,1,1,0 ,1,1,1,1,0, 0,0,0,0,0};

void spoofcard();
int HexToDec(char hexa);

#inline int bitRead(int value, int index){
	return ((value >> index) & 0x01);
} 

#inline
void send_manchester(int clock_half, int signal)
{
  int man_encoded = clock_half ^ signal;

  if(man_encoded == 1)
  {
    output_low(coil_pin);
  }
  else
  {
    output_high(coil_pin);
  }
}

#inline
void spoofnow(){
  int i;
  for(i = 0; i < 64; i++)
  {
    send_manchester(0, spoofed_card[i]);
    delay_us(256);

    send_manchester(1, spoofed_card[i]);
    delay_us(256); 
  }
}

void spoofcard(){

  // Compute raw data
  int data_iterator = 0;
  int a;
  int raw_data;
  for(a =0;a<59;a+=5){
    raw_data = data[data_iterator];
    spoofed_card[a+9] = bitRead(raw_data,3);
    spoofed_card[a+10] = bitRead(raw_data,2);
    spoofed_card[a+11] = bitRead(raw_data,1);
    spoofed_card[a+12] = bitRead(raw_data,0);
    data_iterator++;
  }

  int bitset = 0;
  int i = 8;

  // CRC ROW
  int c;
  for(c=3;c<13;c++){
    for(i++;i<((c*5)-2);i++)
      if(spoofed_card[i] == 1) bitset++;
    if((bitset % 2) != 0) spoofed_card[(c*5)-2] = 1; 
    else spoofed_card[(c*5)-2] = 0;
    bitset = 0;
  }

  // CRC COL
  bitset = 0;
  for(c = 0;c<4;c++){
    for(a = 9;a<55;a+=5){
      if(spoofed_card[a+c] == 1) bitset++;
    }
    if((bitset % 2) != 0) spoofed_card[c + 59] = 1; 
    else spoofed_card[c + 59] = 0;
    bitset = 0;
  }  
}

void main()
{
  set_tris_b(0);
  output_low(coil_pin);

  spoofcard();

  while(1){
	spoofnow();
  }
}
Publicités

Discussion

18 réflexions sur “Spoofer RFID

  1. Bonjour,
    je sais que le projet date de juin, mais est-il possible d’avoir plus d’infos sur les composants et le câblage ?

    Merci

    Publié par Gnome | 19 octobre 2011, 16 h 01 min
  2. oui, désolé, je me suis rendu compte que je demandais une connerie
    😉

    je vais essayer de me lancer dans l’expérience, même si je n’y comprends pas grand chose, mais la vidéo semble bien tout expliquer

    merci pour tout

    Publié par Gnome | 20 octobre 2011, 10 h 44 min
  3. Tres bon projet, Merci pour les informations, je voulez juste savoir c’est je peux cloner une carte RFID Avec Lecteur/Graveur RFID RS232 13.56 Mhz.

    Merci par avance

    Publié par Sam | 18 novembre 2011, 15 h 10 min
    • Les cartes RFID à 13.56MHz ne sont pas clonable avec mon systéme, il ne marche qu’avec les cartes rfid 125KHz basé sur la puce EM4100.

      Pour cloner des tag RFID Mifare (13.56MHz) il faudrait un module RFID Mifare NFC qui est capable de ce faire passer pour une carte « simple » mais je ne sais pas si les cartes mifare classique et les NFC sont compatible …

      Edit: Cette carte peut cloner des tag RFID NFC, pour les tag Mifare classique je ne sait pas …
      http://www.adafruit.com/products/364

      Publié par skywodd | 18 novembre 2011, 19 h 30 min
  4. Décidément je retombe souvent sur ce site lors de mes recherches google !
    Good job…mais pour moi ça coince..Aïe !
    Ce qui fonctionne :
    – la lecture des cartes rfid de parallax avec le reader (bleu) de parallax.
    – la saisie au keypad I²C (affichage sur Serial car plus de lcd de dispo pour le moment)
    Ce qui coince:
    – La lecture via le spoofer
    Quelques photos du montage sur: http://www.arpege-studio.com/rfid
    Pour info:
    – Env: Arduino 1.0 et carte Uno
    – Lors de la phase de spoof, je mesure 2.52V entre D9 et le Gnd.

    Si tu as une idée…merci.
    Vince

    Publié par Vince | 5 avril 2012, 0 h 47 min
    • >> Décidément je retombe souvent sur ce site lors de mes recherches google !
      Héhé Pour tout ce qui est arduino j’ai un bon ranking google 🙂

      >> Ce qui coince:
      >> – La lecture via le spoofer
      Il n’est pas possible de lire un tag avec le spoofer, juste d’en émuler un.
      (question de tournure de phrase je pense)

      >> Si tu as une idée…merci.
      D’après les photos de ton montage tu semble avoir oublié le condensateur de 1nF en parallèle de la self ?
      Sinon bien vérifier que la self fait 1.62mH, que le condensateur fait bien 1nF, que les diodes sont des 1N4148, et que la zener fait bien 4.7v.
      Normalement sa marche relativement facilement si le câblage est respecté.

      Publié par skywodd | 5 avril 2012, 12 h 58 min
      • Salut Skywodd,

        et bien comme la dernière fois, problème de câblage ! Un point de soudure manquant et rien ne marche…comme quoi, passé 1h00 du matin les yeux voient trouble !

        Par ailleurs, j’ai pu expérimenter avec succès une autre solution technique fonctionnant avec une self, une résistance de 10K, un condensateur et un transistor NPN.

        Mon Kit Velleman VM179 se fait spoofer !
        @Bientôt très certainement :-))

        Publié par Vince | 6 avril 2012, 19 h 39 min
  5. Tres belle demonstration de genie
    tres interessant et surtout asssez light
    je testerai
    a plus

    Publié par menoret | 30 août 2012, 22 h 20 min
  6. Bonjour,
    Très intéressé par ce projet.
    Néanmoins serait il possible de dupliquer une carte RFID de parking?
    A bientôt

    Publié par Raphael | 6 novembre 2012, 17 h 20 min
  7. Salut si possible j’ai des difficultés pour fabriquer la bobine
    Alors, tu peux me dire le nombre de Spires, la longueur de bobine et aussi le diametre de son support et mercu

    Publié par knaz | 21 mai 2013, 15 h 39 min
  8. merci bcp

    Publié par knaz | 22 mai 2013, 15 h 14 min
  9. existe il des cartes rfid que l’on peux programmer autant de fois que l’on veux?

    Publié par nico | 25 mai 2013, 22 h 06 min

Rétroliens/Pings

  1. Pingback: RFID Spoofer | tosch production - 5 août 2013

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

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.