Реклама ⓘ
Главная » Телефония
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Эмулятор для начинающих (часть 3)

Часть 3.

Наконец приступаем к основной части нашего повествования - созданию действующего прототипа карты. Для этого нам необходимо получить содержимое любой карты. Пусть это будет

                0xe8,0x30,0xcf,0x0f,0x05,0x0a,0x31,0xc4
                0x00,0x00,0x00,0x00,0x00
                0xff,0x12,0x04

Вся информация представлена в шестнадцатеричном виде в форме, принятой в языке С. Во второй строке мы видим одни нули - это и есть пресловутый кредит карты. Как мы уже договаривались - он равен нулю, т.е. карта пустая. Как изготовить железную часть эмулятора? Очень просто. Возьмите кусок фольгированного одностороннего стеклотекстолита толщиной 0,8 мм. Если текстолит более толстый - отчаиваться не стоит. Его легко можно расслоить при помощи ножа и добиться требуемой толщины. Размеры текстолита выбираются следующим образом: наложите на текстолит таксофонную карту. Обведите ее контур. Теперь длинную сторону удлините на 40-50 мм. Возьмите использованную карту, аккуратно при помощи острого ножа вырежте кристалл из карты. Наложите карту с отверстием на текстолит и обведите контур полученного отверстия. Вырезав по внешнему контуру мы получим заготовку эмулятора. Далее на противоположном краю от контактной площадки заготовки разместите микросхему микропроцессора. Рассверлите 18 отверстий под выводы. Далее при помощи цапонлака аккуратно закрасьте контактную площадку на заготовке. После высыхания при помощи ножа процарапайте разделительные канавки. Далее соедините полученные площадочки с соответствующими отверстиями под выводы чипа. Таблица соединений такова:

                     I/O - 3 (RA4)
                     GND - 5 (GND)
                     Vcc - 4,14 (MCLR, Vcc)
                     RST - 13 (RB7)
                     CLK - 12 (RB6) 
             Между 16 и 14 выводами включается 
           частотозадающий резистор (около 3 кОм)
                        

Остальные выводы не подключены. Соединение производить все тем-же цапон-лаком. Теперь, дав лаку просохнуть, плату необходимо протравить. Это можно сделать быстро при помощи азотной кислоты, но безопасней воспользоваться хлорным железом, которое можно приобрести в магазине химреактивов. Всю технологию изготовления платы рассказывать не буду, отсылаю к соответствующей литературе. После травления не стоит впаивать микропроцессор в плату. Запаяйте туда панель, в которую и втыкается микропроцессор. В принципе, если на плату установить перемычки, вывод MCLR завести на неиспользуемую площадку карты - то можно будет программировать PIC через контактные площадки карты. На что хочу обратить внимание, программа написана на языке высокого уровня (Си), в критических местах используются ассемблерные вставки. С точки зрения быстродействия и задержек программа страшно не оптимальна. Однако для представления общей идеи функционирования карты она достаточно прозрачна. Если кто-то из вас захочет изменить реализцию, оптимизирует с точки зрения быстродействия и готов поделиться с общественностью - присылайте мне, с удовольствием опубликую.

Я думаю, объяснение принципов работы стоит начать с публикации исходного текста программы.

/**********************************************************************
*           ISO 7816 Synchronous Memory Card Emulator                 *
*           Programmed by SNG. All rights reserved.                   *
*           (c) SNG - (99,2000) sng@newmail.ru                        *
*           Partially (c) Stephane BAUSSON - (93,94,95)               *
**********************************************************************/

#include 

/*
 *   Pin assignment
 *
 *   Port A
 *   RA4 - I/O
 *
 *   Port B 
 *   RB6 - CLK
 *   RB7 - RST
 */

__CONFIG(UNPROTECT | FOSC0 | FOSC1 | PWRTE); // Fuses

// Card data. Write to EEPROM.
#asm
        psect   eedata,delta=2,abs,ovrld
        org     2100h
        db      0xe8,0x30,0xcf,0x0f,0x05,0x0a,0x31,0xc4
	db	0x00,0x00,0x00,0x00,0x0f
	db	0xff,0x12,0x04
