Как читают телефонные карты, или научись цеплять к своему компу девайсы
Спецвыпуск Xakep, номер #011, стр. 011-088-4
procedure pause;
VAR p:word;
begin
for p:=1 to 1000 do;
end;
И наконец - то, к чему мы так долго стремились. Когда будешь читать, тоже посматривай в стандарт и на диаграммы. Потому что мы, начитавшись стандартов, в этой процедуре крутим Клок с Ресетом так, чтобы сбросить карту. А сбросить надо ее для того, чтобы прочитать всю инфу с начала, а не с середины.
Сброс счетчика адреса карты в 0:
procedure card_reset;
begin
c_reset;
c_clk;
pause;
s_reset;
pause;
s_clk;
pause;
c_clk;
pause;
c_reset;
cntr:=0;
end;
После того как мы сбросили карту, т.е. попали в начало ее памяти, нужно потихонечку выкачивать с нее инфу. Для этого мы чешем карту Клоком и Ресетом, а она в ответ выдает нам в функцию IO свои данные по одному биту. Осталось только сложить биты в массив и заняться расшифровкой. Про то, как надо правильно чесать карту, чтобы она давала инфу, мы тоже узнали из стандарта.
Чтение следующего бита памяти карты:
function next_bit:byte;
begin
pause;
s_clk;
pause;
c_clk;
pause;
next_bit:=io;
inc(cntr); {Увеличить счетчик на 1}
end;
На этом стоит закончить наши экзерсисы с портом, иначе мозги вскипят и сдетонируют как пикриновая кислота. Если ты все-таки хочешь продолжить, полный текст программы можно найти на нашем сайте.
Содержимое памяти карты
Теперь прочитанные биты должны перевариться, и программа выплюнет содержимое карты в более-менее понятном виде. Из этой инфы ты можешь узнать код производителя, номер карты и количество единичек, оставшихся на карте.
Вот что выдала программа, когда подключили карту.
--------- Memory dump ---------
232 48 207 16 5 8 60 138
{0 0 0 1 3} 255 104 4
----------- End dump ----------
Как посчитать число кредитов
Пять байт в скобках кодируют количество кредитов на карте.
Надо посчитать по формуле: a0*8^0+a1*8^1+a2*8^2+a3*8^3+a4*8^4
Где: a0 - число единичных бит в самом правом из пяти байт, отведенных под хранение числа единиц, а a4 - число единичных бит в самом левом из пяти этих же байт. Остальные биты между ними читаются справа налево.
А чтобы было понятнее, давай для примера определим число кредов на нашей карте. Смотрим на байты в скобках. Нулевой байт равен трем. Чтобы ты не сразу свихнулся, наша прога преобразует двоичные числа в десятичные, так лучше видно. Но чтобы посчитать число кредов, надо пользоваться двоичной системой. Можешь заюзать калькулятор от своего виндовса.
Значит, так:
Нулевой байт (N=0) у нас тройка 3=0000 0011, единичек здесь две (a0=2).
Первый байт (N=1) у нас единица 1=0000 001, единичек две (a1=1).
Остальные байты (N=2, N=3, N=4) нулевые, т.е. единичек всюду ноль (a2=a3=a4=0).
Ну а теперь подставляем в формулу:
a0+a1*8+a2*64+a3*512+a4*4096 = 2+1*8+0*64+0*512+0*4096=2+8=10 кредов.
Как ломают карты
Если ты дочитал до этого абзаца - значит, ты уже крут и горишь желанием записать пару лишних единичек на твою телефонную карту с той стороны, где восьмерка в четвертой степени. Но телефонисты тоже не дураки, поэтому эта маленькая часть нашего мануала дана только для ознакомительных целей.
Есть, конечно, некая процедура... Но она фундырычит только на удаление. Когда карту зашивают на заводе, в чипе пережигают перемычку, и после этого с карты можно только снимать креды. Добавить уже нельзя! Но есть и счастливые карты с недожженной перемычкой или вообще новые, без инфы. В такую карту мы можем записать все что хочется. На крайняк можно самому запаять схему, похожую на чип в карте. Взять микропроцессор, закодить его и припаять к контактам сдохшей карточки. Вот если с таким поймают монтеры...