function  SearchSign

function  SearchSign

Previous pageReturn to chapter overviewNext page

function  SearchSign(ASign : string; ARel : integer; ALen : integer) : integer;

 

Основная функция анализатора. Производит поиск сигнатуры ASign начиная со смещения ARel в зоне длинной ALen.

 

ARel - смещение точки, с которой начинается поиск. Смещение отсчитывается с нуля, указание отрицательного смещения рассматривается как смещение от конца файла

 

ALen - длина. Указание нулевой длинны рассматривается как поиск от точки ARel до конца буфера

 

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

 

Поддерживаются следующие типы элементов сигнатуры:

 

xx - байт должен быть равен xx, где xx - значение байта в шестнадцатеричном виде

Пример: "55 AA 45 21"

 

!xx- байт не равен xx, где xx - значение байта в шестнадцатеричном виде

Пример: "55 AA !45 21"

 

? - байт может иметь любое значение (по сути это пропуск байта при анализе). Указание данного элемента в начале и конце сигнатуры не имеет смысла, хотя не является ошибкой

Пример: "55 ? AA ? ? 45 21"

 

?nn - пропуск при анализе nn байт (по сути условие - "nn байт имеют произвольное значение"), где nn - количество пропускаемых байт в десятичном виде. Пример: 55 AA ?5 45 21 - данная сигнатура аналогична сигнатуре 55 AA ? ? ? ? ? 45 21

 

*xx - пропуск нескольких байт (от нуля до достижения границы анализируемой области) до обнаружения байта, равного xx. Пример: 55 AA *FF 25 14

 

~xx,yy - производит проверку условия <байт буфера> AND yy = xx. Данная операция позволяет сравнивать заданные биты в байте, а не весь байт целиком. Пробелы в данной конструкции (до и после запятой) недопустимы, т.к. пробел является разделителем элементов в сигнатуре

Пример: "55 ~0A,0F" - в данном случае расшифровка сигнатуры звучит как "первый байт равен 55, а младшая тетрада второго равна 0A" (выделение младшей тетрады происходит за счет операции "байт AND 0F")

 

См. также: LoadFileToBuffer, FreeBuffer, GetBufferSize

 

Пример: см. в разделе "Пример реализации сигнатурного искателя"