#endasm

#define	DATABIT(adr, bit)   ((unsigned)(&adr)*8+(bit))
#define INTBITS  0x88

static bit out @ DATABIT(PORTA, 4);
static bit clk @ DATABIT(PORTB, 6); // Clock input
static bit rst @ DATABIT(PORTB, 7); // Reset input

static unsigned char cbit = 0, cbyte = 0, status = 0, data, temp;

/*   status:
 *   0 - read
 *   1 - write
 *   2 - write complete
 *   3 - carry
 */

void incbit(void) // next address and prepared current bit
   {
   status = 0;
   if (cbit < 7)
      {      
      cbit++;
     #asm
      bcf _STATUS,0
      rlf _data,f
      btfsc _STATUS,0
      incf _data,f
     #endasm
      }
   else 
      {
      if (cbyte < 63)
         cbyte++;
      else
         cbyte = 0;
      cbit = 0;
      if (cbyte < 16)
         { 
         data = EEPROM_READ(cbyte);
        #asm
         swapf _data,f
         bcf _STATUS,0
         rlf _data,f
         btfsc _STATUS,0
         incf _data,f
        #endasm
         }
      else data = 0xff;
       }
   return;
   }

void setbit(void) // write current bit
   {
   status = 2;
   if (cbyte < 8) return;
   if (cbyte > 12) return;
   data = EEPROM_READ(cbyte);
   temp = 0x80;
   temp >>= cbit;
   temp ^= 0xff;
   data &= temp;
   EEPROM_WRITE(cbyte, data);
   return;
   }

void carry(void) // carry after write
   {
   status = 0;
   if (cbyte < 8) return;
   if (cbyte > 11) return;
   EEPROM_WRITE(cbyte+1, 0xff);
   return;
   }

interrupt void event(void) // interrupt
   {
   if (!rst) // RST - low
      {
      PORTA = data; // output current data
      if (clk) // CLK - high (Next address or write bit or carry after write)
         {
            switch (status)
               {
               case 1: setbit();
                       break;
               case 3: carry();
                       break;
               default: incbit();
               }
         }
      }
   else // RST - high
      {
      if (clk) // CLK - high (Reset card)
         {
         cbit = 0;
         cbyte = 0;
         status = 0;
         data = EEPROM_READ(0);
        #asm
         swapf _data,f
         bcf _STATUS,0
         rlf _data,f
         btfsc _STATUS,0
         incf _data,f
        #endasm
         }
      else // CLK - low (Write or carry mode)
         {
         if (cbyte != 0)
            {
            if (status == 2) status = 3;
            else status = 1;
            }
         }
      PORTA = 0x00;
      }
   RBIF = 0; // Clear PORTB interrupt flag
   return;
   }

void main(void)
{
   CLRWDT();
   PORTB = 0x00;
   INTCON = INTBITS;
   TRISA = 0x00; // PORT A - set to output
   TRISB = 0xc0; // RB6, RB7 - set to input
   data = EEPROM_READ(0);
  #asm
   swapf _data,f
   bcf _STATUS,0
   rlf _data,f
   btfsc _STATUS,0
   incf _data,f
   movf  _data,w
   movwf _PORTA
  #endasm
   while (1);
}

