summaryrefslogtreecommitdiff
path: root/src/analysis/scan/rule.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/rule.c')
-rw-r--r--src/analysis/scan/rule.c80
1 files changed, 34 insertions, 46 deletions
diff --git a/src/analysis/scan/rule.c b/src/analysis/scan/rule.c
index 638dae5..14a6d38 100644
--- a/src/analysis/scan/rule.c
+++ b/src/analysis/scan/rule.c
@@ -541,7 +541,6 @@ bool g_scan_rule_setup_backend(GScanRule *rule, GEngineBackend *backend, GScanCo
bool result; /* Statut à retourner */
size_t maxsize; /* Taille maximale des atomes */
GSearchPattern *pattern; /* Motif à intégrer */
- GScanOptions *options; /* Options d'analyse */
size_t i; /* Boucle de parcours */
/* Suivi des conditions de correspondance */
@@ -556,22 +555,42 @@ bool g_scan_rule_setup_backend(GScanRule *rule, GEngineBackend *backend, GScanCo
for (i = 0; i < rule->bytes_used && result; i++)
{
pattern = rule->bytes_locals[i];
- result = g_bytes_token_enroll(G_BYTES_TOKEN(pattern), context, backend, maxsize);
+ result = g_bytes_token_enroll(G_BYTES_TOKEN(pattern), backend, maxsize);
}
- g_engine_backend_warm_up(backend);
+ exit:
- /* Affichage éventuel de statistiques */
+ return result;
- options = g_scan_context_get_options(context);
+}
- if (g_scan_options_get_print_stats(options))
- g_engine_backend_output_stats(backend);
+/******************************************************************************
+* *
+* Paramètres : rule = règle de détection à considérer. *
+* backend = moteur d'analyse pour données brutes. *
+* *
+* Description : Récupère les identifiants finaux pour les motifs recherchés. *
+* *
+* Retour : Bilan de l'opération à renvoyer. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
- g_object_unref(G_OBJECT(options));
+bool g_scan_rule_define_pattern_ids(GScanRule *rule, GEngineBackend *backend)
+{
+ bool result; /* Statut à retourner */
+ size_t i; /* Boucle de parcours */
+ GSearchPattern *pattern; /* Motif à intégrer */
- exit:
+ result = true;
+
+ for (i = 0; i < rule->bytes_used && result; i++)
+ {
+ pattern = rule->bytes_locals[i];
+ result = g_bytes_token_build_id(G_BYTES_TOKEN(pattern), backend);
+ }
return result;
@@ -594,55 +613,24 @@ bool g_scan_rule_setup_backend(GScanRule *rule, GEngineBackend *backend, GScanCo
void g_scan_rule_check(GScanRule *rule, GEngineBackend *backend, GScanContext *context)
{
- GBinContent *content; /* Contenu à manipuler */
- vmpa2t start; /* Point de début du contenu */
- vmpa2t end; /* Point de fin du contenu */
- pending_matches_t matches; /* Suivi de correspondances */
- size_t i; /* Boucle de parcours #1 */
+ size_t i; /* Boucle de parcours */
GSearchPattern *pattern; /* Motif à intégrer */
- size_t k; /* Boucle de parcours #2 */
- match_area_t *area; /* Zone à initialiser */
- GScanMatch *match; /* Correspondance à mémoriser */
-
- content = g_scan_context_get_content(context);
-
- g_binary_content_compute_start_pos(content, &start);
- g_binary_content_compute_end_pos(content, &end);
-
- /* Consolidation des résultats */
+ GScanBytesMatches *matches; /* Correspondances établies */
for (i = 0; i < rule->bytes_used; i++)
{
- init_pending_matches(&matches, &start.physical, &end.physical);
-
pattern = rule->bytes_locals[i];
- g_bytes_token_check(G_BYTES_TOKEN(pattern), context, content, &matches);
-
- g_scan_context_prepare_full_match_registration(context, pattern, matches.used);
-
- for (k = 0; k < matches.used; k++)
- {
- area = &matches.areas[k];
-
- match = g_scan_bytes_match_new(pattern, content, area->start, area->end - area->start);
+ matches = g_scan_bytes_matches_new(pattern, context);
- if (area->has_mod_path)
- g_scan_bytes_match_remember_modifier_path(G_SCAN_BYTES_MATCH(match), area->mod_path_index);
+ g_bytes_token_check(G_BYTES_TOKEN(pattern), matches);
- g_scan_context_register_full_match(context, match);
- g_object_unref(G_OBJECT(match));
+ g_scan_context_register_full_matches(context, pattern, matches);
- }
-
- exit_pending_matches(&matches);
+ g_object_unref(G_OBJECT(matches));
}
- /* Sortie propre */
-
- g_object_unref(G_OBJECT(content));
-
}