TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

7.2.4. Проверка состава аппаратных средств

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

Некоторые иностранные фирмы для защиты мобильных программ выпускают так называемые электронные ключи — относительно дешевые

устройства, которые перед запуском защищаемой программы подсоединяются к стандартному каналу последовательного или параллельного ввода—вывода (например, для одной из используемых мною программ этот ключ вставляется как переходник между разъемом параллельного порта и кабелем принтера). Электронные ключи реализуются на основе заказных микросхем и осуществляют нужное интерфейсное взаимодействие с защищаемой программой.

Объем доступной оперативной памяти на IBM— совместимых ПК может составлять от 64 до 640 Кбайт (речь идет о стандартной памяти, см. п.5.1). При инициации ДОС в двухбайтное слово по адресу $0000:$0413 заносится количество килобайт доступной ДОС оперативной памяти. Следует заметить, что к моменту загрузки ДОС в памяти могут устанавливаться резидентные программы (чаще всего это драйверы устройств), так что доступная остальным программам ДОС память в общем случае будет меньше физической памяти ПК. Чтобы определить объем физически установленной в ПК оперативной памяти, следует предварительно определить тип ПК. Дело в том, что для компьютеров класса IBM AT и PS/2 используется специальная энергонезависимая КМОП—память1 , хранящая некоторую весьма полезную информацию о составе аппаратных средств ПК и, в том числе, — о доступной памяти, в то время как на компьютерах IBM PC и IBM XT такой памяти нет.

Структура КМОП—памяти может быть описана следующим образом:

type

CMOS_Type = record case Byte of

1: (

Sec . Byte {Секунды системного времени}

ASec Byte {Секунды будильника}

Min Byte {Минуты системного времени}

AMin Byte {Минуты будильника}

Hour Byte {Часы системного времени}

AHour Byte {Часы будильника}

DOW Byte {День недели текущей даты}

Day ' Byte {День текущей даты}

Month Byte {Месяц}

Year Byte {Год}

StatA Byte {Состояние порта А}

StatB Byte {Состояние порта В}

StatC Byte {Состояние порта С}

StatD Byte {Состояние порта D)

POST Byte {Статус завершения программы POST

(проверка работоспособности ПК)} Shut Byte {Байт состояния программы перезагрузки ДОС}

1 КМОП — сокращение от Комплементарная пара Металл—Окисел—Полупроводник (англ. CMOS) — название технологии изготовления микросхем с пониженным энергопотреблением. Энергонезависимость КМОП—памяти достигается ее питанием от автономной батарейки или аккумулятора.

{Начало массива из 17 байт, защищаемого контрольной суммой}

Diskette: Byte;{Тип накопителя ГД}

Re si Byte; {He используется}

HD Byte; {Тип накопителя ЖД}

Res2 Byte; {He используется}

Equipm Byte; {Байт оборудования}

BaseMem Word; {Объем основной памяти}

ExpnMem Word; {Объем расширенной памяти}

HD1 Byte; {Тип ЖД N1}

HD2 Byte; {Тип ЖД N2}

Res3 array [$1B..$20] of Byte; {He используется} {Конец защищаемого массива}

Res4 rray [$21..$2D] of Byte; {He используется}

Checks Word; {Контрольная сумма}

ExtendM Word; {Дополнительная память}

Century Byte; /Текущее столетие}

Miscell Byte; {Разная информация}

Res5 array [$34..$3F] of Byte) ;

2:(CMOS array [$0..$3F] of Byte) end;

Первые 10 байт этой структуры предназначены мя обслуживания системных часов. Информация в этих байтах хранится в так называемом двоично—десятичном формате (старший полубайт хранит десятки, а младший — единицы). Поскольку КМ ОП—память обычно питается от подзаряжаемого аккумулятора, системные часы работают даже после отключения ПК от сети и способны сохранять правильную дату практически неограниченно долго, если Вы регулярно включаете ПК/

Заметим, что поля ASec, AMin и AHour определяют момент времени инициации аппаратного прерывания IRQ8, с помощью которого можно автоматически запустить какую-либо программу реального времени (т.е. программу, которая должна исполняться в строго определенный момент реального времени).

