Архив задач

Антивирус 11 класс

Для выявления вредоносного кода некоторым антивирусом применяется только сигнатурный метод анализа, позволяющий выполнять поиск известных сигнатур в файле путем побайтового сравнения. Файл считается вредоносным при наличии в нем участка данных, точно совпадающего с одной из сигнатур. Реализация поиска сигнатур описана в функции CheckFile(), которая возвращает TRUE при отсутствии сигнатур в файле и FALSE в противном случае.


Си

Паскаль

/* ВХОДНЫЕ ПАРАМЕТРЫ:

* FNAME - имя анализируемого файла

* SIGNATURE - сигнатура (массив байтов)

* SIZE - размер сигнатуры в байтах

*

* ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

* TRUE - файл не содержит сигнатуры

* FALSE - файл содержит хотя бы одну
* сигнатуру

*/

bool CheckFile(char* fname,
char* signature,
int size)

{

FILE *fin=NULL;

char *buf=NULL;

int read, check_count=0;

buf=new char[size];

fin=fopen(fname, "rb");

if (!fin)

return false;

while(!feof(fin))

{

read=fread(buf, 1, size, fin);

if(read!=size)

break;

check_count=0;

for (int j=0; j<size; j++)

{

if (buf[j]==signature[j])

check_count++;

else

break;

}

if (check_count==size)

return false;

}

return true;

}

/* ВХОДНЫЕ ПАРАМЕТРЫ:

* FNAME - имя анализируемого файла

* SIGNATURE - сигнатура (массив байтов)

* SIZE - размер сигнатуры в байтах

*

* ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:

* TRUE - файл не содержит сигнатуры

* FALSE - файл содержит хотя бы одну
* сигнатуру

*/

function CheckFile (fname,
signature: string;
size: integer): boolean;

var

fin: file;

ch: char;

count_read, check_count, i: integer;

buf: string;

begin

assign(fin, fname);

reset(fin);

while true do

begin

buf:='';

count_read:=0;

for i:=1 to size do

begin

if (not eof(fin)) then

begin

read(fin, ch);

buf:=buf+ch;

count_read:=count_read+1;

end;

end;

if count_read <> size then

break;

check_count:=0;

for i:=1 to size do

begin

if(buf[i]=signature[i]) then

check_count:=check_count+1

else

break;

end;

if check_count=size then

begin

CheckFile:=false;

Exit;

end;

end;

close(fin);

CheckFile:=true;

end;


База сигнатур содержит две записи:

0x313132

0x3132

Проверка файла осуществляется последовательным вызовом функции CheckFile() для каждой сигнатуры из базы.

Какое количество файлов размером 7 байт, состоящих только из цифр от 0 (код 0x30) до 9 (код 0x39) включительно, может содержать хотя бы одну из указанных сигнатур хотя бы один раз, но успешно проходить проверку имеющимся антивирусом? Ответ обоснуйте.