Emulator kartu EM Marine

Tentunya masing-masing dari kita yang pernah ke kantor biasa tertarik dengan bagaimana fungsi contactless pass ini. Pada artikel ini kita akan membahas prinsip pengoperasian kartu tanpa kontak dan membuat emulator dari tiga komponen radio.
Teknologi RFID

Munculnya tag
RFID RFID (IDentifikasi Frekuensi Radio Inggris, identifikasi frekuensi radio) - memiliki jangkauan frekuensi yang cukup luas dan sejumlah besar standar berbeda yang entah bagaimana dapat diterapkan pada teknologi ini. Sebagai referensi: frekuensi yang digunakan adalah: 125-135 kHz, 400 kHz, 6,78 MHz, 13,56 MHz (kartu metro dan kartu bank), 27,125 MHz, 40,68 MHz, 433,29 MHz, 869 MHz, 915 MHz, 2,45 GHz, 5,8 GHz dan 24,125 GHz. Seperti yang Anda lihat, rentang frekuensinya sangat lebar.
Kami akan berbicara tentang kartu yang paling luas dan paling tidak terlindungi dari rentang frekuensi 125 kHz. Saya akan menganalisis standar EM Marine 4102, karena ini yang paling saya kenal. Namun, kode emulator memungkinkan Anda bekerja dengan standar lain yang beroperasi pada 125 kHz.
Agar kita dapat mempelajari teori ini lebih jauh, beberapa kata harus dikatakan tentang cara kerja RFID. Selanjutnya pada teks tersebut akan diberikan informasi terkait dengan standar Marine EM 125 kHz, solusi RFID lainnya disusun dengan cara serupa.

Pembaca, selain pertukaran informasi, juga memasok daya. Tag adalah ROM yang didukung oleh medan elektromagnetik, dan setelah daya diterapkan, itu hanya memberikan informasi yang direkam.

Diagram ini dengan jelas menunjukkan bagaimana pemancar dan penerima diatur. Kedua sirkuit osilasi disetel ke resonansi dan digunakan untuk transmisi data dan transmisi energi, untuk memberi daya pada tag pasif, yang merupakan kartu kami.
Lebih detail tentang prinsip operasi dapat ditemukan di [1]

Bagian dalam kartu yang dibongkar
Jika Anda membongkar kartu, Anda dapat melihat antena dalam bentuk kumparan dan chip berisi senyawa, yang berisi ROM dan kapasitor 75 pF.
Deskripsi protokol EM4102
Sebelum melangkah lebih jauh, mari kita pahami standar EM4102 yang akan kita tiru. Tag RFID yang sesuai EM4102 berisi 64 bit memori hanya-baca. Faktanya, ini adalah ROM, yaitu informasi dapat dibaca darinya, tetapi tidak dapat diubah atau ditulis, dengan kata lain, chip ini dijahit sekali di pabrik. Struktur memori dari tag tersebut dapat dilihat pada gambar di bawah ini.

Saat tag memasuki medan elektromagnetik yang dipancarkan oleh pembaca RFID, tag menerima energi dari medan (daya) dan mulai mengirimkan data. 9 bit pertama adalah yang logis. Bit-bit ini digunakan sebagai urutan token untuk menunjukkan dimulainya transmisi. Karena semua data lain menggunakan paritas, urutan sembilan bit ini tidak akan lagi terjadi di tempat lain. Kemudian ada 10 kelompok yang terdiri dari 4 bit data dan 1 bit paritas untuk setiap kelompok. Terakhir, ada 4 bit checksum dan bit stop terakhir, yang selalu nol.
Tag mengulangi siklus transmisi data hingga menerima daya. Oleh karena itu, kami mengamati pembacaan tag yang konstan pada pembaca.
Saya akan memberikan contoh data yang dikirimkan oleh label dengan nomor: 0x06Apakah nomor versi, dan 0x001259E3 adalah datanya.

