yara-ffi 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/yara/scan_result.rb +74 -0
- data/lib/yara/version.rb +1 -1
- data/lib/yara/yr_meta.rb +4 -1
- data/lib/yara/yr_rule.rb +1 -1
- data/lib/yara.rb +9 -16
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77c78c082eac821fd90e99808b1d944d7ac5e0a4c597339d46e9d9806cc61a17
|
4
|
+
data.tar.gz: 75a6e4cb0f1d9b6b89d611bfd615006b5f638532337a8a6b03d5e37bd697a6a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de69cea095663dc7a7fe66d896d846139328f3e0e47d07c3ad05340e9f99ee755311da3ec6ab1afc19ddda809fea1de04274fecf4404544c0e7ed48bde48e3de
|
7
|
+
data.tar.gz: c09131210c41e871d677b0779f2a736dad22c6ba1c32d3e155f1083bb4886b3d6d0815c293889a8da497b3af882fad5fb31d234c46733243cefc576c023ee964
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Yara
|
2
|
+
class ScanResult
|
3
|
+
RULE_MATCHING = 1
|
4
|
+
RULE_NOT_MATCHING = 2
|
5
|
+
|
6
|
+
META_FLAGS_LAST_IN_RULE = 1
|
7
|
+
|
8
|
+
META_TYPE_INTEGER = 1
|
9
|
+
META_TYPE_STRING = 2
|
10
|
+
META_TYPE_BOOLEAN = 3
|
11
|
+
|
12
|
+
RULE_IDENTIFIER = 1
|
13
|
+
METAS_IDENTIFIER = 3
|
14
|
+
|
15
|
+
attr_reader :callback_type, :rule
|
16
|
+
|
17
|
+
def initialize(callback_type, rule_ptr)
|
18
|
+
@callback_type = callback_type
|
19
|
+
@rule = YrRule.new(rule_ptr)
|
20
|
+
end
|
21
|
+
|
22
|
+
def rule_name
|
23
|
+
@rule.values[RULE_IDENTIFIER]
|
24
|
+
end
|
25
|
+
|
26
|
+
def rule_meta
|
27
|
+
metas = {}
|
28
|
+
reading_metas = true
|
29
|
+
meta_index = 0
|
30
|
+
meta_pointer = @rule.values[METAS_IDENTIFIER]
|
31
|
+
while reading_metas do
|
32
|
+
meta = YrMeta.new(meta_pointer + meta_index * YrMeta.size)
|
33
|
+
metas.merge!(meta_as_hash(meta))
|
34
|
+
flags = meta.values.last
|
35
|
+
if flags == META_FLAGS_LAST_IN_RULE
|
36
|
+
reading_metas = false
|
37
|
+
else
|
38
|
+
meta_index += 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
metas
|
42
|
+
end
|
43
|
+
|
44
|
+
def scan_complete?
|
45
|
+
callback_type == SCAN_FINISHED
|
46
|
+
end
|
47
|
+
|
48
|
+
def rule_outcome?
|
49
|
+
[RULE_MATCHING, RULE_NOT_MATCHING].include?(callback_type)
|
50
|
+
end
|
51
|
+
|
52
|
+
def match?
|
53
|
+
callback_type == RULE_MATCHING
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def meta_as_hash(meta)
|
59
|
+
name, string_value, int_value, type, _flags = meta.values
|
60
|
+
value = meta_value(string_value, int_value, type)
|
61
|
+
{ name.to_sym => value }
|
62
|
+
end
|
63
|
+
|
64
|
+
def meta_value(string_value, int_value, type)
|
65
|
+
if type == META_TYPE_INTEGER
|
66
|
+
int_value
|
67
|
+
elsif type == META_TYPE_BOOLEAN
|
68
|
+
int_value == 1
|
69
|
+
else
|
70
|
+
string_value
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/yara/version.rb
CHANGED
data/lib/yara/yr_meta.rb
CHANGED
data/lib/yara/yr_rule.rb
CHANGED
data/lib/yara.rb
CHANGED
@@ -2,22 +2,17 @@
|
|
2
2
|
|
3
3
|
require "ffi"
|
4
4
|
require "pry"
|
5
|
-
require_relative "yara/version"
|
6
5
|
require_relative "yara/ffi"
|
6
|
+
require_relative "yara/scan_result"
|
7
|
+
require_relative "yara/version"
|
7
8
|
|
8
|
-
# TBD
|
9
9
|
module Yara
|
10
|
-
|
10
|
+
SCAN_FINISHED = 3
|
11
11
|
|
12
|
-
|
13
|
-
CALLBACK_MSG_RULE_NOT_MATCHING = 2
|
14
|
-
CALLBACK_MSG_SCAN_FINISHED = 3
|
15
|
-
|
16
|
-
RULE_IDENTIFIER = 1
|
12
|
+
class Error < StandardError; end
|
17
13
|
|
18
14
|
def self.test(rule_string, test_string)
|
19
15
|
user_data = UserData.new
|
20
|
-
user_data[:number] = 42
|
21
16
|
scanning = true
|
22
17
|
results = []
|
23
18
|
|
@@ -38,14 +33,12 @@ module Yara
|
|
38
33
|
Yara::FFI.yr_compiler_get_rules(compiler_pointer, rules_pointer)
|
39
34
|
rules_pointer = rules_pointer.get_pointer(0)
|
40
35
|
|
41
|
-
result_callback = proc do |context_ptr,
|
42
|
-
|
43
|
-
|
44
|
-
case message
|
45
|
-
when CALLBACK_MSG_RULE_MATCHING
|
46
|
-
results << rule.values[RULE_IDENTIFIER]
|
47
|
-
when CALLBACK_MSG_SCAN_FINISHED
|
36
|
+
result_callback = proc do |context_ptr, callback_type, rule_ptr, user_data_ptr|
|
37
|
+
if callback_type == SCAN_FINISHED
|
48
38
|
scanning = false
|
39
|
+
else
|
40
|
+
result = ScanResult.new(callback_type, rule_ptr)
|
41
|
+
results << result if result.rule_outcome?
|
49
42
|
end
|
50
43
|
|
51
44
|
0 # ERROR_SUCCESS
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yara-ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Hoyt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- bin/setup
|
46
46
|
- lib/yara.rb
|
47
47
|
- lib/yara/ffi.rb
|
48
|
+
- lib/yara/scan_result.rb
|
48
49
|
- lib/yara/user_data.rb
|
49
50
|
- lib/yara/version.rb
|
50
51
|
- lib/yara/yr_meta.rb
|