Эвристические анализаторы кода
Эвристические анализаторы кода
Эвристическим анализатором кода называется набор подпрограмм, анализирующих код исполняемых файлов, памяти или загрузочных секторов для обнаружения в нем разных типов компьютерных вирусов. Рассмотрим универсальную схему такого кодоанализатора. Действуя в соответствии с этой схемой, кодоанализатор способен максимально эффективно задействовать всю информацию, собранную для тестируемого объекта.
Основные термины:
Событие – это совокупность кода или вызов определенной функции операционной системы, направленные на преобразование системных данных, работу с файлами или часто используемые вирусные конструкции.
Цепочка связных событий – это набор событий, которые должны быть выявлены в порядке их следования.
Цепочка несвязных событий – это набор событий, которые должны быть выявлены, но не обязательно в строгом порядке. Действия – набор цепочек связных или несвязных событий, для которых выполнены все условия.
Эвристическая маска – набор действий, выявленных при проверке файла.
Эвристическое число – порядковый номер первой из совпавших эвристических масок. События распознаются при помощи подпрограмм выявления событий, в которых могут использоваться также таблицы с данными. Остальные данные просто хранятся в массивах и не анализируются. Рассмотрим функциональную схему эвристического анализатора (рис. 6.1.).
Рис. 6.1
Эмулятор кода работает в режиме просмотра, то есть его основная задача – не эмулировать код, а выявлять в нем всевозможные события. События сохраняются в таблице событий по алгоритму:
if (Events[EventNumber]==0) Events[EventNumber]=++CountEvents;
где:
Events – массив событий;
EventNumber – номер регистрируемого события;
CountEvents – порядковый номер зарегистрированного события.Таким образом, в ячейку массива Events записывается порядковый номер для выявленного события. CountEvents при инициализации равен 0. После того, как эмулятор завершит свою работу, последовательно запускаются два преобразователя. Первый преобразователь заполняет массив действия, выбирая данные из массива событий и цепочек связных и несвязных событий по следующему алгоритму:
for(i=0;i<CountMaskEvrnrs;i++) {
if (MaskEvents[i][0]==0) {
for(j=2;j<MaskEvents[i][1];j++)
if(Events[MaskEvents[i][j]]==0) goto nextMask;
}
else
for(e=0,j=2;j<MaskEvents[i][1];j++) {
if(Events[MaskEvents[i][j]]==0 || Events[MaskEvents[i][j]]<e)
goto nextMask;
else e=Events[MaskEvents[i][j]];
}
Actions[i]=1;
nextMask:;
}где:
CountMaskEvents – число масок цепочек событий;
MaskEvents – двумерный массив цепочек связных и несвязных событий;
Actions – массив действия.Затем выполняется второй преобразователь, который выбирает данные из массива действия и цепочек эвристических масок и вычисляет эвристическое число по следующему алгоритму:
for(i=0;i<CountMaskHeurist;i++) {
for(j=1;j<MaskHeurist[i][0];j++)
if(Actions[MaskHeurist[i][j]]==0) goto nextMask1;
NumberHeurist=i+1;
break;
nextMask1:
}где:
CountMaskHeurist – число эвристических масок;
MaskHeurist – двумерный массив с эвристическими масками;
NumberHeurist – эвристическое число.Данный текст является ознакомительным фрагментом.