PDA

Просмотр полной версии : Кажется, проблема с SearchSign в скриптах AVZ?



drmad
01.09.2009, 10:06
Доброе всем время суток!

Описание ситуции.

1. Создал тестовый файл с именем VIRUS.EX_ и содержимым 'MZ SIGNATURE'. В 16-ричном виде это: 4D 5A 20 53 49 47 4E 41 54 55 52.

2. Написал и выполнил в AVZ следующий скрипт:

begin
if LoadFileToBuffer('c:\virus.ex_') then AddToLog('ok') else AddToLog('failed');
AddToLog(IntToStr(SearchSign('4D 5A', 0, 2) ));
AddToLog(IntToStr(SearchSign('53 49 47 4E 41 54 55 52', 3, 8) ));
AddToLog(IntToStr(SearchSign('5A 4D', 0, 2) ));
FreeBuffer
end.

3. Получил неправильные (на мой взгляд) результаты:
ok
-1
-1
-1

По моему мнению, -1 должно быть только в последнем случае? Или я что-нибудь не так делаю?

P.S. Проверял на нескольких разных версиях AVZ, включая 4.32. Монопенисуально. :(

P.P.S. С материалами
http://www.z-oleg.com/secur/avz_doc/script_searchsign.htm и
http://www.z-oleg.com/secur/avz_doc/script_searchsignexample.htm знаком.

Зайцев Олег
01.09.2009, 11:27
Это не баг, это фича :) На самом деле вопреки моим надеждам этим движком никто почему то не пользовался, потому тонкости не документированы и не подвергались тщательным тестам...
1. AddToLog(IntToStr(SearchSign('4D 5A', 0, 2) )); - не работает потому, что зона поиска равна по размеру сигнатуре. Как оказалось, там контроль, что для поиска сигнатуры зона поиска должна быть хотя-бы на байт больше длинны искомого, т.е. AddToLog(IntToStr(SearchSign('4D 5A', 0, 3) )); сработает, равно как AddToLog(IntToStr(SearchSign('4D 5A', 0, 0) )); (нуль в длинне понимается как "искать до конца буфера"
2. Вторая конструкция не сработала по той-же причине - сигнатура по размеру равна буферу, а логика контроля AVZ требует, чтобы буфер был хотя-бы на байт длиннее сигнатуры (в файл можно добавить пробел в хвост и все заработает, или из сигнатуры убрать 1 байт последний)

Я не помню, откуда выросли эти ограничения "на еще 1 байт" - кажется, это как-то связано с поиском по маскам или с чем-то еще ... я записал это как багу и подправлю в следующей версии. При этом побайтный доступ к буферу естественно полный, т.е.


var
i : integer;
begin
if LoadFileToBuffer('c:\virus.ex_') then AddToLog('ok')
else AddToLog('failed');
for i := 0 to GetBufferSize - 1 do
AddToLog( IntToHex(GetBufferByte(i), 2) );
FreeBuffer;
end.

даст нам


ok
4D
5A
20
53
49
47
4E
41
54
55
52
45

drmad
01.09.2009, 11:50
Это не баг, это фича :)

Спасибо за ответ.


я записал это как багу и подправлю в следующей версии.

Замечательно. 8) А то "продвинутая" работа с AVZ планируется для студентов специальности КОИБАС, будут методички и т.п. Поэтому хотелось бы определенности.

Еще раз спасибо.

Зайцев Олег
01.09.2009, 13:33
Спасибо за ответ.



Замечательно. 8) А то "продвинутая" работа с AVZ планируется для студентов специальности КОИБАС, будут методички и т.п. Поэтому хотелось бы определенности.

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