Ngomong-ngomong, nomor yang tercetak di kartu dapat diterjemahkan menjadi nomor hex yang akan diterima pembaca. Misal, nomor yang tertulis di kartu: 116.2352
- 116 dalam notasi desimal adalah 0x74 dalam heksadesimal;
- 23152 dalam desimal adalah 0x5A70 dalam heksadesimal;
Dengan menggabungkannya, kami mendapatkan nomor seri kartu, yang akan diberikan pembaca kepada kami: 0x00745A70 .
Modulasi sinyal
Transmisi data dari tag ke pembaca dilakukan dengan memodulasi sinyal pembawa pembaca (dalam kasus kami, frekuensi pembawa adalah 125 kHz). Harap dicatat bahwa frekuensi pembawa ini juga menyediakan daya dan memodulasi sinyal. Untuk memulainya, mari pertimbangkan skema interaksi yang disederhanakan antara pembaca dan tag. Ingat gambar ini, kita akan merujuknya nanti.

Seperti yang Anda lihat, tag memiliki sirkuit osilasi LC, dioda yang berfungsi untuk memperbaiki arus bolak-balik, kapasitor untuk menghaluskan riak (ini adalah bagian dari catu daya tag), dan transistor, dengan mengontrol yang dapat kita modulasi sinyal. Pada pembaca, hal ini akan tercermin dalam perubahan arus yang mengalir pada kumparan. Sederhananya, ketika memasuki bidang pembaca, tag mengkonsumsi arus listrik (kira-kira terus-menerus), ketika mentransmisikan informasi, itu mengubah nilai arus yang dikonsumsi oleh transistor, dan dengan demikian pembaca dapat menerima sinyal dengan mengukur daya yang dikonsumsi.
Pembaca menghasilkan medan magnet menggunakan modulator dan kumparan dan mengambil sinyal termodulasi, kemudian mendekodekannya.

Contoh modulasi sinyal pembawa
Jika saya belum sepenuhnya membingungkan Anda, maka mari kita melangkah lebih jauh. Untuk mengirimkan data, kita perlu memodulasi sinyal. Artinya, ia akan menempatkan bit-bit informasi yang ditransmisikan pada frekuensi pembawa.
Ada tiga skema modulasi populer menurut standar RFID:
- Kode Manchester
- Kode Manchester Dua Fase
- Pengodean Pergeseran Fase
Karena standar EM4102 menggunakan skema pengkodean Manchester, kami akan mempertimbangkannya. Saat memodulasi untuk protokol EM4102, waktu transmisi satu bit bisa 64, 32 atau 16 periode frekuensi pembawa (125 kHz).

Dengan pengkodean ini, tanda tersebut mengubah level transmisi sinyal tepat di tengah periode transmisi satu bit. Transisi dari level rendah ke level tinggi pada saat-saat ini berarti status logis "1", dan transisi dari level tinggi ke level rendah merepresentasikan status logika "0".

Sinyal termodulasi nyata ditangkap pada koil pembaca.
Membuat emulator RFID
Nah, jika Anda masih kesini dan kepala Anda tidak bengkak akibat perhitungan tersebut, maka sudah saatnya membuat emulator RFID, dari dua bagian saja. Dalam kesederhanaan ini terletak kejeniusan. Saya merakit perangkat, meminjam ide dan kode dari Micah Dowty , foto adalah milik saya.

Berikut adalah miniatur kecoa yang mungkin meniru tag
situs Proyek . Kode ini sangat menarik, bisa dikatakan brilian dan singkat (assembler digunakan). Mari kita bahas secara detail. Kami akan menganalisisnya. Anda dapat melihat kodenya di sini .
Untuk memulainya, mari kita cari tahu bagaimana benda ini secara umum berfungsi, meskipun menurut definisi tidak seharusnya berfungsi, karena bertentangan dengan diagram pengkabelan mikrokontroler biasa. Diagram perangkat diambil dari kode sumber.

