NFC li ANDROID telefonlarınızı, nasıl NTAG etiketine dönüştürebilirsiniz

NFC li ANDROID telefonlarınızı, nasıl NTAG etiketine dönüştürebilirsiniz.

NFC desteği olan Android telefonlarınızı MIFARE veya NTAG etiketleri gibi NFC kart olarak çalıştırabileceğinizi söyledim.
Elbette bunu yapabilirsiniz. Bu vereceğim program ile Android telefonunuzu PN532 NFC okuyucu kart ile nasıl kullanabileceğinizi göreceksiniz.
Burada NEDEN RC522 ile yapamıyorum sorusunu sorabilirsiniz. PN532, banka kartları gibi kartların haberleşmesinde bazı şeyleri kendi üzerine alır. PN532 ye git kart haberleşmesini yap, kartı oku, dediğinizde bunu yapar. Çünkü nasıl yapacağını bilir.
RC522 de ise bütün bu prosedürleri sizin yazmanız gerekir. Bundan dolayı bu işe yeni başlıyorsanız RC522 yi hiç almayın.
PN532 den başlayın. Hatta RC522, anteninin zayıf olmasından dolayı bazı klon kartları ve NTAG etiketlerini okumakta güçlük çeker. PN532 Anten sisteminin gücü ile hiç bir kartı kaçırmaz. Telefonları bile.

FAKAT ŞUNU YAPMANIZ LAZIM.
Önce NFC konusundaki ilk yazımı okumanız lazım. Çünkü orada verdiğim değerli bilgileri buraya tekrar yazmadım.
Önce,

  • NFC nedir?
  • NFC kart ve etiketler nasıl çalışır?
  • NDEF formatı nedir?
  • Bunları öğrenmeniz lazım.NFC hakkında ilk yazım bu adrestedir. 

Yazıyı okuduktan sonra bu konuyu anlamanız, PN532 NFC okuyucuyu anlamanız çok kolay olacaktır.

Şimdi de ilk yapılacaklara bakalım.

İlk yapılacak şey,

  • Telefonumuzun NFC özelliğini açmak.
  • Bu uygulamayı telefonunuza yükleyip NFC telefonunuzun HCE moduna hazır olup olmadığını inceleyebilirsiniz.
    Adresi budur. Dikkat edin paralı PRO sürümü değil reklam içeren sürümünü yükleyin. 
  • Bu uygulamayı açtığınızda en alttaki NFC ÇİP BİLGİSİ butonuna basarak HCE modunda çalışıp çalışmadığını ve durumunu görebilirsiniz.Aşağıdaki resimler benim telefonumun ÇİP bilgisidir.

Siz de bu bilgilere göre kendi telefonunuzu kontrol edebilirsiniz. Özellikle 2. sayfada HCE bilgisi ve çalışabildiği NFC kart standartlarını görebilirsiniz.

Buraya kadar telefonunuzun NFC çipinden de emin olduysanız, NFC ayarlarında BEAM kapalı konuma getirin.
Bunu da yaptıktan sonra ANDROID STUDIO programını USB üzerinden telefonunuza bağlayabilirsiniz. Şayet ben Android studio kurmayacağım bana APK ver diyorsanız da indirebileceğiniz dosyalar arasında APK dosyasını da bulabilirsiniz. Bunu telefonunuza yükleyebilirsiniz.

NOT: Android Studio da telefonunuzu USB den bağlayacaksanız. Telefonunuzda DOSYA AKTARIMI seçmeniz gerek. Aynı zamanda USB HATA AYIKLAMA açık durumda olmalı

Bu HCE modundaki kartı nerede okutacağız. Tabii ki ARDUINO destekli PN532 NFC kart okuyucuda okutacağız.
Daha önceki yazımda MIFARE kartları ve NTAG kartlarını okumak için nasıl ki KÜTÜPHANESİZ arduino programları varsa, burada da KÜTÜPHANESİZ Arduino programları var.
Bağlantılar 1. NFC YAZIM daki bağlantılarla aynı şekildedir Bir değişiklik yapılmadı.

Arduino programları 2 adettir.

  • android_PN532_8_kredili_OK
  • android_PN532_8_yetkili_OK

