Sha256: b6a9d4218e718a7abf0eee031bff48d42d7be07e33ef2d85fe537fc2f9ee6542

Contents?: true

Size: 1.55 KB

Versions: 2

Compression:

Stored size: 1.55 KB

Contents

module Yara
  class ScanResult
    RULE_MATCHING     = 1
    RULE_NOT_MATCHING = 2

    META_FLAGS_LAST_IN_RULE = 1

    META_TYPE_INTEGER = 1
    META_TYPE_STRING  = 2
    META_TYPE_BOOLEAN = 3

    RULE_IDENTIFIER  = 1
    METAS_IDENTIFIER = 3

    attr_reader :callback_type, :rule

    def initialize(callback_type, rule_ptr)
      @callback_type = callback_type
      @rule = YrRule.new(rule_ptr)
    end

    def rule_name
      @rule.values[RULE_IDENTIFIER]
    end

    def rule_meta
      metas = {}
      reading_metas = true
      meta_index = 0
      meta_pointer = @rule.values[METAS_IDENTIFIER]
      while reading_metas do
        meta = YrMeta.new(meta_pointer + meta_index * YrMeta.size)
        metas.merge!(meta_as_hash(meta))
        flags = meta.values.last
        if flags == META_FLAGS_LAST_IN_RULE
          reading_metas = false
        else
          meta_index += 1
        end
      end
      metas
    end

    def scan_complete?
      callback_type == SCAN_FINISHED
    end

    def rule_outcome?
      [RULE_MATCHING, RULE_NOT_MATCHING].include?(callback_type)
    end

    def match?
      callback_type == RULE_MATCHING
    end

    private

    def meta_as_hash(meta)
      name, string_value, int_value, type, _flags = meta.values
      value = meta_value(string_value, int_value, type)
      { name.to_sym => value }
    end

    def meta_value(string_value, int_value, type)
      if type == META_TYPE_INTEGER
        int_value
      elsif type == META_TYPE_BOOLEAN
        int_value == 1
      else
        string_value
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
yara-ffi-2.0.1 lib/yara/scan_result.rb
yara-ffi-2.0.0 lib/yara/scan_result.rb