Induktor sekitar 1 μH dan mikrokontroler ATtiny85
Ini, bapak ibu sekalian, adalah Peretasan nyata, ketika tingkat pemahaman tentang fitur pengoperasian peralatan memungkinkan Anda membuat solusi teknis yang melampaui batas yang ditunjukkan oleh pabrikan! Dan itu berhasil, diverifikasi secara pribadi. Ini adalah arti sebenarnya dari kata "hacker", ini bukan tentang peretasan dan pencurian.
Ke depan, saya akan mengatakan bahwa koil ini tidak cukup untuk operasi normal, namun saya harus membuat antena normal, menutup kapasitor catu daya, dan kapasitor resonan. Tapi untuk mendemonstrasikan prinsip kerja, cukup cocok.
Bagaimana cara kerjanya:
Sebelum kita pergi ke parsing kode emulator ini, mari kita jadikan antena biasa. Eksperimen saya dengan sirkuit saat ini menunjukkan ketidakstabilan ekstrim dalam operasinya. Ia bekerja sangat dekat dengan pembaca, dan bahkan tidak selalu. Oleh karena itu, pada awalnya saya menyolder kapasitor 0,1 μF ke kaki daya pengontrol, dan kemudian saya memutuskan untuk membuat rangkaian osilasi yang sangat besar, seperti pada label nyata.
- AVR /. /, . , . , . , . , . , .
- AVR. , , , ( 0,1 ). AVR. , , 125!
- . ATtiny85 2,5 . 1,8 . AVR , ...
- , ! , , . Clock ! 125 , RFID. , !
- ? -, . . EM4102 32 . HID FSK 4 . RFID- . « » , RFID -.

Modifikasi pertama adalah kapasitor 0,1 uF untuk catu daya
Pembuatan antena
Tidak ada trik dalam membuat antena koil, tetapi Anda tetap perlu membiasakan diri dengan dokumentasi dan memahami proses fisika ... Tidak sulit, dan bahkan seorang anak sekolah pun dapat mengatasinya, hanya sedikit kesabaran dan ketekunan yang diperlukan.
Sangat mudah untuk merakit dan mengkonfigurasi antena, seperti pada gambar dari [1] .

Untuk menghitung antena, Anda perlu mengingat sedikit teori. Kita perlu membuat rangkaian osilasi yang akan disetel ke frekuensi 125 kHz. Mari kita buka kursus Yayasan Teoritis Teknik Elektro dan membaca apa itu rangkaian osilasi:
Sirkuit osilasi, sirkuit listrik yang berisi induktor dan kapasitor tempat osilasi listrik dapat dieksitasi.

Rangkaian osilasi paralel
Jika kita meninggalkan semua matematika dan menuju ke titik, rangkaian osilasi memiliki parameter seperti frekuensi resonansi, yang ditentukan oleh rumus.
Di mana f adalah frekuensi osilasi, L adalah induktansi kumparan, C adalah kapasitansi kapasitor.
Dalam hal ini, kami memiliki parameter tetap - frekuensi, dan kami dapat bermain dengan kapasitansi dan induktansi. Untuk menghitung kumparan, kita akan menggunakan dokumen [2] . Setiap orang yang entah bagaimana akan membuat antena untuk tag RFID (dari frekuensi berapa pun) harus membiasakan diri dengannya!
Banyak pengrajin, baik untuk pembaca maupun emulator (intinya tidak penting), membuat kumparan bulat. Kartu ini lebih mudah dihitung dan diproduksi, tetapi memiliki kekurangan yang signifikan - dimensi liniernya lebih besar dari kartu. Saya ingin membuat induktor dalam bentuk persegi panjang, dengan dimensi linier lebih kecil dari dimensi kartu standar, dan agar perangkat yang dihasilkan adalah ukuran kartu RFID standar. Alhasil, saya memilih ukuran induktor masa depan yang praktis sama dengan yang ada pada merek sekarang, yaitu sekitar 70x40 mm... Jika kapasitor dipilih 10 nF, maka induktansi kumparan (dari rumus di atas) harus 162 μH untuk kita. Sekarang mari kita lihat dokumentasi untuk menghitung kumparan persegi panjang. Untuk melilitkan kumparan, saya memilih kawat dengan penampang 0,2 mm. Hasilnya, kami membuka bagian dokumentasi yang sesuai, dan rumus mulia berikut disajikan di depan mata kami.

