RFID-Emulator

EM Marine Kartenemulator





Sicherlich war jeder von uns, der jemals in normalen Büros war, daran interessiert, wie diese kontaktlosen Ausweise funktionieren. In diesem Artikel werden wir uns mit dem Funktionsprinzip kontaktloser Karten befassen und einen Emulator aus buchstäblich drei Funkkomponenten herstellen.



RFID-Technologie





Das Auftreten von RFID-Tags



RFID (English Radio Frequency IDentification, Radio Frequency Identification) - hat einen ziemlich breiten Frequenzbereich und eine ziemlich große Anzahl verschiedener Standards, die irgendwie auf diese Technologie anwendbar sind. Als Referenz: Die verwendeten Frequenzen sind: 125-135 kHz, 400 kHz, 6,78 MHz, 13,56 MHz (U-Bahn-Karten und Bankkarten), 27,125 MHz, 40,68 MHz, 433,29 MHz, 869 MHz, 915 MHz, 2,45 GHz, 5,8 GHz und 24,125 GHz. Wie Sie sehen können, ist der Frequenzbereich sehr breit.



Wir werden über die am weitesten verbreiteten und am wenigsten geschützten Karten des 125-kHz-Frequenzbereichs sprechen. Ich werde den EM Marine 4102-Standard analysieren, da mir dies am besten bekannt ist. Mit dem Emulatorcode können Sie jedoch mit anderen Standards arbeiten, die mit 125 kHz arbeiten.



Damit wir uns weiter mit der Theorie befassen können, sollten einige Worte darüber gesagt werden, wie RFID funktioniert. Weiter im Text werden Informationen zum 125-kHz-EM-Marine-Standard gegeben, andere RFID-Lösungen sind auf ähnliche Weise angeordnet.





Der Leser liefert neben dem Informationsaustausch auch Strom. Das Tag ist ein ROM, das von einem elektromagnetischen Feld gespeist wird und nach dem Anlegen der Stromversorgung einfach die aufgezeichneten Informationen liefert.





Dieses Diagramm zeigt deutlich, wie Sender und Empfänger angeordnet sind. Beide Schwingkreise sind auf Resonanz abgestimmt und werden zur Datenübertragung und Energieübertragung sowie zur Stromversorgung eines passiven Tags verwendet, das unsere Karte ist.



Weitere Details zum Funktionsprinzip finden Sie in [1]





Die Innenseiten der zerlegten Karte



Wenn Sie die Karte zerlegen, sehen Sie eine Antenne in Form einer Spule und eines Chips, die mit einer Verbindung gefüllt sind, die einen ROM und einen 75 pF-Kondensator enthält.



Beschreibung des EM4102-Protokolls



Bevor wir weiter gehen, wollen wir den EM4102-Standard verstehen, den wir emulieren werden. Das EM4102-kompatible RFID-Tag enthält 64 Bit Nur-Lese-Speicher. In der Tat ist dies das ROM, dh Informationen können daraus gelesen, aber nicht geändert oder geschrieben werden, mit anderen Worten, dieser Chip wird im Werk einmal zusammengenäht. Die Speicherstruktur des Tags ist in der folgenden Abbildung dargestellt.





Wenn das Tag in ein elektromagnetisches Feld eintritt, das von einem RFID-Lesegerät ausgesendet wird, empfängt es Energie vom Feld (Strom) und beginnt mit der Datenübertragung. Die ersten 9 Bits sind logisch. Diese Bits werden als Folge von Token verwendet, um den Beginn der Übertragung anzuzeigen. Da alle anderen Daten Parität verwenden, wird diese Neun-Bit-Folge von Einsen nirgendwo anders mehr auftreten. Dann gibt es 10 Gruppen mit 4 Datenbits und 1 Paritätsbit für jede Gruppe. Schließlich gibt es 4 Bits der Prüfsumme und das letzte Stoppbit, das immer Null ist.



