Более интересный способ защиты опирается на измерение внутренних временных характеристик системной платы. Три основные подсистемы доступны для таких измерений: CPU, память, подсистема ввода/вывода (См. приложение E). Фактические различия могут оказаться неожиданно большими.
Система |
CPU |
Память |
I/O |
25 MHz 80386 (A) |
35972 |
24576 |
47292 |
25 MHz 80386 (B) |
35972 |
24576 |
49154 |
20 MHz 80386 |
44958 |
30112 |
59990 |
12 MHz 80286 |
3544 |
41018 |
46646 |
Табл. Параметры системных плат четырех разных машин.
Значения, показанные в таблице, являются усредненными, и получены после многократного запуска программы . Действительные значения могут отличаться от означенных выше приблизительно на ё4. Системы (A) и (B) имеют два последовательных серийных номера, но могут быть легко отличимы друг от друга по временной характеристике ввода/вывода (Порт 0Ch, использовался первый контроллер DMA). Следует также заметить, что интервал времени ввода/вывода очень чувствителен к режиму процессора (реальный или защищенный), а временные параметры CPU и памяти почти одинаковы в обоих режимах.
#pragma inline
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <alloc.h>
#define INSTRUCTIONS (16*1024u)
void init_timer_channel( unsigned char channel )
{
asm pushf
asm cli
asm mov al, channel
asm ror al, 1
asm ror al, 1
asm or al, 36h
asm out 43h, al
asm mov dx, 40h
asm add dl, channel
asm jmp $+2
asm jmp $+2
asm xor al, al
asm out dx, al
asm jmp $+2
asm jmp $+2
asm out dx, al
asm popf
}
unsigned
read_sound_timer( void )
{
/*
* ! This function should not change any register except AX !
*/
asm mov al, 80h
asm out 43h, al
asm jmp $+2
asm jmp $+2
asm in al, 42h
asm jmp $+2
asm mov ah, al
asm in al, 42h
asm xchg ah, al
asm neg ax
return _AX ;
}
#define disable_count() (outportb(0x61,inportb(0x61)&(unsigned char)~1))
#define enable_count() (outportb(0x61,inportb(0x61)|(unsigned char)1))
void instruction_fill( char far *buf, unsigned cnt, char instr[ 2 ] )
{
while( cnt-- > 0 ){
*buf++ = instr[ 0 ] ;
*buf++ = instr[ 1 ] ;
}
*buf++ = 0xCB ; /* retf */
}
unsigned
measure( char far *routine )
{
unsigned time ;
init_timer_channel( 2 ) ;
disable_count() ;
asm push cs
asm lea ax, ret_point
asm push ax
asm les bx, routine
asm push es
asm push bx
asm xor dx, dx
asm mov bx, 1
asm cli
enable_count() ;
asm mov ax, bx
asm retf
asm ret_point label near
disable_count() ;
time = read_sound_timer() ;
asm sti
return time ;
}
int
main( int argc, char *argv[] )
{
char far *buf ;
unsigned idle_time ;
unsigned CPU_mark, mem_mark, DMA_mark ;
if( ( buf = farmalloc( INSTRUCTIONS * 2 + 1 ) ) == NULL ){
perror( "No memory" ) ;
return -1 ;
}
instruction_fill( buf, 0, NULL ) ;
idle_time = measure( buf ) ;
instruction_fill( buf, INSTRUCTIONS, "\xF7\xF3" ) ;
CPU_mark = measure( buf ) - idle_time ; /* div bx */
instruction_fill( buf, INSTRUCTIONS, "\xC4\x07" ) ;
mem_mark = measure( buf ) - idle_time ; /* les ax, [bx] */
instruction_fill( buf, INSTRUCTIONS, "\xE6\x0C" ) ;
DMA_mark = measure( buf ) - idle_time ; /* out 0Ch, al */
printf( "Idle time = %u\n", idle_time ) ;
printf( "CPU mark = %u\n", CPU_mark ) ;
printf( "Memory mark = %u\n", mem_mark ) ;
printf( "DMA mark = %u\n", DMA_mark ) ;
return 0 ;
}
К вопросу об индивидуальных параметрах ПЭВМ
Кроме копирования ГМД «диск в диск», возможно копирование только информационных или исполняемых файлов на Другую ПЭВМ. При этом для определения факта переноса на другую ПЭВМ, помимо проверки некопируемых меток на винчестере, можно учитывать и стабильные индивидуальные или редко встречающиеся параметры аппаратной части ПЭВМ.
К ним можно отнести:
- серийные номера процессора, микросхемы BIOS;
- стандартную аппаратную конфигурацию данной ПЭВМ;
- содержание ПЗУ;
- частотные и временные характеристики узлов ПЭВМ.
Недостатком данного метода является то, что процессоры Intel 8086, Intel 80286 не имеют серийного номера, который можно было бы считать программными средствами; содержание ПЗУ для некоторых экземпляров ПЭВМ бывает одинаково; дата создания микросхемы BIOS отсутствует или одинакова у ПЭВМ типа IBM PC/XT. Поэтому, учитывать только эти параметры недостаточно для надежной идентификации ПЭВМ.
Кроме выделенных параметров для ПЭВМ, имеющих энергонезависимую память (для работы часов и хранения конфигурации), возможно записывать свою информацию в эти области памяти и далее проверять ее наличие и содержание. Такая метка очень легко ставится и так же легко находится, поскольку свободной памяти в CMOS мало.
Кроме того, в последнее время широкое распространение получили продукты, которые используют плату расширения BIOS'a (аппаратно-программная антивирусная защита VIRUS ELENINATOR, плата шифрования Krypton-3 и т. д.). В том случае, если Ваше программное обеспечение достоверно используется на ПЭВМ, оснащенных расширением BIOS'a, возможно проверять его наличие или анализировать фрагменты кода или данных в этих расширениях BIOS'a. Это не составляет труда, поскольку расширение имеет легко определяемый адрес сегмента.
; считывание даты создания BIOS
; дата создания BIOS находится в ПЗУ по адерсу F000:FFF5 и занимает 8 байт в
; формате мм / дд / гг, где: мм – месяц, дд – число, гг – две последние цифры года . . .
; в этой переменной разместится считанная дата создания BIOS
d –date db 8 dup (0)
. . .
mov ax , 0F00h
mov es , ax
mov bx , 0FFF5h
xor di , di
m: mov ax , es : [ bx ]
mov b_date [ di ] , ax
add di , 2
add bx , 8
cmp di , 8
jne m
; вывод строки на экран
mov dx , offset b_date
mov ah , 09h
int 21h
; Считывание слова аппаратной конфигурации ПЭВМ.
mov ax , 0410h
mov es , ax
mov bx , 0
mov ax , es : [ bx ]
; в регистре АХ получено слово аппаратной конфигурации
; биты содержание
; 0 наличие дисковых устройств
; 1 наличие сопроцессора
; 2-3 размер RAM
; 4-5 текущий видеорежим
; 6-7 число дисководов
; 8 наличие DMA контроллера
; 9-11 число RS232 портов
; 12 наличие игрового адаптера
; 14-15 число установленных принтеров
Что касается частотных параметров, то их проверка сопряжена с риском изменения из-за температурной или иной нестабильности. Особенно это касается частот" строчной и кадровой развертки видеотерминала. Достаточно стабильным являются временные параметры механической части (время передвижения головок) винчестера (ЖМД).