Я хочу закодировать Антивирус для обучения.Это будет основано на подписи.Я уже написал сканер, который просматривает все системные файлы и создает отображение памяти для каждого файла.Сейчас я пытаюсь получить двоичную подпись (в шестнадцатеричном формате) для каждого вредоносного файла (файла примеров), чтобы я мог сравнить его с созданной базой данных.В чем проблема сейчас?Я заметил, что коммерческие антивирусы, такие как, например, 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
}
Еще один вопрос: мне нужно сопоставить всю базу данных сигнатур в оперативной памяти, прежде чем я начну сравнивать и как?и что вы предлагаете подпись должна содержать?размер файла ... и т.д?любые другие предложения