Кодирование Антивируса с использованием техники на основе сигнатур - PullRequest
2 голосов
/ 07 апреля 2011

Я хочу закодировать Антивирус для обучения.Это будет основано на подписи.Я уже написал сканер, который просматривает все системные файлы и создает отображение памяти для каждого файла.Сейчас я пытаюсь получить двоичную подпись (в шестнадцатеричном формате) для каждого вредоносного файла (файла примеров), чтобы я мог сравнить его с созданной базой данных.В чем проблема сейчас?Я заметил, что коммерческие антивирусы, такие как, например, Kaspersky, выбирают сигнатуру файла из любого места внутри бинарного файла.Теперь предположим, что я обнаружил новый вредоносный файл и выбрал смещение 0x8766, которое имеет значение 0x4F в качестве сигнатуры для этого вредоносного файла.Теперь, если я хочу проверить файл с размером samll, где смещение 0x8766 не существует в этом маленьком файле ... это будет проблемой ?!Вот пример кода, представляющего способ, которым я иду:

hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file

if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++; 
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 )
i++;

if(i==3){
// the file is malicious
}

Еще один вопрос: мне нужно сопоставить всю базу данных сигнатур в оперативной памяти, прежде чем я начну сравнивать и как?и что вы предлагаете подпись должна содержать?размер файла ... и т.д?любые другие предложения

1 Ответ

1 голос
/ 08 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...