Шаг третий. Джин в
бутылке или Считываем инфу.
Ну а теперь перейдем от
теории к практике. И первым нашим шагом
будет сборка ридера
карточки (card reader), т.е. считывающего
устройства. Наиболее
простым вариантом является сборка ридера
для подключения его к LPT-порту
компьютера. Схема элементарна (тут).
Дальше следует написать простейшую прогу,
которая будет считывать с карточки инфу и
выдавать ее в более или
менее удобочитаемом виде. Пример такой
программы приведен ниже.
program Phonecard_reader;
uses Crt;
const
LPT=$378; {Базовый адрес порта LPT}
del=1; {константа задержки в 1 мс}
procedure Clk(v:byte); {Clk(1) - устанавливает высокий
уровень CLK
Clk(0) - устанавливает низкий уровень CLK}
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FE
else
tmp:=tmp or 1;
Port[LPT]:=tmp;
end;
procedure Reset(v:byte); {Reset(1) -
устанавливает высокий уровень RST
Reset(0) - устанавливает низкий уровень RST}
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FD
else
tmp:=tmp or 2;
Port[LPT]:=tmp;
end;
function GetData:Byte;
var
tmp:Byte;
begin
tmp:=Port[LPT+1];
if tmp=120 then
GetData:=1
else
GetData:=0;
end;
procedure SetData(v:byte);
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FB
else
tmp:=tmp or 4;
Port[LPT]:=tmp;
end;
var
arr:array[0..1024] of byte;
idx:word;
f:text;
begin
assign(f,'con'); {По умолчанию вывод идет на экран.
Вместо con
можно поставить имя
файла, и вывод будет
направлен в него}
rewrite(f);
idx:=0;
textmode(Font8x8 or CO80);
clrscr;
Clk(0);Reset(0);delay(del);
Reset(1);delay(del);
Clk(1);delay(del);Clk(0);delay(del);Reset(0);delay(del);
repeat
begin
if (idx mod 8)=0 then
write(f,#13#10+'Byte ',(idx div 8):2,' :')
else
if (idx mod 4)=0 then
write(f,' ');
Clk(1);delay(del);
arr[idx]:=GetData;
Clk(0);delay(del);
write(f,arr[idx]);
inc(idx);
end;
until idx=1024;
while keypressed do readkey;
writeln(#13#10'Press any key to exit ...');readkey;
close(f);
end.
Для тех, кто весьма ленив
и не любит топтать клавиатуру, могу порекомендовать
готовую прогу, называемую SmartLab.
Комменты, как говорится, излишни. Вся
дополнительная информация находится в help-файле
этой проги. Ну, а теперь
разберем, что же означают все эти байтики,
болтики и винтики, которые
мы выгребли из карточки. (Несущественные
данные пропущены).
Байт | Биты | Значение/Описание |
1 | 1-8 | D8 старые карты DD новыекарты |
2 | 9-16 | код страны |
5 | 33-36 | номинал карточки |
5 | 37-40 | последняя цифра года выпуска |
6 | 41-44 | № месяца выпуска |
6-9 | 45-64 | серийный номер |
9 | 65-72 | 4096* NBS единиц |
10 | 73-80 | 512* NBS единиц |
11 | 81-88 | 64* NBS единиц |
12 | 89-96 | 8* NBS единиц |
13 | 97-104 | 1* NBS единиц (NBS-число установленных битов) |
14-40 | 105-320 | FF - проверочная область |
Итак, можно выделить
следующие информационные области на карте:
заголовок, счетчик и
фуфел. Заголовок содержит 40 бит информации,
которые жестко программируются
изготовителем карт. Обычно эта область
содержит чисто служебные данные, которые в
принципе нам нужны только для
информативности. Следует иметь в виду, что
некоторые производители в битах 36-64 пишут
копию даты выпуска и серийного номера.
Кроме этого, интересной фишкой является то,
что первыми четыремя цифрами серийного
номера всегда будет дата выпуска, т.е., 0600
будет означать июнь 2000 года. Назначение
счетчика понятно: вначале все биты
установлены в 00, потом как только таксофон
"съедает" единицу времени, соответствующий
бит принимает значение FF. Проверочная
область - область, на
которой производитель проверяет
работоспособность чипа. И, наконец, все, что
находится после 40 байта, не имеет для нас
никакого значения. Последние две области и
есть тот фуфел, который только мешает и
вносит кучу неразберихи
в этот вопрос.
Значение счетчика
определяется по следующему принципу:
Байт
9
10
11
12 13
8-езначение 00000001 00011111
01111111 00000011 00011111
10-езначение
1
5
7
2 5
Переводим из 1*8^4 + 5*8^3
+ 7*8^2 + 2*8^1 + 5*8^0
8-й СС в 10-ю 4096 +
2560 + 448 +
16 +
5 =7125
Воспользовавшись этой
статьей, ты можешь считать свою карту и
понять, что, как и где
находится именно в твоей карте. По
служебной информации ты также при желании
сможешь определить тип чипа. На
этом наш подготовительный этап
заканчивается, и следующим нашим шагом
будет построение эмулятора карты.