Seperti yang Anda lihat, parameter ketebalan dan lebar kumparan tidak diketahui dan bervariasi (mereka bersandar pada ketebalan kawat 0,2 mm), tetapi perkiraan umum memberi saya angka 42 putaran. Dimungkinkan untuk membuat beberapa iterasi, dan membuat perhitungan akurat langsung, tetapi dalam kasus potongan kami, itu akan dilakukan.
Setelah itu, perlu dibuat bingkai 70x40 mm untuk melilitkan kumparan. Saya membuatnya dari PCB dan melilitkan kumparan di sekitarnya.

Bingkai PCB


Berliku dan koil selesai
Sayangnya, saya tidak memiliki pengukur induktansi, jadi saya harus melanjutkan lebih jauh menggunakan metode poke ilmiah. Karena saya mungkin membuat kesalahan dalam perhitungan, dan dalam jumlah putaran ketika saya melilitkan kumparan, seperti yang saya lakukan kira-kira dan dengan mata, saya memutuskan untuk memilih kapasitansi resonan secara manual. Untuk melakukan ini, saya memasang koil pada pembaca kartu, memasukkan ujungnya ke papan tempat memotong roti ("kasur berlubang"), lalu mulai menghubungkan wadah satu per satu, sambil mendaftarkan sinyal pada osiloskop.

Memulai dengan Kapasitor Resonan
Pertama saya memeriksa kapasitor 10nF, yang seharusnya beresonansi. Tetapi amplitudo sinyal langsung melorot dibandingkan dengan koil kosong. Lalu saya ambil kapasitor yang lebih kecil. Jadi saya memeriksa kapasitor sampai saya menangkap resonansinya. Jadi, kapasitansi resonansi kapasitor adalah 3,2 nF.

Sinyal tanpa kapasitor, koil kosong

Sinyal 10 nF

1 nF, 2 nF

3 nF, 4 nF, 2,2 nF

3,2 nF
Dapat dilihat bahwa saya mencoba opsi yang berbeda, dan jelas bahwa maksimum terletak di antara 3 dan 4 nF dan hasilnya adalah kapasitor 3,2 nF (terdiri dari dua kapasitor secara paralel). Itu saja, reel kami siap untuk eksperimen lebih lanjut.
Secara umum, saya ingin mencatat bahwa kumparan umumnya dapat dibuat dalam bentuk trek pada papan sirkuit tercetak, dan dengan serangkaian kecil produk, ini harus dilakukan. Berikut adalah contoh papan tersebut, pada 125 kHz dari Alexander Guthmann . Sayangnya, situs tersebut praktis mati, dan penulisnya sudah lama tidak berhubungan, jadi kami puas hanya dengan foto saya. Jika ada yang bisa membantu menemukannya, saya akan berterima kasih! Saya tidak tahu apa yang terjadi padanya.