Das Tag wiederholt den Datenübertragungszyklus, bis es mit Strom versorgt wird. Daher beobachten wir das ständige Lesen des Tags auf dem Reader.



Ich werde ein Beispiel für die vom Etikett übertragenen Daten mit der Nummer 0x06 gebenIst die Versionsnummer und 0x001259E3 sind die Daten.





Die auf der Karte aufgedruckte Nummer kann übrigens in eine Hex-Nummer übersetzt werden, die der Leser erhält. Zum Beispiel steht die Nummer auf der Karte: 116,23152



  • 116 in Dezimalschreibweise ist 0x74 in Hexadezimalschreibweise;
  • 23152 in Dezimalzahl ist 0x5A70 in Hex;


Durch die Kombination erhalten wir die Seriennummer der Karte, die der Leser uns gibt: 0x00745A70 .



Signalmodulation



Die Datenübertragung vom Tag zum Lesegerät erfolgt durch Modulation des Leseträgersignals (in unserem Fall beträgt die Trägerfrequenz 125 kHz). Bitte beachten Sie, dass diese Trägerfrequenz auch Strom liefert und das Signal moduliert. Betrachten wir zunächst ein vereinfachtes Interaktionsschema zwischen einem Leser und einem Tag. Denken Sie an dieses Bild, wir werden später darauf verweisen.





Wie Sie sehen können, verfügt das Tag über eine LC-Oszillationsschaltung, eine Diode, die zur Gleichrichtung des Wechselstroms dient, einen Kondensator zur Glättung der Welligkeit (dies ist Teil der Stromversorgung des Tags) und einen Transistor, durch dessen Steuerung wir das Signal modulieren können. Für den Leser spiegelt sich dies in einer Änderung des in der Spule fließenden Stroms wider. Einfach ausgedrückt, wenn das Etikett in das Feld des Lesegeräts eintritt, verbraucht es (ungefähr konstant) elektrischen Strom. Wenn es Informationen überträgt, ändert es den Wert des von einem Transistor verbrauchten Stroms und somit kann das Lesegerät durch Messen des Stromverbrauchs ein Signal empfangen.



Der Leser erzeugt mit einem Modulator und einer Spule ein Magnetfeld, nimmt das modulierte Signal auf und decodiert es dann.





Ein Beispiel für die Modulation eines Trägersignals



Wenn ich Sie nicht vollständig verwirrt habe, gehen wir weiter. Um Daten zu übertragen, müssen wir das Signal modulieren. Das heißt, es werden die Bits der übertragenen Informationen der Trägerfrequenz überlagert.



Es gibt drei beliebte Modulationsschemata gemäß dem RFID-Standard:



  • Manchester-Code
  • Zweiphasen-Manchester-Code
  • Phasenverschiebungscodierung


Da der EM4102-Standard das Manchester-Codierungsschema verwendet, werden wir dies berücksichtigen. Bei der Modulation für das EM4102-Protokoll kann die Übertragungszeit eines Bits 64, 32 oder 16 Perioden der Trägerfrequenz (125 kHz) betragen.





Bei dieser Codierung ändert die Markierung den Signalübertragungspegel genau in der Mitte der Übertragungsperiode von einem Bit. Der Übergang von einem niedrigen zu einem hohen Pegel in diesen Momenten bedeutet den Zustand der logischen "1", und der Übergang von einem hohen Pegel zu einem niedrigen Pegel repräsentiert den Zustand der logischen "0".





Reales moduliertes Signal, das auf der Spule des Lesegeräts erfasst wird.



Erstellen eines RFID-Emulators



Wenn Sie immer noch hier sind und Ihr Kopf durch solche Berechnungen nicht geschwollen ist, ist es Zeit, einen RFID-Emulator aus nur zwei Teilen herzustellen. In dieser Einfachheit liegt das Genie. Ich habe das Gerät zusammengebaut und die Idee und den Code von Micah Dowty ausgeliehen . Fotos gehören mir.





Hier ist eine solche Miniaturkakerlake, die möglicherweise das



