16.39.10. function  SearchSign

function  SearchSign(ASign : string; ARel : integer; ALen : integer) : integer;
 
Основная функция анализатора. Производит поиск сигнатуры ASign начиная со смещения ARel в зоне длинной ALen.
 
ARel - смещение точки, с которой начинается поиск. Смещение отсчитывается с нуля, указание отрицательного смещения рассматривается как смещение от конца файла
 
ALen - длина. Указание нулевой длинны рассматривается как поиск от точки ARel до конца буфера. Указание длины, выходящей за пределы буфера не является ошибкой, в этом случае поиск будет производиться до конца буфера.
 
ASign - сигнатура. Сигнатура задается текстовой строкой, описывающей правила сигнатурного поиска. Сигнатура состоит из элементов, разделенных пробелами. Пробелы в начале и конце сигнатуры игнорируются.
 
Возвращаемое значение:
  • -1 - возвращается в случае, если заданную сигнатуру найти не удалось.
  • Смещение относительно начала буфера в случае успешного поиска. Важно: возвращаемое функцией смещение всегда считается относительно начала буфера, вне зависимости от значений ARel и ALen, которые уточняют зону поиска.
 
 
Поддерживаются следующие типы элементов сигнатуры:
 
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")