Jadi, membuat emulator langsung dalam bentuk papan sirkuit tercetak tidak masalah. Saya rasa dengan memiliki manual [2] , Anda dapat menghitungnya sendiri, karena anak sekolah Jerman berusia empat belas tahun dapat melakukannya.
Mari kita lihat kodenya
Mari kita lihat kodenya, yang dapat Anda lihat di sini . Ada contoh emulasi dua jenis kartu, saya hanya akan menganalisis EM4102.
Pertama-tama, seperti yang dikatakan kode, saat mem -flash mikrokontroler, kita perlu mem -flash bit sekering ke nilai lfuse ke 0xC0 : sehingga pengontrol dihitung dari generator eksternal. Saya menarik perhatian Anda pada fakta bahwa pengontrol apa pun yang berkedip akan dikaitkan dengan fakta bahwa itu perlu dicatat dari sumber eksternal, karena kami menyetel bit sekering dengan pembangkitan dari generator eksternal!
Semua kode didasarkan pada makro. Izinkan saya mengingatkan Anda apa itu makro - program yang menyiapkan kode untuk kompilasi. Program kami hanya terdiri dari beberapa instruksi assembler: rjmp, call (2 clocks), nop, ldi, out and ret (all 1 clock)! Semuanya, semua kode lainnya dibentuk oleh makro tergantung pada makro nomor seri (definisikan). Keunikan pekerjaan ini adalah kami memiliki cukup sedikit siklus jam untuk pekerjaan normal. Cobalah untuk melakukan sesuatu dalam 32 siklus jam, mengingat instruksi lompat dalam pengontrol AVR mengambil 2 siklus jam. Oleh karena itu, semua kode dibuat oleh makro tergantung pada kartu ID.
#define FORMAT_IS_EM4102
#define EM4102_MFR_ID 0x12
#define EM4102_UNIQUE_ID 0x3456789A
Tentukan jenis kartu yang kita tiru dan tetapkan kartu ID. Ini adalah makro utama, yang menjadi dasar pembentukan kode lainnya. Dan, tadam, makro yang mulia.
.macro delay cycles
.if \cycles > 1
rjmp .+0
delay (\cycles - 2)
.elseif \cycles > 0
nop
delay (\cycles - 1)
.endif
.endm
Makro penundaan, mengambil sebagai masukan jumlah kutu penundaan. Makro rekursif yang cukup jelas yang melakukan penundaan menggunakan perintah nop (tanpa operasi, 1 siklus jam) dan perintah rjmp. + 0 (pindah ke baris berikutnya, 2 siklus jam). Dengan menggabungkan perintah ini satu sama lain, Anda dapat membuat penundaan dalam ukuran yang diinginkan. Faktanya, kode tidak melakukan apa pun, hanya membuang-buang waktu mesin.
Jika Anda masih berpikir, saya akan benar-benar memperkosa otak Anda, tetapi kodenya sangat cerdik sehingga Anda harus bertahan.
Pengkodean makro rekursif dengan kode Manchester.
.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
Sebenarnya, semua logika diterapkan di sini. Menerima bit mask dan bit counter sebagai input. Jika penghitung tidak nol, maka kita memanggil diri kita sendiri lagi, mengurangi penghitung (makro rekursif, ya). Lebih jauh dalam body itu sendiri, ada panggilan ke makro baseband_0, baseband_1 dan baseband_1_last. Bergantung pada bit mana yang kita miliki "1" atau "0", kita memodulasi sinyal kode Manchester dari nol ke satu atau dari satu ke nol.
Ingat di atas saya memberikan tabel di artikel, bagaimana isi kartu dikodekan, di mana bit paritas pergi, dan bit stop di bagian akhir. Jadi, tugas kita sekarang adalah mengenkode ID-tag dengan metode ini, untuk ini kita memiliki dua makro.
#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 - menghitung bit paritas dalam string empat-bit, COLUMN_PARITY - menghitung checksum dari seluruh pesan.
Semua logika pekerjaan kami dijelaskan dalam makro di .main
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
Artinya, kita hanya mentransfer header 9 bit dengan cara yang sama, kemudian Manchester mengkode, menghitung bit paritas untuk setiap 4 bit, pada akhirnya checksum dan bit stop.
Tetap mencari tahu apa baseband itu. Untuk ini, kami memiliki satu makro pembungkus lagi (ya, berapa banyak yang mungkin, eh?).
.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
Makro pita dasar * - jalankan kode rakitan: panggil fungsi yang sesuai, lalu buat transisi ke instruksi lain. Makro baseband_1_last mirip dengan makro baseband_1, bedanya makro ini membuat lompatan tanpa syarat bukan ke perintah di bawah, tetapi ke awal fungsi utama. Macro header - berfungsi untuk menampilkan header sembilan bit dengan tipe yang sama sama dengan satu, dan memanggil makro Manchester dengan transmisi jumlah dan jumlah bit yang ditransmisikan.
Hal terakhir yang harus diurai adalah fungsi baseband30_0 dan baseband30_1. Mereka dijelaskan oleh kode berikut.
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
Bergantung pada fungsi yang disebut baseband30_0 atau baseband30_1, nilai dari apa yang seharusnya ada pada pin I / O ditulis ke register r16: 1 atau 0. Setelah itu, ada transisi tanpa syarat ke baseband30, keluaran dijalankan dan penundaan 19 siklus clock, setelah itu ada pengembalian.
Keajaiban terbesar dari kode ini adalah bahwa ia dihitung tepat sebelum setiap siklus clock, setiap clock transmisi kode Manchester mengambil periode sebanyak yang diizinkan oleh standar, yaitu 32 siklus clock prosesor! Ini sangat cerdik, Anda harus ingat berapa banyak bar yang dibutuhkan setiap perintah.
Mari kita kompilasi dan lihat seperti apa, bagaimana semua makro ini berkembang. Kami mengkompilasi dengan perintah make (setelah menginstal avr-gcc) dan membongkar file elf yang dihasilkan
00000000 __vectors:
0: 0e c0 rjmp .+28 ; 0x1e __ctors_end
2: 15 c0 rjmp .+42 ; 0x2e __bad_interrupt
...
Pertama, kita memiliki vektor interupsi, tetapi kita hanya tertarik pada lompatan pertama. Karena vektor lainnya tidak mengarah ke mana pun.
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
Di sini kami menyiapkan port I / O, dan kami memanggil fungsi utama. Utama terdiri dari sejumlah besar panggilan ke baseband30 * dan fungsi lompat (begitulah sirkus makro kami yang mengerikan terungkap).
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
Dan seterusnya ... sampai kita kembali ke main
Nah, mari kita lihat bagaimana modul baseband kita terlihat.
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
Pada akhirnya, Anda dapat melihat bagaimana penundaan telah diperluas menjadi daftar lompat dan tidak untuk penundaan. Ini keajaiban yang sangat indah.
Nah, kami sudah menemukan kodenya. Kumpulkan otak yang terkuras dari telinga, kami melanjutkan ke tes.
Tes
Kami akan menerapkan semua pengetahuan yang diperoleh dan melakukan tes. Kami mengkompilasi firmware, mem-flash pengontrol, mengingat untuk mengatur bit Fuse dengan benar.