Project-Site- Tag emuliert . Der Code ist sehr interessant, man könnte sagen brillant und lakonisch (Assembler wird verwendet). Lassen Sie uns im Detail darauf eingehen. Wir werden es analysieren. Sie können den Code hier sehen .



Lassen Sie uns zunächst herausfinden, wie dieses Ding im Allgemeinen funktioniert, obwohl es per Definition nicht funktionieren sollte, da es dem üblichen Schaltplan des Mikrocontrollers widerspricht. Das Gerätediagramm stammt aus dem Quellcode.





Eine Induktivitätsspule von ca. 1 μH und ein ATtiny85-Mikrocontroller



Dies, meine Damen und Herren, ist ein echtes Hacking, wenn Sie mit dem Verständnis der Merkmale des Gerätebetriebs technische Lösungen erstellen können, die über die vom Hersteller angegebenen Grenzen hinausgehen! Und es funktioniert, persönlich überprüft. Dies ist die wahre Bedeutung des Wortes "Hacker", es geht nicht um Hacking und Diebstahl.



Mit Blick auf die Zukunft werde ich sagen, dass diese Spule für den normalen Betrieb nicht ausreicht, und dennoch musste ich eine normale Antenne herstellen, die Stromversorgungskondensatoren aufhängen und einen Resonanzkondensator. Aber um die Prinzipien der Arbeit zu demonstrieren, ist es durchaus geeignet.

Wie funktioniert es:



  • AVR /. /, . , . , . , . , . , .
  • AVR. , , , ( 0,1 ). AVR. , , 125!
  • . ATtiny85 2,5 . 1,8 . AVR , ...
  • , ! , , . Clock ! 125 , RFID. , !
  • ? -, . . EM4102 32 . HID FSK 4 . RFID- . « » , RFID -.
Bevor wir den Code dieses Emulators analysieren, machen wir ihn zu einer normalen Antenne. Meine Experimente mit der Stromschaltung zeigten extreme Instabilität in ihrem Betrieb. Es funktioniert nur sehr nah am Leser und auch dann nicht immer. Daher habe ich zuerst einen 0,1-uF-Kondensator an die Leistungszweige des Controllers gelötet und dann beschlossen, einen wirklich großen Schwingkreis wie in einem echten Etikett herzustellen.





Die erste Modifikation ist ein 0,1 uF Kondensator für die Stromversorgung



Antennenerstellung



Es gibt keine Tricks beim Erstellen einer Spulenantenne, aber Sie müssen sich dennoch mit der Dokumentation vertraut machen und die Physik des Prozesses verstehen ... Es ist nicht schwierig, und selbst ein Schüler kann damit umgehen, nur ein wenig Geduld und Ausdauer sind erforderlich.



Es ist sehr einfach, die Antenne zusammenzubauen und zu konfigurieren, genau wie auf dem Bild aus [1] .





Um die Antenne zu berechnen, müssen Sie sich an eine kleine Theorie erinnern. Wir müssen eine oszillierende Schaltung herstellen, die auf eine Frequenz von 125 kHz abgestimmt wird. Lassen Sie uns den Kurs Theoretische Grundlagen der Elektrotechnik eröffnen und lesen, was ein Schwingkreis ist:

Eine oszillierende Schaltung, eine elektrische Schaltung, die eine Induktivität und einen Kondensator enthält, in dem elektrische Schwingungen angeregt werden können.




Paralleler Schwingkreis



Wenn Sie die gesamte Mathematik verlassen und zum Punkt gehen, hat der Schwingkreis einen Parameter wie die Resonanzfrequenz, die durch die Formel bestimmt wird.



f=12πLC



Wobei f die Schwingungsfrequenz ist, L die Induktivität der Spule ist, C die Kapazität des Kondensators ist.