Kredili program İZMİR deki 90 dk lık toplu taşıma kartının çalışmasını simüle ediyor. Detaylı anlatımı 1. NFC YAZIM da mevcuttur.
Yetkili program ise Şirket ismi doğru ise Bitmask Kapı numarası okuyucunun kapı numarası ile eşleşmişse Telefonunuzu gösterdiğinizde sizi YETKİLİ olarak görüp kapı açacaktır.
Not: Ben arduinoya röle eklemedim. Bundan dolayı Ne BİP sesi Ne de kapı açma komutu verildi. Sadece seri monitörde YETKİLİ yazan satır var. Bu satırdan sonra BIP ve RÖLE devresini siz programa eklersiniz. BIP sesi olmadığı için bazen telefonu erken kaldırabiliyor olabilirsiniz. Seri monitörde İŞLEM BAŞARILI kelimesini göresiye kadar telefonu kaldırmayın. Özellikle Kredili programda kredi hesaplamadan sonra telefona yazma işlemi yapılıyor. Bu durumda işlem yarım kalabilir. EN İYİ ÇÖZÜM ARDUİNOYA TRANSİSTÖRLÜ BİR BUZZER KOYUP İŞLEM BAŞARILI İSE BIP DEĞİL İSE BIP BIP VERECEK SESLİ DÜZENEĞİ HAZIRLAMAK. Çoğu profesyonel okuyucudaki gibi sesli görüntülü bildirim, erken telefonu kaldırma problemini ortadan kaldıracaktır.
Ayrıca benim videomu seyrederken göreceksiniz. Kablolardan dolayı bazen kenardan okutayım dediğimde işlem hem telefonu yakalıyor ama okurken problem yaratabiliyor. Bunu da yapmasının sebebi telefon NFC anteninin tam senkron olamamasındandır. Direkt olarak üstten aşağı doğru indirdiğinizde okuma sorunu ortadan kalkacaktır ya da yeriniz dar değil ise bağlantı kablolarını pn532 yi geçmeyecek şekilde bulunduğu yere bant ile bantlamak iyi bir çözüm olabilir.

Programı yükleyip bağlantıları doğru yaptığınızda karşınıza aşağıdaki gibi bir seri monitör ekranı çıkacak.
01:40:21.822 -> Looking for PN532…
01:40:21.822 -> PN532 bulundu – Firmware: 1.6
01:40:21.822 -> Waiting for an ISO14443A Card or Phone (HCE) …
Burada PN532 BULUNDU yazıyor. Demek ki devreniz doğru çalışıyor. Bütün SPI bağlantılarınız doğru. Fakat PN532 bağlantı yaparken 1.NFC YAZIM a bakarak şemasına göre bağlantı yapın. Çünkü PN532 3V3 ile çalışıyor. Haberleşme pinleride 3V3 ile çalıştığından araya transistörlü LEVEL SHIFTER seviye dönüştürücü kullanmanız gerekiyor.
Ayrıca PN532 yi sipariş vermeden önce 1. NFC YAZIM’a bakmanız menfaatiniz icabıdır. Ben 1. kartı sipariş ettiğimde gelen kartı DÜNYA üzerinde çalıştıranı bulamadım. Yeni kart satın aldım. Satın alma konusunda da 1. NFC YAZIM size yol gösterecektir. 

Şayet telefonunuzu yaklaştırırsanız aradaki haberleşme de aşağıdaki resimdeki gibi oluyor. Bu haberleşme MIFARE ve NTAG haberleşmesinden farklı oluyor. Çünkü Telefonunuzdaki NFC HCE kart, SAK:0x20 denilen güvenli kartların yapısında olduğundandır. Yani Banka kartları kadar güvenli bir yapıdadır. Ya da Toplu taşım kartları kadar güvenli yapıdadır. Sadece sizin PN532 okuyucunuzla okunabilir.

 

Yukarıdaki resim Kredili programın seri monitör çıktısıdır. Aşağıdaki resim ise YETKİLİ kapı programına aittir.


Bu ANDROID programında bilgileri fiziksel bloklara değil NDEF formatında kaydettik. Bu şekilde de okumamız gerektiği için PN532 programları NDEF formatında okuma yapıyor.
NDEF formatı nedir diyorsanız, 1. NFC YAZIMA bir göz atmanız lazım.

Android studio programını kurduğunuzda GEMİNİ den destek alarak kurun. Telefonunuzu USB üzerinden Android Studio ya bağlayabilirsiniz. Yaptığınız anlık değişiklikleri Telefonunuzdan takip edebilirsiniz.

NFC-HCE Protokolü ve Akıllı Telefon Haberleşmesi Nasıl Çalışır?

Sistemin donanım ve telefon arasında yürüttüğü haberleşme zincirini adım adım inceleyelim:

1. Telefonu Tanıma ve Uygulama Seçimi (AID Handshake)