Syal Firmware Kami
menghubungkan sirkuit osilasi kami dan menguji pada pembaca industri nyata, tidak setengah-setengah, kondisi pertarungan yang adil.

Bangku tes
Dan, lihatlah! Ia bekerja, membaca dengan benar dan memberikan ID yang benar dalam satu putaran! Tanpa catu daya eksternal, dengan operasi hanya dari lapangan. Tetap mengatur semua ini dan membuat tag RFID asli.

Versi terakhir label yang "dilaminasi"
Total
Saya dapat dengan jujur mengakui bahwa saya tidak sepenuhnya percaya bahwa itu akan berhasil. Catu daya dari lapangan, mode operasi non-standar pengontrol, bekerja secara ketat dalam siklus jam, induktor buatan sendiri. Ditambah kerja dari RFID itu sendiri. Dan sekarang, seperti pekerjaan sepele yang tersebar selama beberapa bulan untuk membaca dokumentasi dan pembekalan. Tapi itu berhasil, dan hal ini benar-benar brilian. Jadi guys, hal semacam ini benar-benar peretasan. Lakukan!
Pekerjaan rumah
Berhubung Anda masih membaca artikel keren ini, saya menulisnya, mencobanya, melakukannya, sekarang saatnya Anda mencoba melakukan sesuatu. Kode emulator berisi bagian yang mengemulasi kartu Kedekatan HID dengan enkode pergeseran fase. Anda harus memahami standar HID dan pengkodean ini untuk kesenangan dan asimilasi yang lebih baik. Kirimkan solusinya di kolom komentar. Semoga berhasil.
Bibliografi