In diesem Fall haben wir einen festen Parameter - die Frequenz, und wir können mit der Kapazität und der Induktivität spielen. Zur Berechnung der Spule verwenden wir das Dokument [2] . Jeder, der irgendwie Antennen für RFID-Tags (jeder Frequenz) herstellen wird, muss sich damit vertraut machen!

Viele Handwerker, sowohl für Leser als auch für Emulatoren (das Wesentliche ist nicht wichtig), stellen runde Spulen her. Sie sind einfacher zu zählen und herzustellen, haben jedoch einen erheblichen Nachteil: Ihre linearen Abmessungen sind größer als die der Karte. Ich möchte einen Induktor in Form eines Rechtecks ​​mit linearen Abmessungen herstellen, die kleiner als die Abmessungen einer Standardkarte sind, und damit das resultierende Gerät die Größe einer Standard-RFID-Karte hat. Infolgedessen wähle ich die Größe des zukünftigen Induktors praktisch genauso wie in der vorliegenden Marke, dh ungefähr 70 x 40 mm... Wenn Sie einen Kondensator von 10 nF wählen, sollte die Induktivität der Spule (aus der obigen Formel) 162 μH betragen. Schauen Sie sich nun die Dokumentation zur Berechnung einer rechteckigen Spule an. Zum Wickeln der Spule habe ich einen Draht mit einem Querschnitt von 0,2 mm gewählt. Infolgedessen öffnen wir den entsprechenden Abschnitt der Dokumentation, und die folgende herrliche Formel wird unseren Augen präsentiert.





Wie Sie sehen können, sind die Parameter für die Dicke und Breite der Spule unbekannt und variabel (sie liegen gegenüber der Drahtdicke von 0,2 mm), aber allgemeine Schätzungen ergaben eine Zahl von 42 Windungen. Es wäre möglich, mehrere Iterationen durchzuführen und eine einfache, genaue Berechnung durchzuführen, aber in unserem Fall reicht dies aus.



Danach ist es notwendig, einen Rahmen 70x40 mm zum Aufwickeln der Spule herzustellen . Ich habe es aus PCB gemacht und eine Spule darum gewickelt.





PCB-Rahmen







Wicklung und fertige Spule



Leider habe ich keinen Induktivitätsmesser, so dass ich mit der wissenschaftlichen Poke-Methode weiter vorgehen musste. Da ich wahrscheinlich einen Fehler in den Berechnungen und in der Anzahl der Windungen gemacht habe, als ich die Spule gewickelt habe, wie ich sie ungefähr und mit dem Auge gemacht habe, habe ich beschlossen, die Resonanzkapazität manuell auszuwählen. Dazu befestigte ich die Spule am Kartenleser, steckte ihre Enden in das Steckbrett („Matratze mit Löchern“) und begann, die Behälter nacheinander zu verbinden, während ich das Signal auf dem Oszilloskop registrierte.





Erste Schritte mit dem Resonanzkondensator



Zuerst habe ich den 10nF-Kondensator überprüft, der resonant sein sollte. Die Signalamplitude ist jedoch im Vergleich zur leeren Spule sofort gesunken. Dann nahm ich einen kleineren Kondensator. Und so ging ich durch die Kondensatoren, bis ich die Resonanz auffing. Somit betrug die Resonanzkapazität des Kondensators 3,2 nF.





Signal ohne Kondensator, leere Spule





10 nF Signal





1 nF, 2 nF





3 nF, 4 nF, 2,2 nF





3,2 nF



Es ist zu sehen, dass ich verschiedene Optionen ausprobiert habe, und es war klar, dass das Maximum irgendwo zwischen 3 und 4 nF liegt und das Ergebnis ein 3,2 nF-Kondensator war (bestehend aus zwei parallelen Kondensatoren). Das war's, unsere Rolle ist bereit für weitere Experimente.