Семнадцать байт, начиная с поля Diskette, защищены контрольной суммой, хранящейся «задом наперед» в поле Checks: младший байт содержит старшие разряды суммы, в то время как в соответствии со стандартом IBM в младшем байте должны храниться младшие биты слова. Проверка контрольной суммы осуществляется в ходе выполнения программы POST (программы контроля работоспособности ПК) при каждом включении компьютера и служит для оценки степени разряженности батарейки автономного питания КМОП — памяти.

Поле BaseMem хранит суммарный объем (в килобайтах) оперативной памяти ПК, а поля ExtdMem и ExtendM — объем дополнительной памяти.

Доступ к содержимому КМОП—памяти возможен только как к внешнему устройству, подключенному к портам $70 и $71: сначала в порт $70 следует поместить номер нужного байта (нумерация начинается с нуля), а затем прочитать значение этого байта из порта $71. КМОП—память отличается сравнительно большим временем доступа, поэтому между двумя

последовательными обращениями к портам полезно сделать небольшую паузу.

Объем установленной оперативной памяти можно определить с помощью приведенной ниже несложной программы, осуществляющей анализ КМОП—памяти для ПК типа AT или непосредственное тестирование микросхем ОЗУ (для PS/XT). При тестировании учитывается то обстоятельство, что память ПК наращивается так называемыми банками памяти по 64 Кбайт, причем чтение из любого байта несуществующего банка возвращает код 233. Таким образом, достаточно убедиться в наличии одного байта из каждых 64 Кбайт:

