Считыватель магнитных полос низкого уровня

Tomcat

Professional
Messages
2,630
Reputation
8
Reaction score
614
Points
113
Содержание:
  • Чтение магнитных полос низкого уровня
  • Части
  • Подключиться
  • Фрагменты кода
  • Полученные результаты

    Чтение магнитных полос низкого уровня​

    projects_4799394816_88aa8b952f.jpg


    ТЛ;ДР​

    Чтобы получить необработанные проанализированные данные из устройства считывания магнитных полос, мы сначала экспериментировали с кодировщиком клавиатуры MAGTEK Centurion (PN-21073062). Мы обнаружили, что хотя мы и смогли получить все три дорожки данных, проанализировать их было невозможно. Затем мы приобрели декодер необработанной магнитной полосы с считыванием дорожки 1, Omron V3A-6 (техническое описание здесь). Написав некоторый код проверки четности, мы смогли прочитать необработанные данные с магнитной полосы и проанализировать их в выходные данные, которые будут «напечатаны» как эмулируемая клавиатура с помощью Teensy с поддержкой USB . Также можно использовать Arduino, и данные будут выводиться как последовательные, что также может быть полезно.
    Исходный код и несколько полезных таблиц данных находятся на GitHub. Нажмите «Загрузить исходный код», чтобы получить последнюю версию .
    Мы также предлагаем попробовать StripeSnoop , который, несмотря на то, что ему уже несколько лет, оказался чрезвычайно полезным!
    Этот проект можно использовать только для чтения карт, но не для записи. Невозможно превратить устройство чтения карт в устройство записи карт.

    И вот я был...​

    Итак, за 5 дней до конференции HOPE (Хакеры на планете Земля) я готовился к нашему стенду, который будет работать все выходные. Подобный стенд у нас был на предыдущей выставке HOPE, и он был довольно успешным. Единственное, что нас раздражало, это то, что мы не могли легко принимать кредитные карты, а в банкомате закончились деньги. Мы могли принимать кредитные карты, но это занимало много времени и содержало множество опечаток, поскольку все нужно было вводить на веб-сайте. Видите ли, вместо квадратного терминала мы использовали виртуальный терминал — веб-сайт, который позволяет вам вводить все важные данные (номер карты, срок действия, имя, сумму и т. д.).
    projects_vterm.gif

    Конечно, виртуальный терминал был защищен сертификатом SSL, и мы использовали его через сотовую связь, а НЕ через Wi-Fi! Но, несмотря на безопасность, нам все равно пришлось вводить все данные в форму, и даже одна крошечная ошибка означает, что придется начинать все сначала!

    Части​

    Считыватель магнитных полос №1​

    В этом году мы хотели сделать это намного быстрее, чтобы людям не приходилось стоять по 3 минуты. Итак, у меня есть устройство для чтения магнитных полос! Первой моделью, которую я опробовал, была клавиатура-энкодер MAGTEK Centurion (PN-21073062).
    projects_magtek.jpg

    Самое приятное в этом ридере то, что он маленький, легкий, очень надежный, читает все три дорожки и по сути действует как стандартная USB-клавиатура. Другие ридеры могут иметь HID или другие драйверы, которые менее просты в использовании. Используя эту программу чтения, просто подключите ее, запустите текстовый редактор и проведите пальцем по экрану:
    projects_keyboard.gif

    Выходные данные — это данные с исправленными ошибками прямо с карты, все три дорожки, при условии, что это правильная кредитная карта в стандартном формате.
    Вывод данных следующий, разделенный по дорожкам.
    1. %^^ ?
    2. "= "
    3. ничего
    4. Первый трек используется почти исключительно для данных кредитных карт. Трек 2 используется практически для всего, включая старые карты банкоматов, другие удостоверения личности, услуги прачечной и т. д. Данные трека 3 обычно используются для получения водительских прав. Поскольку у меня нет такой лицензии, я не могу продемонстрировать трек 3.
      В любом случае, это все очень хорошо и интересно, и таким образом я могу получить все данные, которые захочу. Но что нам действительно нужно, так это что-то, что действительно могло бы проанализировать имя, срок действия и PAN (номер карты) из данных. Кажется, не было никаких продуктов, которые могли бы сделать это за нас, поэтому вместо этого я создал один!

      Считыватель необработанных магнитных полос №2​

      Я хотел получить эти необработанные данные до того, как они попадут в USB-порт. Я открыл Магтек и обнаружил, что его нелегко взломать.
    projects_magetekopen.jpg

    Поэтому вместо этого я купил головку с необработанной магнитной полосой у Mouser, помните, что нужные мне данные находятся на дорожке 1, поэтому я получил единственную головку, которая у них была с чтением дорожки 1, Omron V3A-6 (техническое описание здесь). Он также может читать дорожку 2.
    projects_head.jpg

    projects_encoder.jpg

    Его гораздо проще взломать: только декодеры магнитного потока (чипы) и все выводы данных выведены и задокументированы в таблице данных.
    projects_pinout.gif

    Контакты 1 и 2 очевидны: источник питания. Пин 3 я вообще не понял, но возможно это спящий режим. Контакт 4 — это цифровой выход, который переходит в НИЗКИЙ уровень при считывании карты ( CARD PRESENT ). Затем данные синхронизируются через контакты 5 (STROBE ) и 6 ( DATA):
    projects_timing.gif

    Все эти замечательные данные о времени взяты из удобной заметки приложения magtek (которую я настоятельно рекомендую всем любителям магнитной полосы!). Данные отбираются по заднему фронту и располагаются в порядке младшего разряда, что несколько противоположно большинству реализаций SPI.
    Данные не представлены в каком-либо «стандартном» представлении ASCII, на самом деле это 6 бит на байт с битом четности, чтобы сделать его длиной 7 бит. Каждый байт должен быть проверен на четность, а затем может быть преобразован в ASCII путем добавления шестнадцатеричного числа 0x20. В указанной примечании к приложению есть некоторые забавные подробности о том, как вычислять биты четности, или вы можете просто прочитать код. Опять же, это только для трека 1, трек 2 немного отличается.

    Подключиться​

    Подключение действительно тривиально, мы просто припаяли ленточный кабель к каждому контакту (хотя мы не использовали их все).
    projects_ribbon.jpg

    Затем подключили +5 В, землю и три контакта дорожки 1 к Teensy . Конечно, вы также можете использовать Arduino (или любой другой микроконтроллер) и просто использовать последовательный выход вместо клавиатуры для считывания данных.
    Мы также добавили пьезозуммер для звуковой обратной связи.

    Фрагменты кода​

    Это будет краткий обзор нескольких интересных моментов в исходном коде, который вы, конечно же, можете просмотреть на GitHub .
    Первая часть — это цикл чтения данных, который захватывает первые ~80 ненулевых байтов. Нам придется выбросить нули, поскольку они всего лишь буферы на краю магнитной полосы. Их должно быть как минимум 4, но мы их не используем, поэтому они игнорируются в цикле.

    Фрагменты кода​


    Загрузка кода​

    Код и документацию доступны на GitHub, нажав зеленую кнопку ниже. Выберите «Загрузить ZIP», чтобы получить код и документацию.
    Перейдите к учебному репозиторию GitHub для получения кода и документации.

    Обзор кода​

    Первая часть — это цикл чтения данных, который захватывает первые ~80 ненулевых байтов. Нам придется выбросить нули, поскольку они всего лишь буферы на краю магнитной полосы. Их должно быть как минимум 4, но мы их не используем, поэтому они игнорируются в цикле.

    Code:
    // дополнительную информацию см.
    // http://stripesnoop.sourceforge.net/devel/magtek-app.pdf
    
    void  Loop ()
    {
    // ждем, пока вывод готовности карты не станет низким
    while ( digitalRead (CARD2));
     
    uint8_t нули = 0 ;
    uint8_t паритет = 0 ;
     
    // карта была украдена!
    // проверка синхронизированных данных
    for ( uint8_t t1 = 0 ; t1 < TRACK1_LEN; t1++) {
    трек1[t1] = 0 ;
    for ( uint8_t b= 0 ; b <BYTELENGTH; b++) {
    
    // ждем, пока тактовый сигнал высокий
    while ( digitalRead (CLOCK2) && ! digitalRead (CARD2));
    // мы делаем выборку по заднему фронту!
    uint8_t x = digitalRead (DATA2);
    if (!x) {
    // данные — младший разряд и инвертированы!
            track1[t1] |= _BV(b);
          }
    // зависает, пока низкий
    уровень while (! digitalRead (CLOCK2) && ! digitalRead (CARD2));
        
        }
       
    if ((t1 == 0 ) && (track1[t1] == 0 )) {
    // избавляемся от ведущих нулей
         нули++;
         т1--;
    продолжать ;
        }
       
    // у нас должно быть несколько ведущих нулей!
    если (нули < 4 ) {
          т1--;
    продолжать ;
        }
       
    // если второй байт равен нулю, есть шум, возврат назад
    if ((t1 == 1 ) && (track1[t1] == 0 )) {
    т1 = -1 ;
    нули = 1 ;
    продолжать ;
        }
      }
     
    // все данные считываются в буфер track1
     
    // сдвигаем влево до тех пор, пока у нас не останется начальных нулевых битов!
    while ((track1[ 0 ] & 0x1 ) == 0 ) {
    shifttrack (track1, нуля, ВЛЕВО);
      }

    А вот часть после синтаксического анализа, где мы используем встроенную эмуляцию клавиатуры Teensy для подключения данных прямо к виртуальному терминалу . Обратите внимание, как он берет необработанные данные из дорожки и использует Keyboard.print() для их вывода, а также для перехода по записям браузера.

    Code:
     // НАЙТИ PAN
    uint8_t i= 2 ;
    while ((track1[i] & 0x3F ) != 0x3E ) {
    # ifdef SERIAL
    Serial. print ((track1[i] & 0x3F )+ 0x20 , БАЙТ);
    # endif
    # ifdef КЛАВИАТУРА
    Клавиатура. print ((track1[i] & 0x3F )+ 0x20 , БАЙТ);
    # окончание
          я++;
        }
    ...

    Code:
    #ifdef КЛАВИАТУРА
    Клавиатура .print ('\t');
    Клавиатура .print (m1, БАЙТ);
    Клавиатура .print (м2, БАЙТ);
    Клавиатура .print (y1, БАЙТ);
    Клавиатура .print (y2, БАЙТ);
       
    Клавиатура .print ('\t'); // табуляция для количества
    Keyboard .print ('\t'); // вкладка для выставления счета
    Keyboard .print ('\t'); // вкладка для описания
    клавиатуры .print («наборы для конференций HOPE от Adafruit.com»);
    Клавиатура .print ('\t'); // вкладка для идентификатора клиента
    Keyboard .print ('\t'); // табуляция для имени
    Keyboard .print (fname);
    Клавиатура .print ('\t'); // табуляция к фамилии
    Keyboard .print (lname);
         
    for (uint8_t i= 0 ; i< 5 ; i++) {
    Клавиатура .set_modifier (MODIFIERKEY_SHIFT);
    Клавиатура .set_key1 (KEY_TAB);
    Клавиатура .send_now ();
    Клавиатура .set_modifier ( 0 );
    Клавиатура .set_key1 ( 0 );
    Клавиатура .send_now ();
          }
    
    #endif
    
    звуковой сигнал(ПЬЕЗО, 4000 , 200 );

    После пролистывания форма заполняется автоматически, переходя между записями, а затем возвращаясь к полю суммы, чтобы ее можно было заполнить.
    project_filled.gif


    Полученные результаты​

    Свайпер работал отлично, он не только круто выглядел, но и работал безупречно все выходные, считывая десятки карт почти без проблем (одна очень старая карта с частью отслоившейся полосы доставила нам неприятности, но владелец признал, что это не сработало). в любом месте).
    projects_4799394816_88aa8b952f.jpg

    projects_4799375098_a981ef0ce3.jpg

    С помощью этого проекта мы узнали чертовски много о магнитных полосах и кодировании необработанных данных, и многие люди сообщили нам, что, поскольку он не предполагает стандартного форматирования, как большинство стандартных свайпов, его можно использовать для чтения нестандартных изображений. карты, такие как Metrocards! Мы надеемся, что другие создадут этот проект и будут использовать его для декодирования всех видов магнитных полос.
 
Top