Программа начинается с конфигурационного слова. Выключаем задержку на стабилизацию таймера, используем RC генератор и отключаем защиту кода программы. Далее следует содержимое смарткарты, которое записывается в EEPROM PIC. Определим состояния, в которых может находиться смаркарта. Затем следует процедура инкремента бита карты, проще говоря переход на следующий адрес и подготавка информации к выводу. Следующая процедура SETBIT записывает текущий бит, т.е. изменяет состояние кредита и сохраняет его в EEPROM. Далее следует процедура обработки прерывания. Попытаюсь объяснить. Изменение состояния на ножках микроэвм вызывает прерывание, т.е. эту функцию. Обработчик анализирует текущие уровни RST и CLK, в соответствии с которыми поизводятся соответствующие действия. При низком уровне RST на выходе присутствует текущий бит. Далее анализируется уровень CLK. При высоком уровне вызывается соответствующая процедура, в зависимости от режима смарткарты. Это или смена адреса (INCBIT), или запись текущего бита (SETBIT), или запись с переносом (CARRY). При высоком уровне RST на выходе должен присутствовать сигнал логического нуля. Далее анализируется состояние карты. Если сигнал CLK неактивен (низкий), то статус карты изменяется. Карта либо переводится в режим записи или в режим записи с переносом в зависимости от текущего состояния. При высоком уровне CLK карта переводится в режим инициализации, т.е. режим начальных установок (как после включения питания). Основная процедура (MAIN) подготавливает режим работы микроэвм, настраивает порты, прерывания и устанавливает на выходе бит по нулевому адресу. Затем следует бесконечный цикл, прерываемый только при изменении уровней на любом из входов карты. Из всего вышесказанного можно сделать некоторые выводы: содержимое карты хранится в EEPROM, соответственно может быть изменено без перезаписи микрокода, используются только первые 16 байт содержимого карты. Если необходимо большее количество - необходимо изменить константы в процедуре SETBIT. Эмулятор функционирует в наибольшем приближении к реальности, но не на 100% реализует карту. Наиболее внимательные наверняка заметили, что значение кредита на карте не нулевое. Если его изменить на нуль, перезаписать содержимое EEPROM и воспользоваться эмулятором на таксофоне МГТС - мы получим сообщение: кредит исчерпан. Т.е. именно то, что вам и было обещано. Если же мы попытаемся воспользоваться эмулятором с ненулевым кредитом - мы получим сообщение: операция невозможна. Это говорит о том, что таксофон получив карту с ненулевым кредитом пытается установить ее валидность. Подробно о том как это происходит написано в моем "Эссе об авторизации". В заключение хочу добавить, что стоит воспользоваться PICом с максимально возможной частотой. Например 10 МГц, т.к. программа НЕОПТИМАЛЬНА с точки зрения быстродействия. Тем же кто спросит, зачем была написана эта статья, я повторю - не все так просто. Это только основы изготовления эмулятора, они знакомят нас с принципами функционирования смарткарт и открывают обширное поле для исследований. Вдруг кому-то из вас удастся реализовать алгоритм авторизации карты, или ответить на вопрос зачем производится запись по адресу 64. Стоит подумать о возможности существования сервисных карт, определяемых например особым содержанием или реакцией карты на попытку записи по адресу 64, да мало ли что еще! Пишите, вместе мы сможем многое. Хочу только еще раз напомнить о том, что вся информация может быть использована ТОЛЬКО в образовательных целях, использовать вы ее будете на свой страх и риск.

Теперь несколько ссылок: исходный код, программа для PIC.

Теперь несколько слов для тех, кто ждет моего обещания раскрыть несостоятельность реализации приставки для настоящей карты. Я не могу однозначно утверждать, что данная идея плоха, неработоспособна и т.д. Просто хочу еще раз отправить к "Эссе" и напомнить, что для расчета ответа на запрос при авторизации используется значение кредита. Таксофону будет передан один кредит, у карты другой. Ответы будут разные - авторизация не пройдет. Хотя до меня доходили слухи о реализации подобных устройств в железе. Верить или не верить, вот в чем вопрос. Однако могу утверждать, что все случаи имели место не в Москве, о МГТСовских реализациях я не слышал. Если у кого-то есть нечто подобное, рабочий эмулятор с авторизацией, либо шлюз с картой - хотелось бы взглянуть. О результатах своих изысканий пишите...

none Опубликована: 2002 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
саша #
Каким компилятором обрабатывалась программа?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Ветрогенератор
Ветрогенератор
ELM327 OBD II — адаптер с поддержкой CAN Модуль измерения тока на ACS712 (30А)
вверх