Files
yara/docs
Wesley Shields 7fabd955ab Implement rule sets. (#1597)
This adds the ability to use rule sets just like we do with string sets.
Specifically, it enables conditions like the following:

5 of (a, b)
50% of (a*)

where "a" is an existing rule and "b*" is a wildcard rule identifier, which is
expanded out precisely as wildcard string identifiers are.

I chose to make OP_OF and OP_OF_PERCENT emit an argument which is the "type" of
set it is expected to match on. The two acceptable values are OF_STRING_SET and
OF_RULE_SET. When OF_STRING_SET is used then the references on the stack are
expected to be strings and OF_RULE_SET will check if the rules on the stack
match.

I added a yr_parser_emit_pushes_for_rules() which behaves similarly to the
string counterpart. The one big exception is that I can't use yr_rules_foreach
macro since that needs the terminating "null" rule which is not yet added, so
instead I have to iterate the rules manually using yr_arena_get_ptr() to walk
all the currently compiled rules.

* Stricter ordering of rule set in compiler.

Make sure that when we compile a new rule that any existing rule sets do not
match the new rule. Specifically we are making the following a compiler error:

rule a1 { condition: true }
rule b { condition: 1 of (a*) }
rule a2 { condition: true }

This is a compiler error because "a2" is defined after the usage of (a*) in rule
b.

There is still an edge case here. These rules compile:

rule a { condition 1 of (a) }
rule b { condition: 1 of (b*) }

In both cases those rules evaluate to false, which is in line with the behavior
of this rule:

rule c { condition: c }

Given that the behavior around rule sets matches the current behavior I think
this is acceptable.

* Add docs for rule sets.

* Implement hash table iterators.

* Remove old comment about linked list.

* Move variable declaration.

* Iterate over rules better.
2021-12-21 12:46:33 +01:00
..
2021-12-21 09:33:28 +01:00
2021-12-21 09:33:28 +01:00
2021-10-28 11:29:09 +02:00
2014-07-08 11:13:35 +02:00
2014-07-08 11:13:35 +02:00
2021-12-21 09:33:28 +01:00
2021-12-21 12:46:33 +01:00
2021-12-21 09:33:28 +01:00