Im Allgemeinen möchte ich darauf hinweisen, dass eine Spule im Allgemeinen in Form von Spuren auf einer Leiterplatte hergestellt werden kann, und bei einer kleinen Reihe von Produkten sollte dies erfolgen. Hier ist ein Beispiel für eine solche Karte bei 125 kHz von Alexander Guthmann . Leider ist die Seite praktisch gestorben und der Autor war lange nicht mehr in Kontakt, so dass wir nur mit meinen Fotos zufrieden sind. Wenn jemand helfen kann, es zu finden, wäre ich dankbar! Ich weiß nicht, was mit ihm passiert ist.





Somit ist es kein Problem, den Emulator sofort in Form einer Leiterplatte herzustellen. Ich denke, mit dem Handbuch [2] können Sie dies selbst berechnen, da ein vierzehnjähriger deutscher Schüler dies tun könnte.



Lassen Sie uns den Code durchgehen



Werfen wir einen kurzen Blick auf den Code, den Sie hier sehen können . Es gibt ein Beispiel für die Emulation von zwei Kartentypen. Ich werde nur den EM4102 analysieren.



Wie der Code sagt, müssen wir beim Flashen des Mikrocontrollers zunächst die Sicherungsbits auf den Wert lfuse auf 0xC0 flashen, damit der Controller von einem externen Generator getaktet wird. Ich mache Sie darauf aufmerksam, dass jedes Blinken des Controllers mit der Tatsache verbunden ist, dass es von einer externen Quelle getaktet werden muss, da wir Sicherungsbits mit der Erzeugung von einem externen Generator setzen!



Der gesamte Code basiert auf Makros. Ich möchte Sie daran erinnern, was Makros sind - ein Programm, das Code für die Kompilierung vorbereitet. Unser Programm besteht aus nur wenigen Assembler-Anweisungen: rjmp, call (2 Uhren), nop, ldi, out und ret (alle 1 Uhr)! Alles, der ganze Rest des Codes wird durch Makros gebildet, abhängig vom Seriennummernmakro (definieren). Die Besonderheit der Arbeit ist, dass wir genug normale Taktzyklen für die normale Arbeit haben. Versuchen Sie, etwas in 32 Taktzyklen zu tun, da die Sprunganweisungen im AVR-Controller 2 Taktzyklen benötigen. Daher wird der gesamte Code abhängig vom Personalausweis von Makros generiert.



#define FORMAT_IS_EM4102
#define EM4102_MFR_ID		0x12
#define EM4102_UNIQUE_ID	0x3456789A


Definieren Sie, welchen Kartentyp wir emulieren, und legen Sie ID-Karten fest. Dies ist das Hauptmakro, auf dessen Grundlage der Rest des Codes gebildet wird. Und, Tadam, seine Majestät-Makros.



    .macro	delay cycles
    .if \cycles > 1
    rjmp	.+0
    delay	(\cycles - 2)
    .elseif \cycles > 0
    nop
    delay	(\cycles - 1)
    .endif
    .endm


Verzögerungsmakro, nimmt als Eingabe die Anzahl der Verzögerungstaktzyklen. Ein ziemlich offensichtliches rekursives Makro, das die Verzögerung mit dem Befehl nop (keine Operation, 1 Taktzyklus) und dem Befehl rjmp. + 0 (Übergang zur nächsten Zeile, 2 Taktzyklen) ausführt. Indem Sie diese Befehle miteinander kombinieren, können Sie die Verzögerung der gewünschten Länge in Takten festlegen. Tatsächlich macht der Code nichts, er verschwendet nur Maschinenzeit.



Wenn Sie immer noch nachdenken, werde ich Ihr Gehirn komplett vergewaltigen, aber der Code ist so genial, dass Sie es aushalten müssen.



Rekursive Makrocodierung durch Manchester-Code.



    .macro	manchester bit, count=1
    .if		\count
    manchester (\bit >> 1), (\count - 1)
    .if		\bit & 1
    baseband_1
    baseband_0
    .else
    baseband_0
    baseband_1
    .endif
    .endif
    .endm

    .macro	stop_bit
    baseband_0
    baseband_1_last
    .endm