{+_-_--_---------------------—-----,»-----+

¦ Эта программа определяет количество ¦ ¦ оперативной памяти, установленной в ПК ¦ +——————————————————————————+/

var

b : Byte;

k,j,m,e: Word;

begin {Проверяем тип ПК}

if Mem[$FOOO:$FFFE]='$FC then {Компьютер типа IBM AT - читаем КМОП-память/ begin

Port[$70] := $15;

m := Port[$71]; {Основная память} Port[$70] := $16;

m := m+Port[$71] shi 8;

Port[$70] := $17;

e := Port[$71j; {Дополнительная память} Port[$70] := $18;

e := e+Port[$71] shi 8 end else

begin {Компьютер типа IBM PC/XT} e :=• 0; {Нет дополнительной памяти} m := 1; {Всегда есть 64 Кбайт стандартной памяти} for k := 1 to 9 do begin

j := k shi 12; {Номер очередного сегмента) if Mem[j:0]<>233 then

inc (ra) else

begin {Проверяем код 233} Mem [j:0] : = 0 ;

if Mem[j:0]=0 then begin inc (m) ;

Mem[j:0] := 233

end end end;

m := m*64 end;

WriteLn('B ПК установлено ',m,' КБайт основной памяти');

if е<>0 then

WriteLn(' и ',е, ' Кбайт дополнительной') end.

Информация о других устройствах, входящих в состав ПК, может быть получена на основании анализа так называемого регистра оборудования. Этот регистр для машин класса IBM XT формируется программами ПЗУ при загрузке ДОС и располагается в двухбайтном слове по адресу $0000:$0410. Его разряды имеют следующий смысл:

 

Разряд

Значение

Смысл

о

i

В ПК имеются накопители ГД

i

i

Есть арифметический сопроцессор

2-3

3

Бсть стандартная память 64 Кбайт

4-5

 

Тип активного видеоадаптера:

 

0

Адаптер EGA или VGA

 

1

Цветной адаптер 40х25

 

2

Цветной адаптер 80х25

 

3

Монохромный адаптер

6-7

 

Число НГД (если бит 0 имеет значение 1)

8

 

Не используется

9-11

 

Количество адаптеров связных каналов

12

1

Есть игровой порт

13

 

Не используется

14-15

 

Количество принтеров


Для IBM AT информацию о переферийных устройствах содержит поле Equipm в КМОП—памяти. Назначение разрядов этого байта аналогично назначению разрядов О...7 регистра оборудования, за исключением разрядов 2...3, которые не используются. Количество связных каналов последовательного типа для компьютеров этого класса можно получить путем анализа области памяти BIOS: начиная с адреса $0000:$0400 в памяти располагаются четыре двухбайтных слова, содержащие адреса последовательных портов; порту СОМ1 соответствует адрес в слове $0000:$0400, а COM4 — в слове $0000:$0406; нулевое содержимое этих слов говорит об отсутствии соответствующего канала связи. Точно так же можно анализировать адреса параллельных портов ($0000:$0408,...,$0000:$040Е).

Следующая программа сообщает оСъс;! памяти, указываемый в слове $0000:$0413, и расшифровывает рс.истр (G^h) оборудования и область адресов каналов связи (для AT):

^—————————————————————————+

¦ Программа анализирует байт оборудования \ ¦ и выводит на экран его расшифровку I

+——————————————+;

var

a,b: Word;

begin

{Сообщаем объем оперативной памяти}

WriteLn(MemW[0:$413],' Кбайт оперативной памяти');

{Определяем тип ПК}

if Mem[$FOOO:$FFFE] = $FC then begin {Тип AT}

WriteLn('Компьютер типа IBM AT содержит:');

Port[$70] := $14;

a := Port[$71] ;

if a and K>0 then case (a shr 6) and 3 of

0: WriteLn('- один накопитель ГМД');

1: WriteLn('- два накопителя ГМД');

end;

if a and 2 о 0 then

WriteLn('- арифметический сопроцессор');

case (a shr 4) and 3 of

0: WriteLn('- адаптер EGA или VGA');

1: WriteLn('- цветной адаптер 40х25');

2: WriteLn('- цветной адаптер 80х25');

3: WriteLn('- монохромный дисплей') end;

{Анализируем количество последовательных портов} а := 0;

for b := 0 to 3 do

if MemW[O:$4OO+b shi 2]<>0 then inc (a) ;

WriteLn('- ',a,' последовательных порта');

{Анализируем количество параллельных портов) а := 0;

for b := 0 to 3 do

if MemW[O:$408+b shi 2]<>0 then inc (a) ;

WriteLn('- '/а,' параллельных порта') end else

begin {Тип XT}

WriteLn('Компьютер типа IBM XT содержит:');

a := MemW[0:$ 410];

if a and 1<>0 then

WriteLn('- ',(a shr 6) and 3,' накопителей ГМД');

if a and 2<>0 then

WriteLn('- арифметический сопроцессор');

if a and 12<>0 then

WriteLn('- базовую память 64К');

case (a shr 4) and 3 of

0: WriteLn('- адаптер типа EGA или VGA');

1: WriteLn('- цветной адаптер 40х25');

2: WriteLnC- цветной адаптер 80х25');

3: WriteLn('- монохромный адаптер') end;

WriteLnf'- ',(a shr 9) and 7,' каналов связи');

if (a shr 12) and lo0 then

WriteLn('- игровой порт');

WriteLn('- ',(a shr 14),' принтеров') end end.

Производительность микропроцессора обычно измеряется с помощью многократного прогона тестового участка программы за заданный интервал времени. Количество прогонов и является мерой производительности ПК. Для определения нужного интервала времени удобнее всего использовать переменную типа Longint по адресу $0000:$046С, в которой ДОС хранит текущее системное время в виде количества 55 — миллисекундных интервалов, прошедших от 0 часов.

Следующая программа оценивает производительность процессора и выводит на экран среднее количество прогонов тестового участка программы за один 55 — миллисекундный интервал:

{ Определение производительности ПК ] const

N = 10; {Количество повторов} var

Time: Longint; {Моменты времени} k : Longint; {Счетчик вычислений} j : Integer; {Счетчик повторов} begin k := 0;

for j := 1 to N do begin

Time := MemL[0:$O46C]; {Начальное время} while MemL[O:$O46C]=Time do

; {Ждать, пока не изменится время} inc(Time,2); {Конечное время} while MemL[O:$O46C]OTime do

inc(k); {Цикл вычислений} end;

WriteLn(k div N) end.

В этой программе цикл

while MemL[0:$046C]«Time do;

введен для синхронизации начала вычислений с началом очередного 55 — миллисекундного интервала. Как показывает практика, получаемая такой программой оценка производительности очень индивидуальна. Мне, например, не удалось найти среди 8 однотипных компьютеров ни одной пары с одинаковой числовой мерой производительности. Следует, правда, оговориться, что на двух ПК эта мера менялась от одного прогона программы к другому приблизительно на 0.5%, что, судя по всему, является следствием нестабильности работы тактовых генераторов. В связи с этим при разработке коммерческой системы защиты на основе измерения производительности ПК необходимо вводить некоторый доверительный интервал, связанный с нестабильностью работы тактовых генераторов, а это — увы! — существенно уменьшает степень индивидуальности оценки.

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz