Sha256: 6da861efcef452b8d6f9b50ecb934bca04f753e9c004100b74691512242c0a00

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

require "ffi"
require "pry"
require_relative "yara/ffi"
require_relative "yara/scan_result"
require_relative "yara/version"

module Yara
  SCAN_FINISHED = 3

  class Error < StandardError; end

  def self.test(rule_string, test_string)
    user_data = UserData.new
    scanning = true
    results = []

    Yara::FFI.yr_initialize

    compiler_pointer = ::FFI::MemoryPointer.new(:pointer)
    Yara::FFI.yr_compiler_create(compiler_pointer)
    compiler_pointer = compiler_pointer.get_pointer(0)

    error_callback = proc do |error_level, file_name, line_number, rule, message, user_data|
      # noop
    end

    Yara::FFI.yr_compiler_set_callback(compiler_pointer, error_callback, user_data)
    Yara::FFI.yr_compiler_add_string(compiler_pointer, rule_string, nil)

    rules_pointer =::FFI::MemoryPointer.new(:pointer)
    Yara::FFI.yr_compiler_get_rules(compiler_pointer, rules_pointer)
    rules_pointer = rules_pointer.get_pointer(0)

    result_callback = proc do |context_ptr, callback_type, rule_ptr, user_data_ptr|
      if callback_type == SCAN_FINISHED
        scanning = false
      else
        result = ScanResult.new(callback_type, rule_ptr)
        results << result if result.rule_outcome?
      end

      0 # ERROR_SUCCESS
    end

    Yara::FFI.yr_rules_scan_mem(
      rules_pointer,
      test_string,
      test_string.bytesize,
      0,
      result_callback,
      user_data,
      1,
    )

    while scanning do
    end

    results
  ensure
    Yara::FFI.yr_finalize
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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