Eigentlich ist hier die gesamte Logik implementiert. Akzeptiert eine Bitmaske und einen Bitzähler als Eingabe. Wenn der Zähler nicht Null ist, rufen wir uns erneut auf und dekrementieren den Zähler (rekursives Makro, ja). Weiter im Körper selbst gibt es Aufrufe der Makros baseband_0, baseband_1 und baseband_1_last. Je nachdem, welches Bit wir "1" oder "0" haben, modulieren wir das Manchester-Codesignal von Null auf Eins oder von Eins auf Null.



Denken Sie daran, dass ich oben im Artikel eine Tabelle angegeben habe, wie der Inhalt der Karte codiert ist, wohin die Paritätsbits gehen und die Stoppbits am Ende. Unsere Aufgabe ist es nun, ID-Tags mit dieser Methode zu codieren. Dafür haben wir zwei Makros.



#define ROW_PARITY(n)  ( (((n) & 0xF) << 1) | \
                         (((n) ^ ((n) >> 1) ^ ((n) >> 2) ^ ((n) >> 3)) & 1) )

#define COLUMN_PARITY  ( (EM4102_MFR_ID >> 4) ^        \
                         (EM4102_MFR_ID) ^             \
                         (EM4102_UNIQUE_ID >> 28) ^    \
                         (EM4102_UNIQUE_ID >> 24) ^    \
                         (EM4102_UNIQUE_ID >> 20) ^    \
                         (EM4102_UNIQUE_ID >> 16) ^    \
                         (EM4102_UNIQUE_ID >> 12) ^    \
                         (EM4102_UNIQUE_ID >> 8) ^     \
                         (EM4102_UNIQUE_ID >> 4) ^     \
                         (EM4102_UNIQUE_ID) )


ROW_PARITY - Berechnung des Paritätsbits in einer Vier-Bit-Zeichenfolge, COLUMN_PARITY - Berechnung der Prüfsumme der gesamten Nachricht.



Die gesamte Logik unserer Arbeit wird in einem Makro in .main beschrieben



        header
        manchester	ROW_PARITY(EM4102_MFR_ID >> 4), 5
        manchester	ROW_PARITY(EM4102_MFR_ID >> 0), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 28), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 24), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 20), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 16), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 12), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 8), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 4), 5
        manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 0), 5
        manchester	COLUMN_PARITY, 4
        stop_bit


Nun, das heißt, wir übertragen einfach die Header 9 Bits auf die gleiche Weise, dann die Manchester-Codierung, wobei das Paritätsbit für jeweils 4 Bits berechnet wird, am Ende eine Prüfsumme und ein Stoppbit.



Es bleibt abzuwarten, was das Basisband ist. Dafür haben wir noch ein Wrapper-Makro (ja, wie viele sind möglich, oder?).



        .macro baseband_0
        rcall	baseband30_0
        rjmp	.+0
        .endm

        .macro baseband_1
        rcall	baseband30_1
        rjmp	.+0
        .endm
        
        .macro baseband_1_last
        rcall	baseband30_1
        rjmp	main
        .endm

        .macro header
        manchester 0x1FF, 9
        .endm


Basisband * -Makros - Assembler-Code ausführen: Rufen Sie die entsprechenden Funktionen auf und wechseln Sie dann zu einer anderen Anweisung. Das Makro baseband_1_last ähnelt dem Makro baseband_1, außer dass es einen bedingungslosen Sprung nicht zum folgenden Befehl, sondern zum Anfang der Hauptfunktion macht. Makro-Header - dient zur Anzeige des Headers von neun Bits desselben Typs gleich eins und ruft das Manchester-Makro mit der Übertragung der Anzahl und Anzahl der übertragenen Bits auf.



Das letzte, was noch analysiert werden muss, sind die Funktionen baseband30_0 und baseband30_1. Sie werden durch den folgenden Code beschrieben.



baseband30_0:
        ldi	r16, OUT_PINS		// 1
        rjmp	baseband30		// 2

        /*
         * Emit a 1 at the baseband layer.
         * Takes a total of 30 clock cycles, including call overhead.
         */
baseband30_1:
        ldi	r16, 0			// 1
        rjmp	baseband30		// 2
        
        /*
         * Internal routine for baseband32_0 and _1. Must use
         * a total of 24 clock cycles. (32 - 1 ldi - 2 rjmp - 3 rcall)
         */ 
baseband30:
        out	_SFR_IO_ADDR(DDRB), r16		// 1
        delay	19				// 19
        ret					// 4


Abhängig davon, welche Funktion als Basisband30_0 oder Basisband30_1 bezeichnet wird, wird der Wert dessen, was auf dem E / A-Pin sein soll, in das Register r16: 1 oder 0 geschrieben. Danach erfolgt ein bedingungsloser Übergang zum Basisband30, die Ausgabe erfolgt und eine Verzögerung von 19 Taktzyklen, wonach eine Rückkehr erfolgt.



Die größte Magie dieses Codes besteht darin, dass er genau vor jedem Taktzyklus berechnet wird. Jeder Übertragungstakt des Manchester-Codes dauert genau so viele Zeiträume, wie es der Standard zulässt, nämlich 32 Prozessortaktzyklen! Das ist fantastisch genial, man muss sich merken, wie viele Takte jeder Befehl benötigt.



Lassen Sie es uns lieber kompilieren und sehen, wie es aussieht und wie sich all diese Makros erweitern. Wir kompilieren mit dem Befehl make (nach der Installation von avr-gcc) und zerlegen die resultierende Elf-Datei



00000000 __vectors:
   0:	0e c0       	rjmp	.+28     	; 0x1e __ctors_end
   2:	15 c0       	rjmp	.+42     	; 0x2e __bad_interrupt
...


Erstens haben wir Interruptvektoren, aber wir interessieren uns nur für den ersten Sprung. Da der Rest der Vektoren nirgendwohin führt.



0000001e __ctors_end:
  1e:	11 24       	eor	r1, r1
  20:	1f be       	out	0x3f, r1	; 63
  22:	cf e5       	ldi	r28, 0x5F	; 95
  24:	d2 e0       	ldi	r29, 0x02	; 2
  26:	de bf       	out	0x3e, r29	; 62
  28:	cd bf       	out	0x3d, r28	; 61
  2a:	02 d0       	rcall	.+4      	; 0x30 main
  2c:	11 c1       	rjmp	.+546    	; 0x250 _exit


Hier richten wir die E / A-Ports ein und rufen die Hauptfunktion auf. Ein Hauptteil besteht aus einer wahnsinnigen Anzahl von Aufrufen des Basisbands30 * und Sprungfunktionen (so hat sich unser höllischer Makrozirkus entfaltet).



00000030 main:
  30:	01 d1       	rcall	.+514    	; 0x234 baseband30_1
  32:	00 c0       	rjmp	.+0      	; 0x34 main+0x4
  34:	fd d0       	rcall	.+506    	; 0x230 baseband30_0
  36:	00 c0       	rjmp	.+0      	; 0x38 main+0x8
  38:	fd d0       	rcall	.+506    	; 0x234 baseband30_1
  3a:	00 c0       	rjmp	.+0      	; 0x3c main+0xc
  3c:	f9 d0       	rcall	.+498    	; 0x230 baseband30_0
  3e:	00 c0       	rjmp	.+0      	; 0x40 main+0x10
  40:	f9 d0       	rcall	.+498    	; 0x234 baseband30_1
  42:	00 c0       	rjmp	.+0      	; 0x44 main+0x14
  44:	f5 d0       	rcall	.+490    	; 0x230 baseband30_0
  46:	00 c0       	rjmp	.+0      	; 0x48 main+0x18
  48:	f5 d0       	rcall	.+490    	; 0x234 baseband30_1
  4a:	00 c0       	rjmp	.+0      	; 0x4c main+0x1c
  4c:	f1 d0       	rcall	.+482    	; 0x230 baseband30_0
...
 22e:	00 cf       	rjmp	.-512    	; 0x30 main


Und so weiter ... bis wir zurück zum Hauptfeld springen



Nun wollen wir sehen, wie unser Basisbandmodul aussieht.



00000230 baseband30_0:
 230:	08 e1       	ldi	r16, 0x18	; 24
 232:	02 c0       	rjmp	.+4      	; 0x238 baseband30

00000234 baseband30_1:
 234:	00 e0       	ldi	r16, 0x00	; 0
 236:	00 c0       	rjmp	.+0      	; 0x238 baseband30

00000238 baseband30:
 238:	07 bb       	out	0x17, r16	; 23
 23a:	00 c0       	rjmp	.+0      	; 0x23c baseband30+0x4
 23c:	00 c0       	rjmp	.+0      	; 0x23e baseband30+0x6
 23e:	00 c0       	rjmp	.+0      	; 0x240 baseband30+0x8
 240:	00 c0       	rjmp	.+0      	; 0x242 baseband30+0xa
 242:	00 c0       	rjmp	.+0      	; 0x244 baseband30+0xc
 244:	00 c0       	rjmp	.+0      	; 0x246 baseband30+0xe
 246:	00 c0       	rjmp	.+0      	; 0x248 baseband30+0x10
 248:	00 c0       	rjmp	.+0      	; 0x24a baseband30+0x12
 24a:	00 c0       	rjmp	.+0      	; 0x24c baseband30+0x14
 24c:	00 00       	nop
 24e:	08 95       	ret


Am Ende können Sie sehen, wie sich die Verzögerung zu einer Liste von Jump and Nop für die Verzögerung erweitert hat. Das ist so schöne Magie.



Nun, wir haben den Code herausgefunden. Sammeln Sie das abgelassene Gehirn aus den Ohren, wir fahren mit den Tests fort.



Tests



Wir werden alle gewonnenen Erkenntnisse anwenden und Tests durchführen. Wir kompilieren die Firmware, flashen den Controller und denken daran, die Sicherungsbits richtig zu setzen.





Firmware-Schal Wir



schließen unseren Schwingkreis an und testen an einem echten Industrieleser, keine halben Sachen, faire Kampfbedingungen.





Prüfstand



Und siehe da! Es funktioniert, liest richtig und gibt die richtige ID in einer Schleife! Ohne externe Stromversorgung, nur vom Feld aus. Es bleibt alles in Ordnung zu bringen und ein echtes RFID-Tag zu erstellen.





Die endgültige „laminierte“ Version des Etiketts



Gesamt



Ich kann ehrlich zugeben, dass ich nicht ganz daran geglaubt habe, dass es funktionieren würde. Stromversorgung aus dem Feld, nicht standardmäßige Betriebsarten der Steuerung, arbeiten streng nach Taktzyklen, hausgemachte Induktivität. Plus die Arbeit von RFID selbst. Und jetzt, wie sich ein kleines Stück Arbeit über ein paar Monate erstreckt, lesen Sie die Dokumentation und die Nachbesprechung. Aber es funktioniert und dieses Ding ist wirklich brillant. Also Leute, so etwas ist echtes Hacken. Tue es!



Hausaufgaben



Da Sie diesen coolen Artikel immer noch gelesen haben, habe ich ihn geschrieben, ausprobiert, getan, jetzt ist es Zeit für Sie, zu versuchen, etwas zu tun. Der Emulatorcode enthält einen Abschnitt, der HID-Proximity-Karten mit Phasenverschiebungscodierung emuliert. Sie sollten den HID-Standard und diese Codierung verstehen, um Spaß zu haben und sich besser zu assimilieren. Senden Sie die Lösung in den Kommentaren. Viel Glück.



Referenzliste



  1. AppNote 411 RFID Made Easy
  2. AN710 Antenna Circuit Design for RFID Applications
  3. priority1design.com





All Articles