Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
защита программ.doc
Скачиваний:
6
Добавлен:
29.08.2019
Размер:
301.06 Кб
Скачать

Привязка к bios

Рассмотрим теперь использование BIOS для защиты от копирования программ с жесткого диска.

Программа может определить дату изготовления BIOS, прочитав 8 байт из области памяти, расположенной по адресу F000h:FFF5h.

Более подробную информацию о BIOS можно получить, воспользовавшись функцией C0h прерывания INT 15h . Эта функция возвращает в регистрах ES:BX адрес таблицы конфигурации:

Смещение, байт

Размер, байт

Описание

0

2

Размер таблицы в байтах

2

1

Код модели компьютера

3

1

Дополнительный код модели

4

1

Версия изменений BIOS (0 - первая реализация, 2 - вторая и т. д.)

5

1

Байт конфигурации оборудования

6

2

Зарезервировано

8

2

Зарезервировано

Анализируя байт конфигурации оборудования, можно определить состав аппаратного обеспечения:

Бит

Описание

0

Зарезервировано

1

Если этот бит установлен, компьютер оборудован шиной Micro Channel, в противном случае используется шина ISA, PCI или EISA

2

Используется расширенная область данных BIOS

3

BIOS способна ожидать внешние события

4

Каждый раз после вызова прерывания от клавиатуры INT 9h вызывается функция 4Fh прерывания INT 15h

5

В компьютере есть часы реального времени

6

Имеется второй контроллер прерываний

7

Для работы с диском BIOS использует канал 3 контроллера прямого доступа к памяти

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

Программа biosver

В листинге 5.7 приведен исходный текст программы BIOSVER, которая отображает дату изготовления BIOS, а также расширенную информацию о BIOS, полученную с помощью функции C0h прерывания INT 15h .

Листинг 5.7. Файл biosver\biosver.cpp

#include <stdio.h>

#include <conio.h>

#include <dos.h>

typedef struct _BIOSINFO_

{

unsigned size;

unsigned char model;

unsigned char submodel;

unsigned char version;

unsigned char hardcfg;

unsigned reserved1;

unsigned reserved2;

} BIOSINFO;

void main(void)

{

void far *biosdate;

BIOSINFO far *binfo;

int i;

union REGS rg;

struct SREGS srg;

biosdate = (void far*)MK_FP(0xf000, 0xfff5);

printf("\n\nДата изготовления BIOS: ");

for(i = 0; i < 8; i++)

putch(*((char far*)biosdate + i));

rg.h.ah = 0xc0;

int86x(0x15, &rg, &rg, &srg);

binfo = (BIOSINFO far*)MK_FP(srg.es, rg.x.bx);

printf("\nКод модели: %02.2X"

"\nДополнительный код модели: %d"

"\nВерсия изменений BIOS: %d"

"\nКонфигурация оборудования: %02.2X\n",

binfo->model, binfo->submodel,

binfo->version, binfo->hardcfg);

}