Sistemde tarama yapıldığında SAK:0x20 şeklinde algılanan cihazlar; bankamatik kartları, gelişmiş toplu taşıma kartları veya HCE (Host Card Emulation) modundaki akıllı telefonlardır. Bu gelişmiş mimaride geleneksel kartlardaki gibi basit sektör şifreleri (Password) kullanılmaz. Bunun yerine telefon, kendisine has bir AID (Application Identifier – Uygulama Kimliği) bilgisi yollar.

Arduino programında, telefonun içindeki bizim uygulamamızı uyandırmak için gönderilen APDU paketinin son satırı bu AID numarasıdır:

bool HCE_selectAID(uint8_t tgNumber) {
  uint8_t selectApdu[] = {
    0xD4, 0x40, tgNumber,          // PN532 Protokol başlığı
    0x00, 0xA4, 0x04, 0x00, 0x07,  // ISO-7816 "Uygulama Seç" komutu (AID 7 byte uzunluğundadır)
    0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01  // 🌟 Hedef Uygulama AID Numarası
  };

Telefon bu AID numarasını aldığında, kendi içinde bu kimliğe kayıtlı bir HCE uygulaması olup olmadığına bakar. Eğer uygulamalar eşleşirse, bağlantının başarıyla kurulduğunu bildirmek için okuyucuya standart 90 00 (İşlem Başarılı) byte yanıtını döndürür. Artık telefon donanıma bağlanmıştır.

2. Sanal Dosya Seçimi (NDEF File Selection)

Telefon bağlandıktan sonra, okuyucunun telefon hafızasındaki veri dosyasına erişmesi gerekir. Bu amaçla telefondan NDEF veri dosyasını açması talep edilir:

bool HCE_selectNdefFile(uint8_t tgNumber) {
  uint8_t apduSelectNdefFile[] = {
    0xD4, 0x40, tgNumber, 
    0x00, 0xA4, 0x00, 0x01, 0x02, // ISO-7816 "Dosya Seç" komutu
    0xE1, 0x04                    // 📂 Hedef Dosya Kimliği (File ID: E104)
  };

Yukarıdaki fonksiyon ile telefona yeni bir APDU komutu gönderilir. En alt satırdaki 0xE1, 0x04 verisi telefonun anlayacağı dilde “Bana NDEF veri dosyasını aktif et” demektir. Telefon dosyayı hazırlar ve okuyucuya tekrar onay anlamında 90 00 gönderir.

3. Veri Okuma Aşaması (Read Binary)

Dosya da açıldığına göre artık kartın içindeki isim, şirket ve kredi gibi bilgileri okuma aşamasına geçilir:

bool HCE_readBinary(uint8_t tgNumber, uint8_t *dataBuffer, uint8_t readLen) {
  uint8_t apduReadBinary[] = {
    0xD4, 0x40, tgNumber, 
    0x00, 0xB0,           // ISO-7816 "Veri Oku (READ BINARY)" komutu
    0x00, 0x00,           // Okumaya başlanacak Ofset (Başlangıç noktası)
    readLen               // Okunacak veri uzunluğu bilgisi (96 Byte)
  };

HCE_readBinary fonksiyonu ile gönderilen bu APDU isteği sayesinde telefon, hafızasındaki kullanıcı bilgilerini okuyucuya akıtmaya başlar. Komuttaki 0x00, 0x00 baytları dosyanın en başından (sıfırıncı indeksten) itibaren okunacağını; en alttaki readLen (bizim sistemimizde daima 96 yani 0x60) ise telefondan toplam kaç byte veri çekileceğini belirler. Gelen bu veriler dataBuffer isimli diziye kaydedilir.

4. Kredi Güncelleme ve Telefona Yazma Aşaması (Update Binary)

Okuyucu, telefondan aldığı 96 byte’lık veriyi inceleyip gerekli yetki kontrollerini ve bakiye hesaplamalarını yaptıktan sonra, yeni bakiye ve zaman bilgilerini telefon hafızasına geri yazmak isteyebilir. İşte bu yazma işlemi de yine bir APDU komut zinciriyle tetiklenir:

bool HCE_writeBinary(uint8_t tgNumber, uint8_t* dataToWrite, uint8_t dataLen) {
  // 8 Byte Birleşik APDU Başlığı:
  // [PN532 Komut Yapısı: 3 Byte] + [ISO-7816 Standart Başlığı: 5 Byte]
  uint8_t writeHeader[8] = {
    0xD4,      // PN532 Komutu
    0x40,      // InDataExchange modu
    tgNumber,  // Telefon Hedef Numarası
    0x00,      // CLA (Sınıf)
    0xD6,      // INS (UPDATE BINARY - Yazma Komut Kodu)
    0x00,      // P1 (Yazılacak Ofset Yüksek)
    0x00,      // P2 (Yazılacak Ofset Düşük)
    dataLen    // Lc (Ardından gelecek veri uzunluğu - 96 Byte için daima 0x60)
  }; 

  // Toplam Paket Boyutu: 8 byte birleşik başlık + 96 byte güncel kullanıcı verisi = 104 byte
  uint8_t fullPacket[8 + dataLen];

  memcpy(fullPacket, writeHeader, 8);           // Ön hazırlık etiketini/başlığını kopyala
  memcpy(&fullPacket[8], dataToWrite, dataLen); // Gerçek 96 byte'lık veriyi tam 8. indisten itibaren peşine ekle

  pn532_writeFrame(fullPacket, 8 + dataLen);
  if (!pn532_waitReady(150)) return false;
  pn532_readAck();
  return true;
}

⚠️ Kritik Kurallar ve Yazma Mantığı:

  • Okunan veri üzerinde değişiklik yaparken (Örn: Kredi düşerken), toplam paket uzunluğunun kesinlikle değişmemesi (sabit 96 byte kalması) ve veri katarı içinde Türkçe karakter barındırılmaması zorunludur.

  • memcpy komutu, hafızada tek parça halinde 104 byte’lık kesintisiz bir veri treni oluşturur. Telefon, bu paketin ilk saniyelerinde gelen 0xD6 (Yazma) komutunu ve peşindeki uzunluk etiketini (dataLen = 0x60) okur; böylece okuyucunun ne kadar veri yazacağını önceden bilir. Başlığın hemen bitimi olan 8. bayttan itibaren başlayan 96 byte’lık asıl veriyi alarak telefondaki ilgili bellek alanlarına kusursuzca kaydeder.

Telefon ekranında LOG kısmı var. Gelen giden AID ve APDU bilgilerinin seçilip seçilmediğini, el sıkışmayı, ndef seçildiğini, buradan da görebilirsiniz. Zaten arduino seri monitör de telefondan gelen doğrulama cevaplarını size gösteriyor.

Artık güvenli bir HCE telefon etiketiniz var. Sadece sizin okuyucunuz okuyabilir. Başka okuyucuların gönderdiği AID kodunu tanımadığı için Telefon TEPKİ VERMEZ
Tabii ki herhangi bir telefonda, bizim programımız haricinde programlandığında, NDEF yeri doğru bile olsa aynı şekilde okunamaz. Çünkü AID kodunu okuyucu PN532 belirliyor olacak. Telefon da da bu AID kodu kayıtlı olacak. Başkası bu AID kodunu ve NDEF mimarisini kopyalayabilirse o zaman okuyucudan geçer. Bu da çok zor bir ihtimal. Telefonun kaynak kodunu okumadıktan sonra bunu bilemez. Bu da zaten çok zor. AID güvenliği, şayet kolay kırılsaydı BANKA kartları da güvenli sayılmazdı.

Tabii ki HIRSIZLAR için her zaman bir adım önde olmak profesyonel projelerde önemlidir. Şunu bilmenizi isterim ki HCE telefon etiketlerinde bu arada gelen giden AID ve APDU bilgiler havada yakalanıp değerlendirilebilir. Bu da güvenlik açığı gibi görünse de AID kodundan sonra telefonunuza göndereceğiniz bir kriptografik bilgi doğru okuyucu ve doğru telefon olduğunu doğrulayabilir. Hatta başka gelişmiş güvenlik seviyeleri de uygulanabilir. Yani güvenlik amatör projelerde kısıtlı tutulsa da daha profesyonel düşündüğünüzde B ve C planlarınızın da olduğunu bilmelisiniz.

Bizler burada temelini araştırıp, direkt olarak kopyalanamayacak bir program yapıyoruz. Amatörce olan bir projede bu yeterli garaj kapılarında ya da ev kapılarında bu yeterli.
Çok büyük önemli bir tesis değil ise bu güvenlik kırılamayan bir güvenliktir. Bu da bizler için şimdilik yeterli.

 

TÜM PROGRAMLARI BURADAN İNDİREBİLİRSİNİZ. 

Not: Android studio ile çalışacaksanız Dizin ismini (AND_STU_HCE -son_orj_admin_panel_etkin) (AND_STU_HCE) şeklinde kısaltın ve ana dizinde SRC diye bir dizin açıp içine kopyalayın. Bunun sebebi hem dizin ismi büyük hem de bulunduğu yer ana dizinden uzak ise içerisinde bulunan uzun dosya isimleri hata vermesine yol açabilir. Bundan dolayı Ana dizinde SRC gibi bir kısa dizinin içine koymak size avantaj sağlayacaktır.

 


 

 

 

 

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir